메모리 관리
메모리 관리의 목적
여러 프로세스가 동시에 실행될 수 있도록 메모리 공간을 제공
시스템 사용자들을 위해 만족할 만한 수준의 성능을 제공
각 프로그램의 리소스를 보호
프로세스 사이에 있는 메모리 공간을 공유
프로그래머를 위해 되도록 메모리 공간의 어드레싱을 투명하게 할 것
Memory Management Unit(MMU)
Logical Address(논리 주소(가상 주소: Virtual Address))를 물리적인 주소(Physical Address)로 변경하는 하드웨어 장치
Logical Address: CPU에 의해서 생성, CPU에서 MMU로 보내는 주소
Physical Address: MMU에서 메모리로 보내는 주소
Dynamic Linking
Dynamic Linking: 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하지 않고 해당 모듈의 주소만을 가지고 있다가, 런타임에 실행 파일과 라이브러리가 메모리에 위치될 때 해당 모듈의 주소로 가서 필요한 것을 들고 오는 방식
Static Linking: 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하는 방식을 말하며 링커에 의해 이루어진다
동적연결에서 라이브러리를 부르는 곳마다 stub이 생성된다.
stub은 자기 자신을 루틴 주소와 루틴의 실행으로 대신한다.
D*L은 라이브러리에 유용하다. 시스템은 shared libraries라고 불린다.
Swapping
메모리에 적재되어 있지만 현재 사용하지 않는 프로세스를 관리
프로세스를 일시적으로 메모리에서 하드디스크(backing store)로 swap하고(swap-out), 다시 계속 실행하기 위해 메모리로 돌려보냄(swap-in)
MMU의 재배치 레지스터를 사용하기 떄문에 적재 위치는 메모리의 빈공간 어디에나 가능하다.
장점: 메모리 활용도 높고 효율적
단점: 프로세스 크기가 크면 backing store의 입출력 부담이 크다.
Fragmentation(단편화)
메모리 공간 중 일부가 사용 못하게 되는 부분
내부 단편화: 할당된 공간 - 요구된 공간 (이들 두 크기 사이에 남는 부분). 이미 할당된 공간은 요청 메모리 공간보다 크다.
외부 단편화: 유효 공간을 모두 합치면 충분한 공간이 되지만, 그것들이 너무 작은 조각으로 분산(메모리가 너무 많은 수의 작은 조각)
Compaction: hole들을 한곳으로 모으는 방식. 연속 메모리 할당 방식의 한계 해결
Dynamic Storage-Allocation
외부 단편화 문제: 메모리의 빈 공간은 많은데 사이즈가 작은 빈 공간이 많아 다른 프로세스를 적재할 수 없는 현상
Hole: available 메모리의 블록. 다양한 크기의 hole은 메모리 상에서 흩어져 있다.
First-fit: 지금 프로세스가 필요로 하는 크기보다 더 큰 hole을 만나면 할당
Best-fit: 프로세스가 필요로 하는 크기보다 큰것들 중에 가장 작은 hole을 할당.
Worst-fit: 가장 큰 hole을 할당
Segmentation
프로세스를 논리적 단위인 세그먼트(function, method, object, stack.....등등)를 서로다른 크기의 집합으로 나누는 기법
세그먼트들의 크기가 서로 다르기 때문에 메모리를 페이징 기법처럼 미리 분할해 둘 수 없다.
메모리에 적재될 때 빈 공간을 찾아 할당하는 사용자 관점의 가상 메모리 관리 기법.
각 세그먼트 별로 길이 값을 가지고 있어 내부 단편화를 해결할 수 있다.
- 논리적인 주소: <segment-number, offset>
segment-number: segment table의 색인(index)
offset: segment 안에서의 위치
- segment table: 2차원 physical address를 mapping한다
base: 해당 segment의 시작 physical 주소
limit: segment의 길이
Segment-table base register(STBR): 메모리 상의 segment table의 메모리
Segment-table length register(STLR): segment table의 크기. segment의 개수
protection: segment로 분리되어 있어서 보호에 유리
Paging
페이지가 연속적인 물리 메모리 공간에 들어가야하는 제약을 해결하기 위한 방법이다.
외부 단편화를 해결할 수 있다. 페이지 단위를 작게하면 내부 단편화(Internal fragmentation) 또한 해결가능
페이지에 공간을 할당한 후, 남는 공간이 적어지기 때문에 그 만큼 page mapping 과정이 증가할 수 있다.
physical memory를 frame이라는 고정된 크기의 블록으로 나눈다.
logical memory를 pages라는 고정된 크기의 블록으로 나눈다.
모든 free frame을 추적하여 크기 N인 pages를 실행시키기 위해, N free frame을 찾아야 한다.
logical address를 physical address로 변경하기 위해 page table을 설치한다. -> 1:1 mapping
page number: page table에 대한 인덱스, page table access할때 사용
page offset: page table 내에서의 변위
page table은 메인 메모리에 있다.
Page-table base register(PTBR): page table을 가리킨다.
Page-table length register(PTLR): page table의 크기를 지칭
이런 scheme는 2개의 메모리 accesses가 필요하다
이런 문제를 해결하기 위해(two memory access problem) translation look-aside buffers(TLBs) 이용
TLB에는 virtual page number(VPN)와 physical frame number(PFN) 정보가 쌍으로 존재하며, 이를 사용해 주소변환을 하도록 도와주는 하드웨어 cache.
이를 사용해 CPU는 paging 기법으로 주소변환을 할 때 TLB를 먼저 확인하여 TLB에 정보가 존재한다면 해당 정보로 빠르게 주소 변환 가능.
주소 변환을 위해 메모리에 접근하는 일이 없으므로 주소 변환이 빠르게 수행
출처
Operating System Concept 9th Edition