💡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 사용하자! (이에 대해선 다른 글에서)
'IT > 컴퓨터구조와 운영체제' 카테고리의 다른 글
[Memory management] Swapping (0) | 2024.05.23 |
---|---|
[Memory management] Paging (0) | 2024.05.13 |
[운영체제란] 운영체제의 역할, HW의 support (0) | 2024.04.21 |
[Scheduling in multiple CPU] SQMS, MQMS, CFS, O(1), BFS (0) | 2024.04.20 |
[Scheduling in single CPU] FIFO, SJF, STCF, RR, MLFQ, Lottery, Stride, CFS (5) | 2024.04.17 |