6-2. 세그멘테이션 (Segmentation)
1. 세그멘테이션의 개념과 배경
운영체제에서 메모리 관리는 매우 중요한 부분입니다. 효율적인 메모리 관리는 시스템의 성능을 향상시키고, 여러 프로세스가 메모리를 공유하며 동시에 실행될 수 있도록 해줍니다. 이전 포스트에서 다룬 페이징(Paging) 기법은 메모리를 고정 크기의 페이지로 분할하여 관리하는 방식이었습니다. 세그멘테이션(Segmentation)은 이와는 다른 방식으로 메모리를 관리하는 기법으로, 프로그램의 논리적인 구조를 반영하여 메모리를 분할합니다.
세그멘테이션의 기본적인 아이디어는 프로그램을 논리적인 의미 단위, 즉 세그먼트(Segment)로 나누어 메모리를 할당하고 관리하는 것입니다. 각 세그먼트는 코드, 데이터, 스택 등 프로그램의 특정 부분을 나타냅니다. 예를 들어, 한 프로그램은 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트를 가질 수 있습니다. 각 세그먼트는 서로 다른 크기를 가질 수 있으며, 프로세스마다 이러한 세그먼트의 집합을 가질 수 있습니다. 이러한 유연성은 페이징에 비해 세그멘테이션의 주요 특징 중 하나입니다.
페이징이 물리적인 메모리 주소 공간을 균일한 크기의 페이지로 분할하는 반면, 세그멘테이션은 프로그램의 논리적인 구조를 기반으로 메모리를 분할합니다. 이는 프로그래머가 코드, 데이터, 스택과 같은 논리적 단위로 프로그램을 구성하는 방식과 일치하며, 메모리 보호 및 공유를 더 유연하게 관리할 수 있게 해줍니다.
2. 세그멘테이션의 동작 방식
세그멘테이션에서 메모리 접근은 논리 주소(Logical Address)를 통해 이루어집니다. 논리 주소는 세그먼트 번호(Segment number)와 오프셋(Offset)으로 구성됩니다. 세그먼트 번호는 접근하려는 세그먼트를 식별하고, 오프셋은 세그먼트 내의 특정 위치를 나타냅니다.

