Problems
Base & Bounds register를 이용해 relocate를 쉽게 구현할 수 있었다. 하지만 free된 공간을 비효율적으로 관리한다는 문제가 있다.
그래서 segment라는 개념이 등장했다.
Segment
MMU에 한 쌍의 base bound register를 저장하는 게 아니라, address space의 logical segment마다 base bound register 쌍을 할당하는 것이 segmentation의 개념이다.
이때 segment는 그냥 address space에서 연속적으로 존재하는 특정 길이의 공간을 의미한다. 이 segment들은 CODE, STACK, HEAP과 같이 논리적으로 구분된다.
위 그림처럼 physical memory에 각 segment들을 독립적으로 배치할 수 있다.
segmentation을 이용해 unused address space(sparse address space)를 잘 수용할 수 있게 되었다.
이제 MMU는 segmentation을 위해 base bounds register 세 쌍을 저장해야 한다.
address translate 관점에서 보면, H/W는 base 주소에 offset을 더해서 물리 주소인 segment에 접근할 수 있다.
- Segmentaion Fault
정해진 segmentation을 벗어나 접근하면 segmentation fault가 발생한다.
주소가 bound를 벗어난 것을 확인하면 trap으로 프로세스를 중단한다.
Segment 구분
- explicit approach
어떤 segment이고, offset이 얼마인지 나타내기 위해 virtual address의 상위 몇 비트를 활용한다.
예를 들어 위 그림처럼 14비트가 있으면, 최상위 2비트로 어떤 영역인지 나타내고(01: heap), 나머지 12비트로 offset을 나타낼 수 있다.
그러면 H/W는 base register의 값에 offset을 더해서 Physical memory에 접근할 수 있다.
또한 offset은 bound check에 용이하다.
// MMU
// get top 2 bits of 14-bit VA
Segment = (VirtualAddress & SEG_MASK) >> SEG_SHIFT
// now get offset
Offset = VirtualAddress & OFFSET_MASK
if (Offset >= Bounds[Segment])
RaiseException(PROTECTION_FAULT)
else
PhysAddr = Base[Segment] + Offset
Register = AccessMemory(PhysAddr)
- implicit approach
Segment address가 생성된 방법을 이용해 segment를 구분하는 방법도 있다.
예를 들어 Program Counter에 의해 만들어졌다면 Code segment, Stack pointer를 기반으로 만들어졌으면 Stack segment, 둘 다 아니면 Heap segment로 분류한다.
- What About The Stack?
stack도 address space의 구성 요소 중 하나이다. 근데 Stack은 높은 주소에서 낮은 주소 방향으로 쌓인다.
그래서 address translation 방식도 달라야 하며, segment가 어떤 방향으로 자라는지 확인하기 위해 H/W의 추가적인 도움이 필요하다.
위 그림은 간단하게 grow 방향에 대한 flag를 추가한 모습이다.
- Support for Sharing(for Protection)
이번에는 이어서 protection을 추가했다.
Execute 권한이 없는데 읽으려 하면 H/W가 exception을 발생시킨다.
Coarse-grained vs Fine-grained Segmentation
우리는 주소 공간을 비교적 크고 조잡하게(coarse) 구분하는 Coarse-grained Segmentation으로 생각한다. (예: code, stack, heap)
그러나 일부 초기 시스템은 보다 유연하여 주소 공간이 더 세분화 된 Fine-grained Segmentation이었다. 많은 수의 세그먼트를 관리하려면 segment table이 필요하다.
OS Support
Segmentation의 구현으로 발생하는 새로운 이슈들이 있다. 먼저 context switching을 할 때 OS의 역할이다. 프로세스는 각자 자신 고유의 virtual address가 있으므로, OS는 프로세스가 다시 run 할 때 주소를 잘 매칭해줘야 한다.
두번째는 free space를 관리하는 것이다. OS는 free된 공간을 찾아서 다시 사용할 수 있도록 해야 한다. 또 이전까지는 segment들이 같은 크기를 갖는다는 가정이 있었다.
이제는 중간중간 free된 공간이 많이 생기는 external fragmentation이 발생할 수 있다. free된 공간이 연속하도록 rerange 하면 compact한 상태가 된다. 이 rerange는 프로세스를 멈추고 OS가 메모리를 통째로 복사해서 옮길 수 있는 권한이 필요하며, 오버헤드가 발생한다.
free-list management에는 first-fit, best-fit, worst-fit 등의 전략이 존재하는데, 이는 다음 챕터에서 다룬다.
Uploaded by Notion2Tistory v1.1.0