세그멘테이션(Segmentation)
세그멘테이션은 메모리 관리 기법 중 하나로 메모리의 효율적인 사용과 프로그램의 보다 유연한 배치를 가능하게 해 준다.
세그멘테이션은 주소 공간을 논리적으로 분할하여 각각의 세그먼트에 대해 대해 별도의 베이스와 바운드 쌍을 할당하여 메모리 관리 장치에 저장하는 방식이다.
- 세그먼트(Segment)
세그먼트는 특정 길이를 가지는 연속적인 주소 공간을 나타내며 일반적으로는 코드, 스택 및 힙 등과 같이 프로그램이나 데이터의 논리적인 부분을 나타낸다.
세그멘테이션을 사용하면 운영 체제는 각 세그먼트를 메모리에 별도로 배치함으로써 프로그램이나 데이터를 물리 메모리의 다양한 위치에 할당할 수 있다. 또한 사용되지 않는 가상 주소 공간이 물리 메모리를 차지하는 것을 방지할 수 있다.
위의 그림과 같이 A라는 프로세스에 있는 Code, Heap, Stack 영역의 세그먼트를 베이스-바운드 쌍을 이용하여 실제 물리 메모리에 독립적으로 배치할 수 있다.
세그먼트 폴트
세그먼트 폴트는 주소 접근 오류가 발생했을 때, 즉 해당 프로세스가 접근한 메모리 주소가 메모리 세그먼트의 범위를 벗어났을 때 발생하는 것이다. 이러한 오류는 프로그램이 메모리를 잘못 사용하거나 액세스 하려고 할 때 발생한다.
세그먼트 폴트가 발생하면 운영 체제에서 프로그램이 메모리를 잘못 사용하는 오류를 감지하여 프로세스나 시스템의 안정성을 유지하기 위해 해당 프로세스를 중단하거나 종료시킨다.
외부 단편화
세그멘테이션은 프로그램의 논리적 구조에 기반하여 메모리를 관리하므로 프로그래머에게 직관적이고 유연한 메모리를 제공한다. 또한 세그먼트 단위로 메모리 보호와 공유가 가능하므로 시스템의 안정성과 보안을 향상할 수 있다.
그러나 세그멘테이션은 외부 단편화 문제를 야기할 수 있고 세그먼트 테이블 관리에 오버헤드가 발생할 수 있다.
외부 단편화는 메모리에 할당되지 않은 빈 공간들이 여러 곳에 산재해 있어 실제로는 충분한 메모리가 있음에도 불구하고 연속적인 메모리 공간을 할당하지 못하는 현상을 말한다.
그림과 같이 전체 메모리의 크기가 24KB이고 사용 가능한 부분이 14KB 정도 되지만 새로 들어온 8KB 프로세스는 메모리에 올릴 수 없게 된다.
세그멘테이션에서는 가변 크기의 세그먼트를 할당하므로 외부 단편화가 발생할 수 있다는 것을 고려해야 한다.
외부 단편화 해결 방법
- 압축(Compaction)
세그먼트를 정리하여 물리 메모리를 압축하여 외부 단편화를 해결할 수 있다.
운영 체제는 현재 실행 중인 프로세스를 중단하고 그들의 데이터를 하나의 연속된 공간에 복사한 후 세그먼트 레지스터가 새로운 물리 메모리 위치를 가리키게 하여 자신이 작업할 큰 빈 공간을 확보한다.
하지만 세그먼트 복사는 메모리에 부하가 큰 연산이고 일반적으로 상당량의 프로세서 시간을 사용하기 때문에 압축은 비용이 많이 든다.
- 페이징(Paging)
페이징은 프로세스의 가상 메모리를 고정 크기의 블록인 페이지 단위로 분할하여 물리 메모리에 할당하는 기법으로 페이지들이 논리적으로 연속적인 공간으로 할당할 수 있게 되면서 외부 단편화를 해결할 수 있다.
더 정확한 내용은 밑의 페이징 파트에서 알아보자.
페이징(Paging)
앞서 살펴본 세그멘테이션 기법은 외부 단편화로 인한 메모리 낭비가 발생한다는 것을 알 수 있다. 압축을 사용하여 외부 단편화 문제를 해결할 수 있지만 그로 인해 발생하는 비용과 비효율적인 성능으로 사용하기 어렵다.
페이징은 세그멘테이션과 같은 메모리 관리 기법 중 하나로 주소 공간을 동일 크기의 페이지로 분할하는 것을 의미한다. 이를 통해 세그멘테이션 기법에서 발생하는 외부 단편화 문제를 해결할 수 있다.
페이징에서는 프로세스의 주소 공간을 가변 크기의 논리 세그먼트로 나누는 대신 고정 크기의 단위인 페이지(Page)로 나눈다.
이에 상응하여 물리 메모리도 페이지 프레임이라고 불리는 고정 크기의 슬롯(배열)으로 구성된다.
각 페이지 프레임은 하나의 가상 메모리 페이지를 저장할 수 있다. 여기서 페이지는 가상 메모리를 고정 크기로 나눈 블록으로 주소 변환의 기본 단위가 된다.
위의 사진을 보면 운영 체제도 페이지 프레임을 가지는 것을 알 수 있다.
페이징 기법을 사용하여 연속 메모리 할당을 하게 되면서 외부 단편화를 해결할 수 있었지만 반대로 내부 단편화가 발생하게 된다.
내부 단편화
내부 단편화는 프로세스 크기가 페이지 크기의 배수가 아닐 경우 마지막 페이지는 한 프레임을 다 채울 수 없다. 이로 인해 발생하는 공간은 결국 메모리 낭비로 이어진다.
그림을 예시로 보면 15KB의 크기를 가진 프로세스를 페이지로 나누게 되면 4, 4, 4, 3KB로 나눌 수 있다. 하지만 물리 메모리는 페이지 프레임으로 나눌 때 똑같은 범위로 나눠지게 되는데 4KB씩 분할된다.
여기서 Page 3는 3KB의 크기를 가지게 되지만 페이지 프레임은 4KB의 크기를 가지게 되므로 1KB의 공간이 남게 되고, 해당 공간이 메모리 낭비로 이어지게 된다.
내부 단편화 해결 방법
- 세그멘테이션
프로세스의 가상 메모리를 서로 다른 크기의 블록인 세그먼트 단위로 분할하여 물리 메모리에 할당하는 기법으로 프로세스의 크기가 동적으로 변하는 경우에 효율적으로 메모리를 할당할 수 있게 되면서 내부 단편화를 해결할 수 있다.
하지만 세그멘테이션의 외부 단편화를 해결하기 위해 페이징을 사용했는데 다시 세그멘테이션을 사용한다면 똑같은 문제가 반복해서 발생하게 될 것이다.
- 메모리 풀
메모리 풀은 필요한 메모리 크기와 개수를 지정해 미리 할당을 받아 메모리 풀을 만들어 놓고 필요할 때마다 사용하고 반납하는 방식으로 필요한 크기만큼 할당을 미리 해놓기 때문에 내부 단편화가 발생하지 않는다.
또한 할당받았던 메모리 공간을 가져다 사용하고 반납하기 때문에 메모리 할당과 해제로 인한 외부 단편화가 발생하지 않아서 외부 및 내부 단편화를 모두 해결할 수 있는 방법이다.
페이지 테이블
운영 체제는 주소 공간의 각 가상 페이지에 대한 물리 메모리 위치를 기록하기 위해 프로세스마다 페이지 테이블이라는 자료 구조를 유지한다.
페이지 테이블의 주요 역할은 가상 주소 공간의 각 페이지에 대한 주소 변환 정보, 즉 각 페이지가 저장된 물리 페이지 프레임의 위치를 저장하는 것이다.
페이지 테이블은 프로세스의 정보를 담고 있는 PCB에 저장된다. (프로세스마다 생성됨.)
페이지 폴트(Page Fault)
페이지 폴트는 프로세스가 실행 중에 필요한 페이지가 물리 메모리에 없을 때 발생하는 현상이다.
그림을 통해 알아보자면 프로세스에 Page 4라는 페이지가 있는데 실제 페이지 테이블에서는 Page 4에서 필요한 페이지 프레임이 없는 경우를 페이지 폴트라고 한다.
페이지 폴트가 발생하면 운영 체제에게 페이지가 필요한 물리 메모리를 업데이트 시켜달라고 요청하게 된다.
페이징의 장단점
페이징의 장점
- 유연성
페이징을 사용하면 프로세스의 주소 공간 사용 방식과 상관없이 효율적으로 주소 공간 개념을 지원할 수 있다. 예를 들어서 힙과 스택이 어느 방향으로 커지는가 혹은 어떻게 사용되는가에 대한 가정을 하지 않아도 된다.
- 빈 공간 관리의 단순함
위의 그림을 예시로 들면 운영 체제가 64바이트의 가상 주소 공간을 8페이지 물리 메모리에 배치하려면 단순히 비어 있는 4개의 페이지만 찾으면 된다.
주소 공간의 각 가상 페이지에 대한 물리 메모리 위치 기록을 위해 운영체제는 프로세스마다 페이지 테이블이라는 자료 구조를 유지하게 된다.
페이지 테이블의 주요 역할은 주소 공간의 가상 페이지 주소 변환 정보를 저장하는 것이다. 즉, 각 페이지가 저장된 물리 메모리의 위치가 어디인지 알려준다.
페이징의 단점
- 페이징이 느려질 수 있다.
페이징 기법을 사용하게 되면 물리 주소를 확인하기 위해 반드시 페이지 테이블에 들려야 한다. 페이지 테이블은 별도의 레지스터 집합(PTER)을 구성하여 활용하지만 페이지 테이블의 용량이 커지게 되면 메인 메모리 상에 들어있게 된다.
이러한 구성으로 인해서 페이지 테이블 접근과 물리 메모리 접근 총 2번의 메인 메모리 접근이 요구되기 때문에 처리 속도가 저하될 수 있다.
참고자료
'CS > OS' 카테고리의 다른 글
운영체제 - 페이지 교체 알고리즘 (0) | 2024.07.03 |
---|---|
운영체제 - 요구 페이징 (0) | 2024.07.02 |
운영체제 - 주소 변환 (0) | 2024.06.30 |
운영체제 - 주소 공간과 가상 메모리 (0) | 2024.06.30 |
운영체제 - PCB와 Context Switching (0) | 2024.06.27 |