Dynamic Relocation(Base and Bounds)
단점
- 프로세스별 address space가 contiguous 해야 함 -> 프로세스 사이사이 비는 공간 wasted!
- heap이랑 stack은 자라니까, 사이에 큰 공간이 필요함 -> wasted!

5. Segmentation
정의
code, Data, heap, stack별로 각각 base와 bounds를 가지게 하면 어떨까?
Top 2 bits(보통 4개니까) -> segment 지정 (physical BASE로 변환)
나머지 bits -> offset
Segmentation Table 필요 -> 각 process별로 MMU에서 관리

Code

장점
- 각 segment가 독립적으로 위치할 수 있음(process 전체가 contiguous하지 않아도 됨)
- 각 segment가 독립적으로 커졌다 작아졌다 할 수 있음(stack, heap)
- Read / Write / Execute 등의 권한을 독립적으로 관리할 수 있음
- segment를 공유할 수도 있음
- each segment에 대해 dynamic relocation 가능
단점
- 각 segment는 contiguous해야 한다. -> 공간이 조금조금씩만 남아서, 새로운 segment가 들어오지 못할 수도 있음 (큰 돌로 어항을 채운다고 생각) (= external fragmentation)
-> 오른쪽처럼 compact하게 정리할 수도 있지만, 그 방법은 overhead가 너무 크다

external fragmentation?
남은 공간의 크기는 충분한데, 연속적으로 남아있지 않아서, 할당을 못하는 상황
internal fragmentation?
필요한 것보다 더 큰 공간을 할당해줘서, 낭비되고 있는 상황
example

첫번째 load
0x2010에서 2 -> stack이므로 Physical BASE : 0x1600
offset은 0x2010에서 2를 제외한 0x0010
-> 0x1600 + 0x0010 = 0x1610
두번째 load
1 -> heap이므로 0x0400
-> 0x400 + 0x010 = 0x410
세번째 load
1 -> heap이므로 0x0400
0x0400 + 0x0100 = 0x500