운영체제 - Segmentation

eucartio·2024년 5월 22일

운영체제

목록 보기
12/19

Segmentation

  • Segment는 특정 길이의 주소 공간의 연속적인 부분
  • 각각의 Segment는 실제 메모리의 다른 부분에 위치한다.
    • Base/Bounds Register 역시 각각의 Segment들에 존재한다.

Motivation of Segmentation

  • Base-and-Bounds 접근 방식은 비효율적
    → Segmentation 발전 배경
    • 실제 메모리의 공간은 차지하지만 아무런 데이터가 존재하지 않는 Free Space가 많다.
    • 실제 메모리 공간에 맞지 않는 큰 크기의 주소 공간을 갖는 프로세스는 실행이 어렵다.
    • 라이브러리와 같은 코드는 각각의 프로세스 "Program Code"에 존재하여 중복이 발생할 수 있다.

  • 주소 공간을 Segment(Stack, Heap, Code)로 나눠 실제 메모리에 독립적, 불연속적으로 할당
    → Segmentation
    • Free Space가 실제 메모리 공간을 낭비하지 않는다.
    • 큰 크기의 주소 공간을 갖는 프로세스도 실행할 수 있다.
    • 프로세스 간의 코드, 라이브러리 공유가 가능하다.

Implementation: Basic

  • Explicit Approach
    • 가상 주소 상위 몇 비트 공간만 잘라서 Segment로 사용

  • Virtual Address = Segment ID + Offset

  • Segment ID를 통해서 어떤 Segment인지 찾은 후, Base + Offset 데이터에 접근

Implementation: Stack

  • Stack은 아래로 증가
  • 추가적인 HW의 지원 필요
    • HW는 Segment의 증가 방향 확인
    • 1: Positive Direction, 0: Negative Direction

  • Stack Segment의 Base Register는 최상위 주소를 가리킨다.
    • Offset은 항상 Negative (2의 보수)

Implementation: Code Sharing

  • Segment는 주소 공간의 프로그램들과 공유될 수 있다.
    • Code Sharing은 추가적인 HW 지원을 통해 현재 시스템에서도 여전히 사용
  • 추가적인 HW 지원은 Protection Bits 형태를 위해 필요
    • 읽기, 쓰기, 실행 권한을 나타내기 위해 Segment마다 약간의 추가 비트 필요
  • 다수의 프로세스가 Code Segment를 공유
    • Code Segment는 쓰기 불가능

Other Ways

  • 주소가 어떤 Segment를 참조하는지 HW가 알 수 있는 방법: Implicit Approach

    • PC에서 생성 = Code Segment
    • Stack이나 Base Pointer 기반의 주소 = Stack Segment
    • 이외의 주소 = Heap Segment
  • 상위 두 비트가 사용 중인 경우

    • 세 가지 Segment만 사용 가능
      • 주소 공간의 한 Segment는 사용 불가능
      • 상위 한 비트만 사용하는 다른 시스템
    • Code와 Heap이 같은 Segment로 사용된다.

Memory Layout

OS Support: Problem of Segmentation

  • Context Switch 발생 시 OS의 역할
    • Segment 레지스터(Base/Bounds)는 저장, 복원되어야 한다.
    • 각각의 프로세스마다 가상 주소 공간이 존재하고, OS는 프로세스가 재실행 되기 전에 이러한 레지스터를 정확하게 설정했는지 확인해야 한다.
  • Segment의 크기 수정 방법
    • malloc() - 추가 Heap 영역 요청
    • sbrk() - 데이터 Segment 영역 확장
  • 실제 메모리의 빈 공간 관리 방법
    • OS는 해당 Segment에 대한 실제 메모리의 여유 공간을 찾을 수 있어야 한다.

External Fragmentation

  • 실제 메모리 여유 공간의 작은 구멍이 새 Segment 할당을 어렵게 만든다.

    • 예를 들어 24KB 공간이 존재하지만, 이 공간이 연속적인 Segment에 존재하지 않는 경우 OS는 24KB 프로세스 요청을 만족할 수 없다.
  • Compaction: 실제 메모리 내의 기존 Segment를 재배열

    • Compaction은 비싸다.
      • 프로세스 중단, 데이터 복사, Segment 레지스터 값 변경
        메모리 접근 과다
  • Paging

    • 고정된 크기의 Segment(일반적으로 4KB)를 사용하여 External Fragmentation을 제거
    • 여전히 Internal Fragmentation 문제 존재

Internal Fragmentation

  • 그림 우측과 같이 Paging 기법을 통해 메모리를 동일한 단위의 크기로 할당한다.
  • 만약 해당 단위보다 작은 크기의 프로세스가 메모리에 할당된다면, 그 차이만큼의 낭비가 발생한다.
    Internal Fragmentation

Granularity of Segmentation

Coarse-Grained (Granularity)

  • Coarse-Grained는 Segmentation을 적게 하는 것, 즉 큰 단위로 메모리를 분배하는 것이다.
  • 관리 비용이 감소하지만 효율 역시 감소한다.

Fine-Grained (Granularity)

  • Fine-Grained는 반대로 작은 단위로 메모리를 분배하는 것, 즉 Segmentation을 많이 하는 것이다.
  • 초창기 시스템에서 유연성을 증가하기 위해 사용되었다.
  • 성능이 증가하지만 관리 비용 역시 증가한다.
  • 많은 Segment를 지원하기 위해 Segment Table이 있는 HW 지원이 필요하다.

0개의 댓글