출처 - https://github.com/jmxx219/CS-Study (opens in a new tab)
세그먼테이션
세그먼테이션 특징
- 프로세스가 사용하는 다양한 논리적 단위(예: 코드, 전역 변수, 힙, 스택, 라이브러리 등)를 별도의 세그먼트로 관리한다.
- 각 세그먼트는 논리적으로 분리되어 있으며, 서로 다른 크기를 가질 수 있다.
- 로더(loader)는 프로그램을 메모리로 로드할 때, 이러한 세그먼트들을 처리하고, 각 세그먼트에 번호를 할당하며, 메모리에 비연속적으로 세그먼트가 적재된다.
세그먼테이션 장점
- 논리적 구조 반영: 프로그램의 논리적 단위를 메모리에 직접 반영한다. 프로그램이 사용하는 코드, 데이터, 스택 등을 별도의 세그먼트로 관리할 수 있다.
- 세그먼트 동적 크기: 각 세그먼트는 서로 다른 크기를 가질 수 있음으로써 다양한 메모리 요구사항에 유연하게 대응할 수 있다.
세그먼테이션 단점
- 가변 크기의 세그먼트를 사용하기 때문에 여전히 외부 단편화 문제는 발생한다.
- 스왑 아웃될 때 다양한 크기의 세그먼트를 스왑 영역에서 미리 확보해야줘야 한다.
세그먼테이션 폴트
- 세그멘테이션 오류는 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생한다.
- 세그먼테이션 경고가 발생하는 조건이나 그것을 사용자에게 알려주는 방법은 운영 체제에 따라 다르다.
- C 언어에서 발생할 수 있는 세그먼테이션 오류 코드는 링크 (opens in a new tab)를 참고해보자.
- 세그먼트 테이블의 엔트리는 세그먼트의 기준(
limit
)과 세그먼트 상한(base
)을 가지고 있다.limit
세그먼트의 시작 주소base
세그먼트의 길이
- 세그먼테이션 테이블을 조회할 때, 세그먼트 offset(d)가 0과 세그먼트 크기 사이의 값이여야 한다. 그렇지 않으면 트랩(세그먼테이션 폴트)가 발생한다.
페이징
고정 분할 : 물리메모리만 분할
페이징: 가상&물리메모리 둘다 분할, 가상 -> 물리 매핑할 때 랜덤(불연속) 할당
페이지란
- 프레임: 물리 메모리를 고정된 블록 사이즈로 분할한 것
- 페이지: 논리 메모리를 프레임과 같은 크기로 분할한 것
페이지 크기
- 프레임 사이즈와 같이 하드웨어에 의해 정의된다.
- 대부분 페이지 크기는 2의 지수승이고, 4KB~1GB 사이이다.
논리 주소 공간 = 2^m, 페이지 크기 = 2^n 일 때, Page number 개수는 2^(m-n)가 생기고, Page Offset 수는 2^n 생긴다.
페이지 장점
- 외부 단편화: 페이지를 적용함으로써 연속적인 메모리 할당에서 발생했던 외부 단편화를 해결할 수 있다.
- 논리 주소 공간: 논리 주소 공간과 물리 주소 공간을 분리함으로써 물리 메모리의 크기보다 더 큰 주소 공간을 가질 수 있다.
페이지 단점
- 내부 단편화: 프로세스가 사용하는 메모리가 페이지 크기의 정확한 배수가 아닐 경우, 마지막 페이지의 일부 공간이 사용되지 않고 낭비될 수 있다.
페이지 테이블
- 가상 주소 공간을 실제 물리적 메모리 공간에 매핑(mapping)하는 데 사용된다.
- 즉, 프로세스의 페이지는 페이지 테이블을 통해 매핑된 프레임으로 접근하여 논리 주소를 물리 주소로 변환된다.
- 페이지 테이블의 각 엔트리는 하나의 페이지 매핑을 나타낸다.
- 이 엔트리는 프레임 번호와 함께 다양한 제어 비트(ex: 접근 권한, 수정 여부, 존재 여부(valid / invalid bit)) 등을 포함할 수 있다.
- 페이지 크기에 따른 페이지 테이블 크기 변화 참고
페이지 테이블 구조
주소 공간이 너무 커지면 페이지 테이블 자체가 커지는 이슈가 발생한다. 모든 페이지 테이블을 메모리에 할당하는 것 자체가 문제가 될 수 있다.
페이지 테이블 구조를 변경하여 페이지 테이블을 관리할 수 있다.
1. Hierarchical page table
페이지 테이블을 여러개의 테이블로 분리하여 계층화한다.
✔️ Two Level Page Table
페이지 테이블 자체가 다시 페이징 하게 하는 방법이다.
안쪽 페이지 테이블은 존재하는 주소 공간에 대해서만 생성이 되고 프로세스는 전체 페이지 테이블을 들고 있는게 아니라 안쪽 페이지 테이블만 들고 있음으로써 메모리를 절약할 수 있다.
p1은 바깥 페이지 테이블의 인덱스이고 p2는 안쪽 페이지 테이블의 인덱스이다.
✔️ 64 bit 운영체제에서의 Hierarchical Page Table
64비트 운영체제에서는 p1의 크기가 페이지의 크기 4KB 기준 64bit(2^64) / 4KB(2^12) = 2^52 항목으로 구성될 것이다. 2단계 페이지 테이블을 사용하게 되면 바깥쪽 페이지 테이블(p1)의 크기가 2^42 항목을 가지게 되고 2^44바이트(16,384GB)로 구성될 것이다. 이렇게 큰 바깥쪽 테이블을 피하기 위해서는 총 7단계 페이징이 적합하다.
✔️ Hierarchical Page Table의 효율
만약에 TLB가 20ns의 시간초 hit ratio가 98% 메모리 접근 시간이 100ns에 5단계 페이지 테이블이라면 0.98 * 20 + 0.02 * (100 * 6 + 20) = 32ns가 걸린다. 페이지 테이블만 사용하게 된다면 엄청난 시간이 소모되는 거지만 TLB를 함께 사용하게 된다면 아주 불합리한 시간이 소모되진 않는다.
2. Hashed page table
- 주소 공간으로부터 페이지 번호가 오면 그것을 해싱해서 페이지 테이블의 연결 리스트를 따라가며 첫 번째 원소와 가상 페이지 번호를 비교한다.
- 일치되면 그에 대응하는 프레임번호를 가져와 물리 주소를 얻는다.
- ✔️ 클러스터 페이지 테이블
- 클러스터 페이지 테이블의 각 항목은 여러 페이지를 가르킨다.
- 메모리 액세스가 비연속적이면서 전 주소 공간으로 넓게 퍼져 나오는 경우에 유용하다.
3. Inverted page table
- 페이지 테이블 대신에 inverted 페이지 테이블을 사용한다.
- 메모리 프레임마다 엔트리를 가지고 엔트리는 아래 요소로 구성된다.
- 프레임에 올라와 있는 페이지 주소
- 페이지를 소유하고 있는 프로세스의 ID(PID)
- 시스템에서 하나의 페이지 테이블만 존재하고, 테이블 내 각 항목은 메모리 한 프레임을 가리킨다