IT/컴퓨터구조와 운영체제

[Memory management] Memory virtualization, Dynamic relocation, Segmentation

kykyky 2024. 5. 1. 11:15

💡Memory virtualization & Address Space - for Abstraction

 

OS는 physical memory를 virtualize하여,

각 프로세스가 전체 메모리를 전부 사용하는 것처럼 보이게 한다.

 

이를 통해 process 간의 isolation을 보장하며, time과 space 면에서 메모리 관리의 효율이 높아진다.

 

 

💡1. Dynamic Relocation: HW base

 

 

프로세스 하나가 allocation의 unit이다. 

 

✅Address translation

physical address =  해당 프로세스의 base + virtual address

단, 0 ≤ virtual address < bounds

 

프로그램이 실행을 시작하면, 이 프로세스를 physical memory의 어디에 load할지 OS가 결정하는 것이다.

 

✅OS support

프로세스가 실행을 시작했을 때

OS는 새 Address space를 위한 physical memory 상의 빈 공간, 즉 free space를 찾기 위해 free list를 탐색한다.

 

프로세스가 종료되었을 때 

OS는 free list에 메모리를 다시 넣는다.

 

context switch가 발생했을 때

기존 프로세스의 base & bounds를 해당 프로세스의 PCB에 저장하고, 

새 프로세스의 base & bounds로 restore한다. 

 

segmentation fault 발생 시를 대비해 exception handler 있어야 함 

 

✅문제점: Internal fragmentation

한 프로세스의 stack과 heap이 그리 크지 않으면, 그 프로세스에게 할당된 physical memory에서 stack과 heap 사이 공간은 그냥 낭비되어 버린다.

※ 낭비 공간은 allocated space 내부에 있다.

 

💡2. Segmentation

 

프로세스의 segment 하나씩이 allocation의 unit이다. 

 

각 segment는 physical memory 상의 각기 다른 위치에 있으며, 각 semgent마다 base & bounds를 가진다. 

 

✅Address translation

physical address =  해당 segment의 base + 해당 segment 내에서의 offset

 

How to Refer to specific segment

14자리 2진수 형태인 address에서,

맨 앞의 두 자리는 이 address가

속하는 segment,

그 뒤의 12자리는 이 address의 해당 segment 내에서의 offset

를 의미한다.

 

 

위와 같은 address가 주어졌을 때 HW는 아래 과정을 통해 해당 address의 메모리에 접근한다.

(실제 코드인 게 아니라 pseudo version이다.) 

 

이때 HW는 이 segment가 자라는 방향을 확인하여 처리한다.

 

✅Segmentation fault

특정 segment 에 있는 address로 이 segment의 어딘가를 refer하려 하면,

HW는 이 address가 out of bounds임을 감지하고, OS는 segmentation fault를 일으킨다. 

 

✅Share segment between address space

- code, heap, stack segment 중 code만 가능.

  ∵ code는 not writable       vs.       나머지는 writable -> 프로세스 실행 중에 수정될수 있음

- 구현: Protection bit (r/w/x permission을 나타냄) by HW 

 

✅Coarse-grained & Fine-grained segmentation

Coarse-grained 각 process마다 code, heap, stack segment가 하나씩만 있음

- 요즘은 이거 많이씀. (∵ less costly) 

 

Fine-grained 각 process마다 code, heap, stack segment가 여러개 있을수 있음

- 하지만 segment table가 필요하고 costly

 

✅문제점: External Fragmentation

free space가 있더라도, 그것이 연속적이지 않고 분산돼 있으면, 결국 낑겨넣는 것이 불가능하므로 segment를 allocate할 수 없다는 문제가...

eg) free space가 총합 24kB라 해도, 매우 분산되어 있으면, 20kB의 segment를 allocate는 불가능... 

※ 낭비 공간은 allocated space 외부에 있다.

 

야매 해결책: Compaction

physical memory 상의 segment를 재배열 -> make big free space

  - 근데 너무 costly함.

 

근본적 해결책: paging

segment마다 크기가 제각각인게 문제이므로, paging을 통해 고정적 memory unit 사용하자! (이에 대해선 다른 글에서)