세그멘테이션은 메모리를 코드·데이터·스택처럼 논리적인 의미를 가진 가변 크기의 세그먼트로 나누는 방식입니다. 외부 단편화는 빈 공간이 여러 곳에 흩어져 큰 연속 공간을 확보하지 못하는 문제입니다.
순수 세그멘테이션에서는 각 세그먼트를 물리 메모리에 연속 배치하고, 세그먼트 테이블의 시작 주소(Base)와 크기(Limit)로 주소 변환과 범위 검사를 수행합니다. 논리 단위별 보호와 공유에 유리하지만, 서로 다른 크기의 공간을 할당·해제하면서 빈틈이 생깁니다.
예를 들어 4 KiB와 6 KiB의 빈 공간이 떨어져 있으면 총 10 KiB가 남아도 8 KiB짜리 세그먼트를 넣을 수 없습니다. 이런 외부 단편화는 메모리 압축으로 완화하거나, 페이징을 결합해 연속 배치 요구를 줄일 수 있습니다.
내부 단편화와 외부 단편화를 구분하는 기준은 무엇인가요?
내부 단편화는 이미 할당한 블록 안의 낭비이고, 외부 단편화는 할당된 블록들 사이에 흩어진 빈 공간입니다. 대표적으로 고정 크기 페이지에서는 내부 단편화, 가변 크기 세그먼트에서는 외부 단편화를 설명합니다.
압축(Compaction)은 무엇이며 비용은 왜 발생하나요?
사용 중인 메모리를 이동시켜 빈 공간을 큰 연속 영역으로 모으는 작업입니다. 데이터 복사와 주소 매핑 갱신이 필요하며, 이동할 수 없는 영역이 있으면 효과도 제한됩니다.
세그멘테이션과 페이징을 함께 사용할 수 있나요?
가능합니다. 논리적인 세그먼트를 다시 고정 크기 페이지로 나누면, 세그먼트 전체를 연속된 물리 메모리에 둘 필요가 없어집니다. 대신 세그먼트와 페이지의 매핑을 함께 관리해야 합니다.
Contiguous Allocation에 대해 설명해주세요.
프로세스나 세그먼트 하나를 물리 메모리의 연속된 주소 범위에 배치하는 방식입니다. 시작 위치를 나타내는 Base와 범위를 나타내는 Limit만으로 주소 변환과 보호를 단순하게 구현할 수 있지만, 크기가 다른 영역을 할당·해제하면 외부 단편화가 생기고 영역 확장도 어렵습니다. First Fit·Best Fit 등으로 빈 공간을 고르거나 Compaction으로 완화할 수 있으며, 페이징은 연속 배치 요구 자체를 없앱니다.