[OS] 주메모리 관리

Chris Kim·2024년 10월 24일

공룡책

목록 보기
11/14

출처 : 인프런 강의

1. 배경지식

  • 프로세스랑 실행중인 프로그램을 말한다. 다른 말로 말하자면 주메모리에 적재된 상태다. 메모리는 자신의 주소를 갖는 커다란 바이트의 배열로 구성되어 있다.

  • CPU는 프로그램 카운터를 사용하는 메모리로부터 명령어를 선택해서 메모리에 load, store 한다.

  • Memory Space: 우리는 각 프로세스가 분리된 메모리 공간을 가지게 해야한다. base 레지스터와 limit 레지스터 쌍은 유효한 주소 범위를 결정하여 제공한다.

  • 메모리 공간 보호: CPU에서 메모리에 접근할 때, 위에서 말한 레지스터 쌍이 나타내는 범위 내인지 점검한다.

  • 주소 바인딩: 프로그램은 바이너리 파일 형태로 디스크에 위치한다. 실행을 위해선 프로그램을 반드시 메모리로 가져와야한다. 그리고 프로세스의 주소는 00000000에서 시작하지 않는다. 소스파일 내의 주소는 symbolic 하며, 컴파일러는 보통 symbolic 주소를 재배치 가능 주소에 bind한다.
    링커 혹은 로더는 재배치가능 주소를 절대 주소로 다룬다.

  • 논리적 vs 물리적 주소 공간
    주소: 논리적 주소란 CPU에 의해 생성된 주소이며, 물리적 주소와는 상관이 없다.
    주소 공간: 논리적 주소 집합은 사용자의 프로그램에 의해 생성되며, 물리적 주소 공간은 논리적 주소 공간에 대응하는 관계를 가진다.

  • MMU(Memory Management Unit)
    논리적 주소를 물리적 주소에 매핑하는 하드웨어 기기. 재배치 레지스터를 base 레지스터로 가지고 있다.

  • Dynamic Loading
    항상 프로그램이나 데이터 전체를 물리적 메모리에 적재되어있어야 할까? 이 부담을 줄이는 것이 Dynamic Loading이다. 이를 통해 루틴은 호출 될때만 메모리에 적재된다. 로더는 필요한 루틴의 적재를 위해 호출되며, 프로그램의 주소 테이블에 이 변경사항을 반영한다.

  • Dynamic Linking & Shared Libraries
    DLL : 본문서 참고.

2. Contiguous Memory Allocation

메모리는 보통 OS, 유저 프로세스 부분으로 나뉜다. 그리고 유저 프로세스는 복수가 동시에 메모리에 존재한다.
연속 메모리 할당에서, 각 프로세스는 단일 섹션의 메모리로 구성되며, 이는 다음 프로세스를 포함하는 섹션과 연속적이다.

  • Memory Allocation
    Variable-Partition: 다른 크기의 프로세스를 메모리에서 적재하고 할당 해제하면서 hole이 생긴다. 이 문제를 해결하는 방법은 세 가지가 있다. First-Fit, Best-Fit, Worst-Fit이 있다.

  • Fragmentation(단편화 문제): 본문서 참고

3. Paging

어떤 물리적 주소의 불연속을 허용하고, 외부 단편화와 compaction 문제를 회피할 수 있다.

  • 기본적 방법
    물리적 메모리를 고정된 사이즈의 블록으로 나누고(frames), 논리적 주소를 같은 사이즈 단위의 블록으로 나눈다(pages). 즉 논리적 주소 공간은 물리적 주소 공간과 완전히 분리되어, 관계가 없어진다.



PTBR - page-table base register
PTBR은 메모리에 있는 페이지 테이블을 가리킨다. 이로써 컨텍스트 스위치를 더 빠르게 할 수있으나 메모리 접근에 걸리는 시간은 더 길어진다.(두 번의 메모리 접근이 필요하기 때문이다.)
그래서 Translation Look-aside Buffer가 도입된다.(TLB)

TLB hit: 페이지 number가 TLB에 있는 경우
TLB miss: TLB에 페이지 number가 없는 경우
hit ratio: 페이지 number가 TLB hit일 확률 이를통해 EAT(Effective Memory-Access Time)을 계산할 수 있다.

  • 페이징에서의 메모리 보호
    각 프레임의 protection bit를 통해 달성된다. 페이지 테이블의 엔트리에 추가된 valid-invalid bit(1bit)를 통해 구현된다.

  • Shared page
    이를 이용해서 sharing common code를 구현할 수 있다.

4. 페이지 테이블의 구조

(1) Hierarchical Paging
논리적 주소 공간을 여러 테이블로 나누어버린다.

(2) Hashed Page Table
32비트 이상의 주소 공간을 다룰때 유용하며, 해시 테이블을 통해 가상 페이지 넘버를 관리한다

(3) Inverted Page Table
pid를 추가해준다.

5. 스와핑(Swapping)

스와핑은 모든 물리적 주소 공간에 대해서, 시스템 상 물리적 메모리를 초과할 수 있게 만든다.
이를 이용해서 시스템 내에서 멀티프로그래밍 정도를 훨씬 증가시킬 수 있다.
프로세스의 명령어와 데이터는 실행을 위해 메모리에 적재되어 있어야 한다. 하지만 프로세스 혹은 프로세스의 일부는 일시적으로 메모리 바깥에 저장되었다가, 필요할때 다시 돌려놓을 수 있다.

Standard Swapping

Swapping with Paging
이 페이지를 활용하면 적은 수의 페이지로 스와핑을 구현할 수 있다.

profile
회계+IT=???

0개의 댓글