Notice
Recent Posts
Recent Comments
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

topcue

[OS] Segmentation 본문

Operating System

[OS] Segmentation

topcue 2021. 9. 3. 17:05

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 등의 전략이 존재하는데, 이는 다음 챕터에서 다룬다.


'Operating System' 카테고리의 다른 글

[OS] Paging  (0) 2021.09.03
[OS] Free Space  (0) 2021.09.03
[OS] Address Space & Traslation  (0) 2021.09.03
[OS] Scheduling  (0) 2021.09.03
[OS] LDE  (0) 2021.09.03
Comments