세그먼테이션 (Segmentation)

세그먼테이션(Segmentation)은 운영체제의 메모리 관리 기법 중 하나로, 프로세스를 논리적 단위인 세그먼트로 나누어 관리하는 방식이다.

세그먼테이션의 기본 개념을 이해하기 위해, 먼저 프로그램의 구조를 생각해보자.
일반적인 프로그램은 코드 영역, 데이터 영역, 스택 영역 등 서로 다른 목적을 가진 영역들로 구성된다.
세그먼테이션은 이러한 논리적 단위들을 각각의 세그먼트로 관리한다.

Sengmenation
Source: https://www.geeksforgeeks.org/segmentation-in-operating-system/

세그먼테이션의 주요 구성 요소와 작동 방식

  1. 세그먼트 테이블(Segment Table):

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    struct SegmentTableEntry {
        uint32_t base;      // 세그먼트의 시작 주소
        uint32_t limit;     // 세그먼트의 크기
        bool present;       // 메모리 존재 여부
        struct {
            bool read;      // 읽기 권한
            bool write;     // 쓰기 권한
            bool execute;   // 실행 권한
        } protection;
    };
    
  2. 주소 변환 과정:
    논리적 주소는 다음과 같이 구성된다:

    1
    2
    
    논리적 주소 = <세그먼트 번호, 오프셋>
    물리적 주소 = 세그먼트 기준 주소 + 오프셋
    

    예를 들어, 주소 변환을 수행하는 코드를 다음과 같이 구현할 수 있습니다:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
    def address_translation(segment_number, offset):
        # 세그먼트 테이블 엔트리 조회
        segment = segment_table[segment_number]
    
        # 범위 체크
        if offset > segment.limit:
            raise SegmentationFault("Offset exceeds segment limit")
    
        # 접근 권한 체크
        if not segment.protection.read:
            raise ProtectionFault("No read permission")
    
        # 물리적 주소 계산
        physical_address = segment.base + offset
        return physical_address
    

주요 특징

  1. 가변 크기 분할:

    • 프로세스를 다양한 크기의 세그먼트로 나눈다.
    • 세그먼트 크기는 프로그램의 논리적 단위(예: 함수, 데이터 테이블)에 따라 결정된다.
  2. 세그먼트 테이블:

    • 각 세그먼트의 정보를 저장하는 테이블을 사용한다.
    • 주요 정보: 세그먼트의 기본 주소(base address)와 한계(limit)
  3. 주소 변환:

    • 논리 주소는 세그먼트 번호와 오프셋으로 구성된다.
    • 세그먼트 테이블을 참조하여 물리 주소로 변환한다.
  4. 메모리 보호:

    • 세그먼트 단위로 접근 권한을 설정할 수 있어 보안성이 향상된다.
  5. 공유와 보호:

    • 세그먼트 단위로 프로세스 간 메모리 공유가 가능하다.
    • 코드 세그먼트 등을 여러 프로세스가 공유할 수 있다.

장점

  1. 사용자 관점에 가까운 메모리 관리
  2. 내부 단편화 감소
  3. 동적 크기 조정 가능
  4. 효율적인 메모리 공유

단점

  1. 외부 단편화 발생 가능
  2. 세그먼트 테이블 관리 오버헤드
  3. 복잡한 메모리 할당 및 해제 과정

참고 및 출처