메모리 관리 방법 중 페이징과 세그멘테이션에 대해 알아보겠습니다. 운영체제의 핵심 역할 중 하나는 메모리를 효율적으로 관리하는 것입니다. 특히 요즘 주요하게 사용되는 메모리 관리 기법으로 페이징과 세그먼테이션이 있습니다. 지금부터 두 기법의 개념, 동작 원리, 장단점, 그리고 실제 활용 사례를 중심으로 상세히 설명하겠습니다.
페이징(Paging)
페이징은 메모리를 고정 크기의 블록으로 나누어 관리하는 기법입니다. 프로세스의 주소 공간을 일정 크기의 페이지(Page)로 나누고, 이를 메모리 내 프레임(Frame)이라는 고정 크기의 슬롯에 매핑합니다.
1. 페이징 동작 원리
논리적 주소 분리 : 논리적 주소는 페이지 번호(Page Number)와 페이지 오프셋(Page Offset)으로 구성됩니다. 페이지 번호는 메모리 내 프레임을 식별하고, 오프셋은 프레임 내에서 데이터의 위치를 나타냅니다.
페이지 테이블 : 프로세스마다 페이지 테이블이 생성되며, 각 페이지가 매핑된 프레임 정보를 저장합니다. 페이지 테이블 엔트리는 페이지 번호와 물리적 프레임 주소를 연결합니다.
주소 변환 : CPU는 논리적 주소를 생성하면 MMU(Memory Management Unit)가 페이지 테이블을 참조해 물리적 주소로 변환합니다.
2. 페이징의 장점과 단점
장점은 외부 단편화(External Fragmentation)를 방지할 수 있다는 점입니다. 모든 페이지가 고정된 크기를 가지므로 빈 공간 활용이 용이합니다. 또헌 사용되지 않는 페이지는 디스크에 저장하여 효율적으로 메모리를 사용합니다.
단점은 내부 단편화(Internal Fragmentation)로 페이지 크기가 고정이어서 사용되지 않는 공간이 발생할 수 있다는 점입니다. 추가적인 오버헤드는 페이지 테이블 관리와 주소 변환으로 인해 시스템 자원이 더 필요합니다.
세그먼테이션(Segmentation)
세그먼테이션은 메모리를 논리적 단위로 나누어 관리하는 기법입니다. 세그먼트는 프로그램의 기능적 단위(예: 코드, 데이터, 스택 등)를 기반으로 크기가 동적으로 설정됩니다.
1. 세그먼테이션 동작 원리
논리적 주소 분리 : 논리적 주소는 세그먼트 번호와 세그먼트 오프셋으로 구성됩니다. 세그먼트 번호는 프로그램의 특정 영역을 식별하고, 오프셋은 해당 세그먼트 내의 위치를 나타냅니다.
세그먼트 테이블 : 세그먼트 테이블은 각 세그먼트의 시작 주소와 길이를 저장합니다. CPU는 세그먼트 테이블을 참조해 주소 변환 및 경계 확인을 수행합니다.
주소 변환 및 경계 검사 : 논리적 주소의 오프셋이 세그먼트의 길이를 초과하면 잘못된 접근으로 간주해 예외를 발생시킵니다.
2. 세그먼테이션의 장점과 단점
장점은 사용자의 관점과 맞는 메모리 구조 제공하여 코드, 데이터, 스택 등 논리적 구분이 명확해진다는 것, 그리고 메모리를 보호하여 세그먼트 간 접근 제한이 가능하여 데이터 손상 위험을 줄이는 것입니다.
단점은 외부 단편화가 발생하여 세그먼트 크기가 동적이므로 메모리에 빈 공간이 생길 수 있는 점, 세그먼트 테이블을 유지 및 관리해야 하며, 세그먼트 크기 조정이 어렵다는 점입니다.
3. 세그멘테이션의 실제 활용
세그멘테이션은 과거에는 운영체제나 일부 특정 임베디드 시스템에서 주로 사용되었습니다. 요즘 OS에서는 페이징과 결합해 활용됩니다(예: x86 아키텍처의 세그먼트 + 페이지 결합 방식).
페이징과 세그먼테이션의 비교
페이징과 세그먼테이션은 메모리 관리에서 서로 다른 접근 방식을 취하며, 각각의 기법은 장단점과 특성을 가지고 있습니다.
구조
페이징은 메모리를 고정된 크기의 블록으로 나누어 관리합니다. 각 블록은 페이지로 불리며, 물리적 메모리에서는 프레임으로 매핑됩니다.
세그먼테이션은 메모리를 논리적 단위로 나누어 관리합니다. 예를 들어 코드, 데이터, 스택과 같은 논리적 구성이 각각의 세그먼트로 나뉩니다. 세그먼트의 크기는 고정되지 않고 동적입니다.
주소 구성
페이징에서는 논리적 주소가 페이지 번호와 페이지 내 오프셋으로 나뉩니다. 페이지 번호는 해당 논리 페이지를, 오프셋은 페이지 내 위치를 나타냅니다.
세그먼테이션에서는 논리적 주소가 세그먼트 번호와 세그먼트 오프셋으로 이루어져 있습니다. 세그먼트 번호는 메모리의 특정 논리 영역을 식별하며, 오프셋은 해당 세그먼트 내 위치를 지정합니다.
단편화 문제
페이징은 고정 크기를 사용하므로 외부 단편화가 발생하지 않습니다. 하지만 페이지 크기와 데이터 크기가 일치하지 않을 경우 내부 단편화가 발생할 수 있습니다. 세그먼테이션은 크기가 동적이기 때문에 외부 단편화가 발생할 가능성이 큰 반면 내부 단편화 문제는 상대적으로 적습니다.
주소 변환 방식
페이징에서는 페이지 테이블을 사용합니다. CPU는 페이지 테이블을 참조하여 논리적 주소를 물리적 주소로 변환합니다. 세그먼테이션에서는 세그먼트 테이블을 사용합니다. 세그먼트 테이블은 각 세그먼트의 시작 주소와 크기를 포함하며, 주소 변환과 경계 검사를 동시에 수행합니다.
운영체제에서의 활용
페이징은 현대 운영체제에서 가장 일반적으로 사용되는 방식으로, Windows와 Linux 모두 페이징 기반 가상 메모리 관리 시스템을 채택하고 있습니다. 세그먼테이션은 특정 임베디드 시스템 또는 과거 운영체제에서 주로 사용되었습니다. 현대 시스템에서는 페이징과 결합되어 사용되는 경우가 많습니다. 예를 들어, x86 아키텍처는 세그먼트와 페이지를 결합하여 메모리를 관리합니다.
페이징 + 세그멘테이션 결합 방식
최근에는 두 기법의 단점을 상호 보완하기 위해 결합 방식을 사용합니다. 세그먼테이션을 사용해 프로그램의 논리적 구조를 나누고, 각 세그먼트를 페이지 단위로 다시 나눕니다. 그러면 외부 단편화를 줄이면서 메모리 관리를 효율화할 수 있습니다.
마무리
페이징과 세그멘테이션은 각기 다른 방식으로 메모리 관리 문제를 해결합니다. 페이징은 고정 크기의 메모리 블록을 사용해 외부 단편화를 방지하며, 세그먼테이션은 논리적 구조를 기반으로 직관적인 메모리 접근 방식을 제공합니다. 이 둘을 적절히 조합해 성능과 효율성을 극대화하여 사용해보시기 바랍니다.