Theory
운영체제
Memory Management

Memory Management

메모리는 Logical Address와 Physical Address로 나뉠 수 있다.

  • ✔ Logical Address(Virtual Address)
    • 프로세스마다 독립적으로 가지는 주소
    • 각 프로세스마다 0번지부터 시작
    • CPU가 보는 주소는 Logical Address
  • ✔ Physical Address : 메모리에 실제 올라가는 위치
ℹ️

주소 바인딩 : 주소를 결정하는 것
Symbolic Address -> Logical Address -> Physical Address

메모리가 결정되는 시간

메모리가 결정되는 시간은 Logical Address를 Physical Address로 변환하는 시간이다.

  • ✔ Compile Time Binding
    • 물리적 메모리 주소가 컴파일 시 알려짐
    • 시작 위치 변경시 재컴파일
    • 컴파일러는 절대 코드(absolute code)를 생성
  • ✔ Load Time Binding
    • Loader 책임하에 물리적 메모리 주소 부여
    • 컴파일러가 재배치가능코드(relocatable code)를 생성
  • ✔ Run Time Binding
    • 수행이 시작된 이후에도 프로세스의 메모리 상 위치를 옮길 수 있음
    • CPU가 주소를 참조할 때마다 biding을 점검(address mapping table)
    • 하드웨어적인 지원이 필요

MMU

MMU(Memory Management Unit)는 CPU와 메모리 사이의 주소 변환을 담당하는 하드웨어 장비이다. logical address를 physical address로 변환한다.

  • ✔ MMU Scheme

사용자 프로세스가 CPU에서 수행되며 생성해내는 모든 주소값에 대해 base register(=relocation register)를 더한다.

ℹ️

예를 들어서 변수의 메모리 주소가 1000이고 base register가 10000이라면 실제 메모리 주소는 11000이 된다.

  • ✔️ user program

사용자 프로그램은 logical address만을 다룬다. 실제 physical address는 볼 수 없으며 알 필요가 없다.

  • ✔ Relocation Register (Base Register)
    • 프로세스의 주소가 시작되는 주소를 가지고 있다.
  • ✔ Limit Register
    • 프로세스가 사용할 수 있는 메모리의 크기를 제한한다.
    • 예를 들어서 다른 프로세스의 메모리를 침범하지 않도록 한다.

메모리 관련 용어

  • ✔ Dynamic Loading
    • 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질 때 메모리에 load하는 것
    • memory utilization 향상 (필요한 메모리만 할당하기 때문에 메모리 효율성이 향상)
    • 페이징 기법과 다이나믹 로딩은 다른 개념
  • ✔ Memory Overlays
    • 초창기 컴퓨터 시스템에서 실제 필요한 정보만을 올리는 방법
    • Dynamic Loading과의 차이
      • Memory Overlays는 프로그램 사이즈가 메모리보다 큰 경우 부분 부분 나누어서 실행하는 것을 말함
        • 프로그래머가 직접 일일이 신경쓰면서 구현해야하기 때문에 구현이 복잡함
      • Dynamic Loading은 그때 그때 필요한 부분만 메모리에 올리는 것을 말함
        • 라이브러리를 활용해서 구현하기 때문에 구현이 쉬움
  • Swapping (opens in a new tab)
    • 프로세스를 일시적으로 메모리에서 backing store로 쫓아내는 것
    • Swapping이 효율적으로 동작하기 위해선 Rum Time Binding의 지원이 필요
  • ✔ Static Linking
    • 라이브러리가 실행 파일 코드에 포함
    • 실행 파일의 크기가 커지고 라이브러리가 모든 프로세스에 올라와서 메모리 낭비
  • ✔ Dynamic Linking
    • 라이브러리의 코드가 있는 곳을 가리키는 **링크(stub)**를 실행 파일에 포함
    • 운영체제의 도움이 필요
    • 윈도우에서는 DLL, 리눅스에서는 Shared Object(SO) 파일로 사용

외부 단편화 내부 단편화

  • ✔ 외부 단편화 : 프로그램의 크기가 메모리의 분할 크기보다 작은 경우 발생
  • ✔ 내부 단편화 : 프로그램의 크기가 메모리의 분할 크기보다 큰 경우 발생

분할 방식

불연속 할당

  • ✔ 페이징(Paging)
  • ✔ 세그멘테이션(Segmentation)
    • 프로그램의 주소 공간을 **의미있는 공간(Code, Stack, Heap)**으로 나누는 것
      • 의미 있는 공간이라는 뜻은 Code 공간에 만약에 함수가 하나 있다면 그 함수도 어떠한 의미단위가 될 수 있음
      • 크기가 균일하지 않음

페이징(Paging)

  • 프로그램의 주소 공간을 같은 페이지로 자르는 것
  • 물리적 주소 공간도 같은 크기의 페이지로 나눔
    • 페이지 프레임 : 페이지가 들어갈 수 있는 공간
  • 주소 변환이 복잡하다는 단점이 있음 (주소를 페이지별로 변환해야 하기 때문)
  • 페이지 테이블을 사용해서 주소 변환을 함

페이지 테이블

  • 페이지 주소를 프레임 주소로 변환하는 데 사용
  • p는 페이지 번호를 나타내고 d는 오프셋을 나타냄
    • p로 페이지 base address를 찾고 d로 해당 프레임 내에서 실제 주소를 찾는다고도 볼 수 있음
  • 이 때 p가 페이지 테이블에 없는 것을 페이지 폴트라고 함
  • page table은 메모리에 존재하기 때문에 메모리에 접근하기 위해선 페이지 테이블을 참조 👉 실제주소를 들고 와서 메모리를 참조 해야하기 때문에 2번의 메모리 Access가 필요
  • Page-table base register(PTBR)가 page table의 주소를 가르킴
  • Page-table length register(PTLR)는 페이지 테이블의 길이를 나타냄
  • 속도 향상을 위해 accociative register라는 translation look-aside buffer(TLB)라는 하드웨어(캐싱)를 사용함
    • TLB에 없는 경우는 TLB miss라고 하며, 이 때는 메모리에 접근하여 페이지 테이블을 찾아야 함
    • page table에서는 순차적으로 찾기 page를 찾기 때문에 탐색이 불필요 하지만 TLB는 일부만 캐싱하고 있는거기 때문에 탐색을 해야함
Two Level Page Table

현대 컴퓨터는 32 bit address를 사용한다. 이 때 2^32(4GB)의 메모리를 가지고 있다고 가정할 때 페이지 사이즈가 4KB라면 1M(100만)개의 page table entry가 필요하다. 각 page entry가 4 byte라면 각 프로세스(각 프로세스들이 각각 독립된 가상 메모리 공간을 가지고 있기 때문)당 4MB의 page table이 필요하다. 그러나 대부분의 프로그램은 4G의 주소 공간 중 지극히 일부만 사용하므로 page table의 공간이 심하게 낭비되게 된다.


이러한 문제를 해결하기 위해 Two Level Page Table이라는 방법을 사용한다.
바깥쪽 페이지 테이블은 전체 논리적인 메모리 크기만큼 페이지를 가지고 있고, 안쪽 페이지 테이블은 실제 사용하는 페이지만큼만 가지고 있다.

  • p1 : outer page table의 index
  • p2 : outer page table의 page에서의 변위