[운영체제] 14. Segmentation
Reference - Operating Systems: Three Easy Pieces
https://pages.cs.wisc.edu/~remzi/OSTEP/
Segmentation
Dynamic relocation에서의 Base and Bound 방식 address translation은 비효율적이 많다. - base와 bound 사이의 큰 사이즈의 free space가 physical memory를 차지하며, 주소 공간이 physical memory와 맞지 않을 때 실행하기 어렵다.
Address translation에서 이를 해결할 수 있는 Segmentation에 대해 알아보겠다.
segmentation은 CPU의 MMU에 base, bound가 하나만 존재하는 것이 아닌, (base, bound) pair로 segment를 표현한다.
이때 segment는 code, stack, heap으로 구성된다. 이러한 방식을 통해 heap, stack 사이의 공간을 낭비하지 않도록 한다.
먼저 segmentation은 top few bits를 활용해 어떤 segment인지를 표시한다.
앞의 두 비트를 segment table로 떼서 어떤 segment 비트인지 확인한 후, physical memory의 어떤 segment에 offset을 주소로 활용할 것인지 찾는다. 이때 pa = segment bit를 제외한 offset + base다.
heap은 정방향으로, stack은 backward로 채워진다.
이때 extra hardware support가 필요하다. 먼저 1비트짜리 grows positive 비트를 사용하는데, 1이면 code와 heap, 0이면 stack이다.
또한 같은 코드를 쓰는 프로그램의 메모리 공유를 지원하기 위해 read, write, 실행여부 등을 나타내는 hardware support도 필요하다. 이를 protection bit라 한다. protection bit로 허용된 작업 이외의 것을 시도하면 OS가 예외처리한다.
이또한 segment table에서 protection bit을 확인해서 허용될 경우에만 physical memory로 mapping한다.
Fragmentation
segmentation의 문제는 External Fragmentation이 발생한다는 것이다.
프로세스가 종료되면 malloc, free를 반복하며 memory에 빈공간들이 생기는데, 이러한 파편적인 물리공간의 합은 충분하더라도 연속적인 주소공간이 없어서 메모리를 할당하지 못할 수 있다.
남은 메모리 내 데이터를 옮겨 빈공간을 만들 수 있지만(= called memory compaction), 그 과정은 프로세스를 멈추고, 데이터를 copy하고, segment register value를 change해야하기에 overhead가 매우 크다.