세그먼테이션 (Segmentation)
세그먼테이션(Segmentation)은 운영체제의 메모리 관리 기법 중 하나로, 프로세스를 논리적 단위인 세그먼트로 나누어 관리하는 방식이다.
세그먼테이션의 기본 개념을 이해하기 위해, 먼저 프로그램의 구조를 생각해보자.
일반적인 프로그램은 코드 영역, 데이터 영역, 스택 영역 등 서로 다른 목적을 가진 영역들로 구성된다.
세그먼테이션은 이러한 논리적 단위들을 각각의 세그먼트로 관리한다.
세그먼테이션의 주요 구성 요소와 작동 방식
세그먼트 테이블(Segment Table):
주소 변환 과정:
논리적 주소는 다음과 같이 구성된다:예를 들어, 주소 변환을 수행하는 코드를 다음과 같이 구현할 수 있습니다:
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
주요 특징
가변 크기 분할:
- 프로세스를 다양한 크기의 세그먼트로 나눈다.
- 세그먼트 크기는 프로그램의 논리적 단위(예: 함수, 데이터 테이블)에 따라 결정된다.
세그먼트 테이블:
- 각 세그먼트의 정보를 저장하는 테이블을 사용한다.
- 주요 정보: 세그먼트의 기본 주소(base address)와 한계(limit)
주소 변환:
- 논리 주소는 세그먼트 번호와 오프셋으로 구성된다.
- 세그먼트 테이블을 참조하여 물리 주소로 변환한다.
메모리 보호:
- 세그먼트 단위로 접근 권한을 설정할 수 있어 보안성이 향상된다.
공유와 보호:
- 세그먼트 단위로 프로세스 간 메모리 공유가 가능하다.
- 코드 세그먼트 등을 여러 프로세스가 공유할 수 있다.
장점
- 사용자 관점에 가까운 메모리 관리
- 내부 단편화 감소
- 동적 크기 조정 가능
- 효율적인 메모리 공유
단점
- 외부 단편화 발생 가능
- 세그먼트 테이블 관리 오버헤드
- 복잡한 메모리 할당 및 해제 과정