개발공부/OS

[Chapter-7] Memory Management

tae_98 2024. 8. 10. 16:01

-이대 반효경 교수님 강의 기반으로 작성되었습니다-

 

logical vs physical

  • logical add
    • ps마다 독립적으로 가지는 주소 공간
    • cpu가 보는 주소
  • Physical add
    • 메모리에 실제 올라가는 위치

 

주소 바인딩 

= symbolic ==> Logical ==> Physical

  • Compile time binding
    • 물리적 메모리 주소 컴파일시
    • absolute code 생성
    • 요즘 거의 안쓰임
  • Load time binding
    • Loader 책임하에 물리적 메모리 주소 부여
    • relocatable code (비어있는곳 어디든 올라갈 수 있음)
  • Execution time binding(run time binding)
    • 실행 도중에 주소가 바뀔 수 있음.
    • cpu가 주소를 참조할 때 마다 binding 점검 ==> 하드웨어적인 지원이 필요
      • 지원 by MMU = 논리적 주소 --> 물리적 주소

 

  • Dynamic Loading
    • 루틴이 불려질 때 메모리에 load
    • 프로그램 자체에서 구현 가능
  • Overlays
    • ps에서 메모리에 필요한 부분만 올림
  • Swapping
    • ps를 메모리 ==> 하드 디스크로 쫓아냄
    • swap in, swap out
      • 중기 스케줄러가 관리
      • 우선순위 기반 알고리즘
      • execution time binding에서는 빈 메모리 아무곳에 올리기 가능
  • Dynamic Linking
    • Linking을 실행 시간까지 미루는 기법
    • static linking
      • 라이브러리가 실행 파일 코드에 포함
      • 실행 파일이 커짐
    • Dynamic linking
      • 라이브러리가 실행시 연결
      • 라이브러리 루틴의 위치를 찾기위한 stub 배치
      • os 도움 필요

Allocation of Physical Memory

  • os 상주 영역 : interrupt vector와 함께 낮은 주소 영역 사용
  • 사용자 ps영역 : 높은 주소 영역
    • 사용자 ps 영역 할당 방법
      • contiguous allocation : 그대로 올리기
        • fixed partition
          • 분할당 하나의 프로그램 적재
          • 융통성이 없다
        • variable partition
          • 프로그램 크기 고려하여 할당 ==> 관리 기법 필요
          • 외부 조각 발생
      • Hole
        • = 가용 메모리 공간
        • 메모리 여러곳에 흩어져 있음
      • Dynamic Storage-Allocation Problem
        • 적절한 hole 찾기
        • first-fit(먼저 찾은거), best-fit(가장 맞는거), worst-fit(가장 큰거)
          • first fit 이 실험적으로 가장 좋다
      • Compaction
        • 외부조각 해결법
        • 메모리 몰고 hole을 모아 큰 block만들기
        • 비용이 많이든다.
    • noncontiguous allocation : 잘라올리기 (paging, segmentation, paged Segmentation)
      • paging
        • ps의 가상 메모리를 동일 사이즈 page로 나눔 ==> noncontiguous하게 저장
        • 일부는 하드에 일부는 메모리에
        • page table을 사용해서 변환 (logical ==> physical)
        • 외부조각 안생기나 내부조각 발생가능
      • page table 향상ver
        • table을 메인 메모리에
        • page table base reg 가 페이지 테이블을 가리킴
        • page table length register 가 테이블 크기 보관
        • 속도향상 : associative reg, TLB 사용 (고속의 hw 캐시)
      • associative reg
        • page table중 일부가 associative reg에 보관
        • TLB는 문맥교환때 flush
      • Two-Level Page table
        • page table을 page로 구성
        • 사용되지 않는 주소의 outer page table 엔트리 값을 null로 만듦
      • Multilevel Paging and Performance
        • 주소 공간이 더 커지면 필요
        • page table이 메모리에 실려서 더 많은 메모리가 필요
        • TLB를 통해 메모리 접근 시간을 줄임 (크게 오버헤드가 들지 않는다)
      • Memory Protection
        • 페이지 테이블 각 entry마다
        • protection bit : page의 연산에 대한 접근 권한
        • valid : 해당 주소 frame에 그 ps를 구성하는 유효한 내용이 있다.
        • Invalid : ps가 안사용하거나 swap area에 내려가 있다.
      • Inverted Page table
        • ps마다 가 아닌 ps마다 딱 하나 page table이 존재
        • but 테이블 전체를 탐색해야함 ==> associative reg 사용 but 비쌈
      • shared Page
        • 같은 프로그램을 다른 프로세스로 돌리면 코드는 같음
          • shared code = read-only 로 하나의 코드만 메모리에 올림
          • shared code는 모든 ps의 logical address space에서 동일한 위치에 있어야함
      • Private code and data
        • 각 ps들이 독자적으로 메모리에 올림

Segmentation

= code, data, stack 부분이 하나씩의 세그먼트

= logical unit ( main(), function, stack, ...)

  • 아키텍쳐(Hw)
    • 논리주소를 번호, 오프셋 으로 나눈다.
    • segment table : base(시작 위치), limit(길이)
    • Segment table base reg : 물리적 메모리에서 테이블 위치
    • Segment table length reg : 프로그램이 사용하는 segment 수
    • protection : 각 seg별 protection bit가 있음 (valid, r/w/exe권한)
    • sharing : 의미 단위 이어서 paging보다 낫다
    • allocation : first fit, best fit, 외부조각 발생 ==> seg의 약점

Paging + Segmentation

segment table entry = segment를 구성하는 page table의 base address

- 먼저 seg 후 seg별로 paging 수행

- segment table에서 base address 대신 seg의 page table 시작위치 저장

- bound 값 대신 seg 개수 저장