목차
세그먼테이션
세그먼테이션은 메모리를 논리적 단위로 분할하고, 프로세스가 사용하는 각 세그먼트를 독립적으로 관리하는 접근 방식입니다.
세그먼테이션 작동 방식
세그먼테이션에서는 프로세스의 메모리 공간을 논리적 단위, 즉 세그먼트로 나누고, 각 세그먼트는 고유한 주소 범위를 가집니다. 이 구조는 프로세스의 코드, 데이터, 스택, 힙 등 다양한 부분을 세그먼트로 구분하고, 이들을 독립적으로 관리합니다.
•
세그먼트
◦
세그먼트는 메모리의 논리적 단위로, 각 세그먼트는 고유한 크기와 속성을 가집니다. 일반적으로 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트 등이 있습니다.
◦
예를 들어, 프로세스가 실행되면 코드 세그먼트는 프로그램 코드를 포함하고, 데이터 세그먼트는 변수나 데이터 구조를 포함하며, 스택 세그먼트는 함수 호출 스택을 관리합니다.
여기서 '고유한 속성을 가진다'는 것은 특정 권한을 가지고 있다는 것을 의미합니다.
예를 들어, 코드 세그먼트는 읽기만 가능하며, 쓰기 기능이 제한되어 있어 해당 메모리 영역에서의 쓰기를 제한합니다.
•
세그먼트 테이블
◦
세그먼테이션에서는 세그먼트 테이블을 사용하여 각 세그먼트의 시작 주소, 크기, 접근 권한 등을 관리합니다. 세그먼트 테이블은 가상 주소를 세그먼트 번호와 세그먼트 내의 오프셋으로 분리하고, 물리적 주소로 변환합니다.
◦
예를 들어, 세그먼트 테이블은 세그먼트 번호 1이 물리적 주소 0x1000에서 시작하고, 크기는 4KB라는 정보를 가지고 있습니다. 프로세스가 가상 주소 0x1002에 접근할 때, 세그먼트 번호 1의 시작 주소에 오프셋 2를 더하여 물리적 주소 0x1002를 얻습니다.
•
주소 변환
◦
세그먼테이션에서는 가상 주소를 세그먼트 번호와 세그먼트 내의 오프셋으로 분리하고, 이를 통해 물리적 주소로 변환합니다. 세그먼트 테이블을 통해 해당 세그먼트의 시작 주소를 찾아, 오프셋을 더해 물리적 주소를 계산합니다.
세그먼테이션 장단점
세그먼테이션의 장점
세그먼테이션은 프로세스의 구조와 논리적 흐름을 반영하기 때문에, 메모리 관리의 유연성을 제공합니다. 또한, 각 세그먼트를 독립적으로 관리할 수 있어, 프로세스 간의 격리와 보호가 용이합니다. 이는 멀티태스킹 환경에서 프로세스 충돌을 방지하고, 보안을 강화하는 데 도움이 됩니다.
페이징과 비교하자면, 내부 단편화가 발생하지 않는다는 특징도 있습니다.
세그먼테이션의 단점
세그먼테이션의 단점 중 하나는 외부 단편화입니다.
세그먼트는 크기가 유연하기 때문에, 메모리 공간에 빈 틈이 생길 수 있습니다. 이로 인해 메모리 공간을 비효율적으로 사용할 수 있으며, 메모리 재배치가 필요할 수 있습니다. 또한, 주소 변환이 페이징에 비해 복잡할 수 있습니다.
세그먼테이션 실제 예시
세그먼트 테이블 예시
세그먼트 번호 | 시작 주소 | 크기 | 접근 권한 |
0 | 0x1000 | 4KB | RWX |
1 | 0x2000 | 8KB | RW |
2 | 0x3000 | 16KB | R |
•
세그먼트 번호 0 은 코드 세그먼트로, 시작 주소는 0x1000이며 크기는 4KB입니다. 접근 권한은 RWX(읽기, 쓰기, 실행)가 가능합니다.
•
세그먼트 번호 1 은 데이터 세그먼트로, 시작 주소는 0x2000이며 크기는 8KB입니다. 접근 권한은 RW(읽기, 쓰기)입니다.
•
세그먼트 번호 2 는 스택 세그먼트로, 시작 주소는 0x3000이며 크기는 16KB입니다. 접근 권한은 R(읽기)입니다.
주소 변환 과정
세그먼테이션에서는 가상 주소를 세그먼트 번호와 세그먼트 내의 오프셋으로 나누고, 이를 통해 물리적 주소로 변환합니다.
가상 주소 0x1234에 대해 세그먼트 테이블을 사용하여 물리적 주소를 계산하는 과정을 살펴보겠습니다
1.
세그먼트 번호 추출
•
가상 주소 0x1234에서 세그먼트 번호를 추출합니다. 여기서는 상위 비트를 사용하여 세그먼트 번호를 결정합니다. 세그먼트 번호는 0으로 결정되었다고 가정합니다.
세그먼트 번호를 결정하는 부분은 상위 비트 한 개, 두 개, 혹은 세 개를 사용하여 결정할 수 있습니다.
2.
세그먼트 테이블 조회
•
세그먼트 번호 0에 해당하는 세그먼트의 정보를 세그먼트 테이블에서 찾습니다. 시작 주소는 0x1000이며, 크기는 4KB입니다.
3.
오프셋 계산
•
가상 주소에서 세그먼트 내의 오프셋을 계산합니다. 0x1234의 하위 비트를 사용하여 오프셋을 계산하면, 0x234(십진수 564)가 됩니다.
4.
물리적 주소 계산
•
세그먼트의 시작 주소에 오프셋을 더해 물리적 주소를 계산합니다. 0x1000(시작 주소) + 0x234(오프셋) = 0x1234가 됩니다. 이는 물리적 주소로서, 해당 주소의 실제 메모리 위치를 나타냅니다.