개요
- 스택과 힙 사이의 공간은 사용되지 않더라도 주소 공간을 물리 메모리에 재배치 할때 물리 메모리를 차지함
- 베이스와 바운드 레지스터 방식은 메모리 낭비가 심하고 주소 공간이 물리 메모리 보다 큰 경우 실행이 매우 어려움 (유연성 😵
세그멘테이션: Base / Bound 의 일반화
- MMU 안에 오직 하나의 베이스와 바운드 쌍만 존재하는 것이 아니라, 주소 공간의 논리적인 세그먼트(코드, 스택, 힙) 마다 베이스와 바운드 쌍이 존재함
- 세그먼트는 특정 길이를 가지는 연속적인 주소 공간임
- 세그멘테이션을 사용하면 운영체제는 각 세그멘트(코드, 스택, 힙)를 물리 메모리의 각기 다른 위치에 제공할 수 있음)
예시
- 위 그림에서는 사용 중인 메모리에만 물리 공간이 할당 되고, 사용되지 않은 영역이 많은 대형 주소 공간을 sparse address space 라 정의 함
- 세그먼트 지원을 위한 MMU 하드웨어는 각 세그멘트마다 베이스와 바운드 레지스터 집합을 가지고 있음
세그먼트 폴트
세그먼트 사용 시스템에서 불법적인 주소 접근 시 발생함, 이 용어는 세그멘트에 대한 지원이 전혀 없는 컴퓨터에서도 여전히 사용되고, 이 경우네는 오류 원인을 알 수도 없음
- 세그먼트 재배치 예시
- 코드
- 가상 주소 100번지는 코드 세그멘트에 속하고 오프셋이 100
- 힙
- 가상 주소 4200번지는 힙 세그멘트에 속하지만 오프셋은 104 (4200 - 4096)
- 힙 영역은 4KB 에서 시작
- 가상 주소 4200번지는 힙 세그멘트에 속하지만 오프셋은 104 (4200 - 4096)
- 코드
세그먼트 종류의 파악
- 하드웨어는 주소 변환을 위해 세그멘트 레지스터를 사용함, 가상 주소가 어느 세그멘트를 참조하는지, 그 세그멘트 안에서 오프셋은 얼마인지를 어떻게 알수 있는가
- 가상 주소의 최상위 몇 비트를 기준으로 주소 공간을 여러 세그멘트로 나누기 여기서는 2비트
- VAX/VMS 시스템에서 사용됨
- 세그멘트 종류를 나타내는데 최상위 2비트를 사용하고 주소 공간에는 세 개의 세그멘트만 존재하기 때문에 지정 가능한 세그멘트 하나는 미사용으로 남음 주소공간의 1/4를 사용하지 못함
- 일부 시스템은 코드와 힙을 하나의 세그멘트에 저장하고 세그멘트 선택을 위해 1비트만 사용함
스택
- 다른 세그멘트들과 달리 반대 방향으로 확장됨
- 가상주소 16KB ~ 14KB
- 따라서 오프셋값을 더하는 방식이 아닌 다른 방식의 변환이 필요함
- 베이스와 바운드 값 뿐 아니라 하드웨어는 세그멘트가 어느 방향으로 확장하는지도 알아야함
- 양의 방향 1, 음의 방향 0
공유 자원
- 메모리를 절약하기 위해 때로는 주소 공간들 간에 특정 메모리 세그멘트를 공유하는 것이 유용함
- 세그멘트마다 protection bit 을 추가하여 세그멘트를 읽거나 쓸 수 있는지 혹은 세그멘트의 코드를 실행 시킬 수 있는지를 나타냄
- 특히 코드 공유가 일반적이며 현재도 광범위 하게 사용되고 있음
소단위 대 대단위 세그멘테이션
- (코드,스택,힙) 만을 지원하는 시스템 세그멘테이션 단위를 대단위 (coarse-grained) 라고 생각할 수 있음
- 일부 초기 시스템은 주소 공간을 작은 크기의 공간으로 잘게 나누는 것이 허용되었기 때문에 fine-grained 세그멘테이션 이라고 부름
운영체제의 지원
- 세그멘테이션에서 일반적으로 생길 수 있는 문제는 물리 메모리가 빠르게 작은 크기의 빈 공간들로 채워지는 것
- 작은 빈 공간들은 새로이 생겨나는 세그멘트에 할당하기도 힘듦. 이를 외부 단편화 (external fragmentation) 이라 함
'운영체제' 카테고리의 다른 글
[OSTEP-18] Introduction to Paging (1) | 2023.12.26 |
---|---|
[OSTEP-17] Free Space Management (0) | 2023.12.26 |
[OSTEP-15] Address Translation (1) | 2023.12.26 |
[OSTEP-14] Memory API (0) | 2023.12.26 |
[OSTEP-13] Address Spaces (1) | 2023.12.26 |