논리 주소가 주어지면, 운영체제는 세그먼트 테이블(Segment Table)을 사용하여 물리 주소로 변환합니다. 각 프로세스는 자신의 세그먼트 테이블을 가지고 있으며, 이 테이블은 각 세그먼트에 대한 정보를 저장합니다. 세그먼트 테이블은 다음과 같은 정보를 포함합니다.
- 세그먼트의
기저 주소(Base Address): 해당 세그먼트가 메모리에 실제로 저장된 시작 주소입니다. - 세그먼트의
한계(Limit)또는크기(Size): 해당 세그먼트의 최대 크기입니다.
논리 주소를 물리 주소로 변환하는 과정은 다음과 같습니다.
- 세그먼트 번호로 세그먼트 테이블 접근: 논리 주소의 세그먼트 번호를 사용하여 해당 프로세스의 세그먼트 테이블에서 해당 항목을 찾습니다.
- 오프셋 유효성 검사: 오프셋이 세그먼트의 한계 값보다 작은지 확인합니다. 만약 오프셋이 한계를 벗어나면,
세그멘테이션 오류(Segmentation fault)가 발생합니다. 이는 메모리 접근 권한 위반을 의미합니다. - 물리 주소 계산: 유효한 오프셋의 경우, 물리 주소는
기저 주소 + 오프셋으로 계산됩니다.
예를 들어, 세그먼트 번호가 3이고 오프셋이 100인 논리 주소가 있다고 가정해 보겠습니다. 해당 프로세스의 세그먼트 테이블에서 세그먼트 번호 3에 해당하는 항목을 찾습니다. 이 항목의 기저 주소가 2000이고 한계가 500이라고 가정하면, 오프셋 100은 한계 500보다 작으므로 유효합니다. 따라서 물리 주소는 2000 + 100 = 2100이 됩니다. 만약 오프셋이 600이었다면, 한계를 벗어나 세그멘테이션 오류가 발생했을 것입니다.
3. 세그멘테이션의 장점
세그멘테이션은 페이징에 비해 몇 가지 중요한 장점을 제공합니다.
- 메모리 보호의 용이성: 각 세그먼트는 별도로 보호될 수 있습니다. 예를 들어, 코드 세그먼트는 쓰기 권한이 없도록 설정하여 코드 영역을 보호할 수 있습니다. 데이터 세그먼트는 읽기 및 쓰기 권한을 허용하도록 설정할 수 있습니다. 이를 통해 프로그램의 안정성을 높이고, 버그로 인한 치명적인 오류를 방지할 수 있습니다.
- 메모리 공유의 유연성: 서로 다른 프로세스 간에 세그먼트를 공유하기가 쉽습니다. 공유 세그먼트에 대한 접근 권한을 적절하게 설정함으로써, 여러 프로세스가 동일한 코드를 공유하거나 데이터를 공유할 수 있습니다. 이는 메모리 사용량을 줄이고, 프로세스 간 통신을 효율적으로 구현하는 데 도움이 됩니다.
- 프로그램 구조의 반영: 세그멘테이션은 프로그램의 논리적인 구조를 반영합니다. 프로그래머는 코드, 데이터, 스택과 같은 논리적인 단위로 메모리를 구성할 수 있으며, 이는 프로그램의 개발, 디버깅, 유지 보수를 용이하게 합니다.
- 동적 메모리 할당의 효율성: 세그멘테이션은 가변 크기의 세그먼트를 할당할 수 있습니다. 이는 페이징과 달리, 필요한 만큼의 메모리 공간을 할당할 수 있게 해줍니다. 이로 인해 메모리 낭비를 줄이고, 메모리 사용 효율을 높일 수 있습니다.
4. 세그멘테이션의 단점
세그멘테이션은 여러 장점을 가지고 있지만, 몇 가지 단점도 존재합니다.
-
외부 단편화(External Fragmentation): 가변 크기의 세그먼트를 할당하고 해제하는 과정에서, 메모리 공간이 여러 조각으로 나누어지는 외부 단편화가 발생할 수 있습니다. 이는 연속된 빈 공간이 충분하지 않아, 새로운 세그먼트를 할당할 수 없는 상황을 초래할 수 있습니다. 이러한 문제를 해결하기 위해, 메모리 압축(Compaction) 기법을 사용하여 메모리 조각들을 재배치해야 할 수도 있습니다. 하지만 메모리 압축은 CPU 사이클을 소모하는 작업이므로, 성능 저하를 유발할 수 있습니다.
2. 메모리 관리의 복잡성: 세그멘테이션은 페이징에 비해 메모리 관리의 복잡성이 높습니다. 세그먼트 테이블을 유지하고 관리해야 하며, 메모리 할당 및 해제 시 효율적인 알고리즘을 구현해야 합니다.
3. 세그먼트 테이블의 오버헤드: 각 프로세스는 세그먼트 테이블을 유지해야 합니다. 세그먼트 테이블은 메모리에 저장되어야 하며, 메모리 접근 시 추가적인 오버헤드를 발생시킵니다. 세그먼트 테이블의 크기가 커질수록 메모리 사용량도 증가하며, 테이블 접근 시간도 증가할 수 있습니다.
5. 페이징과의 비교
세그멘테이션과 페이징은 모두 메모리 관리 기법이지만, 서로 다른 특징을 가지고 있습니다.
| 특징 | 세그멘테이션 | 페이징 |
|---|---|---|
| 메모리 분할 방식 | 논리적인 세그먼트 단위 | 고정 크기의 페이지 단위 |
| 메모리 할당 크기 | 가변 크기 | 고정 크기 |
| 외부 단편화 | 발생 가능 | 발생하지 않음 (내부 단편화는 발생) |
| 메모리 보호 | 세그먼트 단위로 유연하게 설정 가능 | 페이지 단위로 설정 (세분화 정도 낮음) |
| 메모리 공유 | 세그먼트 단위로 유연하게 공유 가능 | 페이지 단위로 공유 가능 |
| 프로그램 구조 반영 | 프로그램의 논리적 구조 반영 | 반영하지 않음 |
| 메모리 관리 복잡성 | 높음 | 낮음 |
| 내부 단편화 | 발생하지 않음 | 발생 가능 |
페이징은 메모리를 고정 크기의 페이지로 분할하기 때문에 외부 단편화가 발생하지 않습니다. 하지만 내부 단편화가 발생할 수 있으며, 프로그램의 논리적 구조를 반영하지 않습니다. 세그멘테이션은 외부 단편화가 발생할 수 있지만, 프로그램의 논리적 구조를 반영하고 메모리 보호 및 공유를 더 유연하게 관리할 수 있습니다.
6. 세그멘테이션의 활용 사례
세그멘테이션은 메모리 보호, 공유, 그리고 유연한 메모리 관리가 필요한 다양한 시스템에서 활용될 수 있습니다.
- 메모리 보호가 중요한 시스템: 운영체제 커널과 사용자 공간을 분리하여 시스템의 안정성을 높이는 데 사용될 수 있습니다. 커널은 코드, 데이터, 스택을 별도의 세그먼트에 위치시켜 접근 권한을 제한할 수 있습니다.
- 메모리 공유가 필요한 시스템: 여러 프로세스가 공유 라이브러리를 사용하거나, IPC(Inter-Process Communication)를 통해 데이터를 공유하는 경우, 세그멘테이션을 사용하여 공유 메모리를 효율적으로 관리할 수 있습니다.
- 실시간 시스템: 실시간 시스템은 특정 작업의 실행 시간을 보장해야 합니다. 세그멘테이션을 사용하면, 코드, 데이터, 스택을 메모리의 특정 영역에 고정시킬 수 있으며, 이를 통해 실행 시간을 예측하고 관리할 수 있습니다.
7. 결론
세그멘테이션은 프로그램의 논리적인 구조를 반영하여 메모리를 관리하는 강력한 기법입니다. 메모리 보호, 공유, 유연한 메모리 관리를 제공하며, 시스템의 안정성과 성능을 향상시킬 수 있습니다. 하지만 외부 단편화와 메모리 관리의 복잡성과 같은 단점도 존재합니다. 이러한 장단점을 고려하여, 시스템의 요구 사항에 맞는 적절한 메모리 관리 기법을 선택해야 합니다.
Comments (0)
No comments yet. Be the first to comment!
Please to write a comment.