페이징은 무엇이며, 어떻게 동작하는 것일까?
가상 메모리 (Virtual Memory)
--
기본 메모리 연속 할당 방식은
"외부 단편화"와 "물리 메모리보다 큰 프로세스는 실행이 불가능하다"는 문제점이 존재한다.
가상 메모리는
물리적으로 존재하는 메모리가 아닌 운영체제가 메모리를 관리하는 논리적인 개념으로
물리 메모리와 저장 장치(하드 디스크) 사이에서 데이터를 효율적으로 관리하고,
프로그램이 물리 메모리의 크기에 제약받지 않고 실행될 수 있도록 도와준다.
즉, 운영체제가 실제 물리적 메모리와 저장 장치(하드 디스크)를 결합하여
프로그램이 마치 더 큰 메모리를 사용할 수 있는 것처럼 보이게 만드는 추상적인 메모리 공간이다.
가상 메모리를 이용하여 연속 메모리 할당의 문제점들을 해결하는
가상 메모리 관리 기법이 2가지
- 페이징 (Paging)
- 세그멘테이션 (Segmentation)
현재 대부분의 운영체제가 "페이징"기법을 사용한다.
--
페이징 (Paging)
--
페이징은
메모리와 프로세스를 일정한 단위(크기)의 블록으로 나누어 관리하는 방법이다.
프로세스의 논리 주소 공간을 "페이지(Page)"라는 일정한 단위로 자르고,
메모리의 물리 주소 공간을 "프레임(Frame)"이라는 페이지와 동일한 크기로 자른다.
그리고 페이지를 프레임에 할당하는 가상 메모리 관리 기법이다.
페이징에서도 스와핑을 사용할 수 있다.
다만 프로세스 전체가 [스왑 인/아웃]을 하는 것이 아닌 페이지 단위로 [스왑 인/아웃]을 할 수 있다.
그리고 페이징 시스템에서는 이를 [페이지 인/아웃]이라고 부르기도 한다.
즉, 프로세스의 전체를 스왑하는 것이 아니라 프로세스의 일부만 스왑 할 수 있으므로
물리 메모리보다 더 큰 프로세스를 실행할 수 있게 되는 것이다.
(큰 프로세스의 일부를 물리 메모리에 저장하고 나머지는 스왑 인을 통해 보조기억장치(스왑 영역)에 저장)
--
페이지 테이블 (Page Table)
--
페이징 기법은
프로세스를 페이지 단위로 나누어 메모리에 할당하는 방법과
물리 메모리의 크기보다 큰 프로세스를 실행시킬 수 있다는 장점이 존재하지만 문제점도 존재한다.
프로세스가 메모리에 불연속적으로 배치되어 있다면
CPU 입장에서는 이를 순차적으로 실행할 수 없다.
(프로세스를 이루는 페이지들이 어느 프레임에 적재되어 있는지 CPU가 모두 알기 어렵기 때문이다.)
(즉, 프로세스가 메모리에 불연속적으로 배치되면 CPU 입장에서 "다음에 실행할 명령어 위치"를 찾기 어려워진다.)
그래서 페이징 시스템은
프로세스가 물리 메모리(실제 메모리 주소)에 불연속적으로 배치되더라도
논리 주소(CPU가 바라보는 주소)에는 연속적으로 배치되도록 "페이지 테이블"을 이용한다.
페이지 테이블은
"페이지 번호"와 "프레임 번호"를 짝지어 주는 일종의 이정표로
CPU가 "페이지 번호"만 보고 해당 페이지가 적재된 프레임을 찾을 수 있도록 도와준다.
이를 통해
물리 주소상에서는 프로세스들이 분산되어 있더라도
CPU 입장에서는 논리 주소를 보기에 연속적으로 보일 수 있다.
즉, 프로세스들이 메모리에 분산되어 있더라도 CPU는 그냥 논리 주소를 순차적으로 실행하면 된다.
프로세스마다 각자의 "페이지 테이블"을 가지고 있으며
각 프로세스의 "페이지 테이블"은 메모리에 적재되어 있다.
그리고 CPU 내의 "페이지 테이블 베이스 레지스터(PTBR, Page Table Base Register)"는
각 프로세스의 "페이지 테이블"이 적재된 주소를 가리키고 있다.
각 프로세스들의 페이지 테이블 정보들은
각 프로세스의 PCB에 기록되며
프로세스의 문맥 교환이 일어날 때마다 다른 레지스터와 함께 변경된다.
다만 위 그림처럼 "페이지 테이블"을 메모리에 저장하고 있으면
CPU가 메모리 접근 시간이 2배로 늘어난다.
- 메모리에 존재하는 페이지 테이블 접근으로 1번
- 페이지 테이블에 명시된 프레임 접근을로 1번
이를 해결하기 위해서
CPU 주변(일반적으로 MMU 내부)에
"TLB (Translation Lookaside Buffer)"라는 페이지 테이블의 캐시 메모리를 이용한다.
MMU (Memory Management Unit)는
컴퓨터 시스템에서 가상 메모리와 물리 메모리 간의 주소 변환을 수행하는 하드웨어 장치다.
TLB는
가상 메모리 시스템에서 자주 사용되는 가상 주소와 물리 주소의 매핑 정보를 캐시 하는 고속 메모리다.
페이지 테이블의 캐시이기 때문에 "페이지 테이블"의 일부 내용을 저장한다.
(주로 최근에 사용된 페이지 위주로 가져와 저장)
즉, 가상 주소를 물리 주소로 변환하는 데 사용되는 "페이지 테이블" 조회 과정을 빠르게 처리하여
메모리 접근 시간을 단축하는 역할을 수행한다.
- TLB 히트(Hit) : 논리 주소에 대한 페이지 번호가 TLB에 존재한 경우
- TLB 미스(Miss) : 논리 주소에 대한 페이지 번호가 TLB에 존재하지 않는 경우
"TLB 히트"면 굳이 "페이지 테이블"이 적재된 메모리를 찾지 않고 바로 "페이지 번호"로 접근하면 된다.
"TLB 미스"면 메모리에 적제된 "페이지 테이블"에 접근하여 직접 "페이지 번호"를 찾아야 한다.
--
페이징에서 주소 변환
--
하나의 페이지 or 프레임은 여러 주소를 포괄하고 있다.
그래서 특정 주소에 접근하려면 2가지 정보가 필요하다.
- 어떤 페이지 or 프레임에 접근하려는지
- 접근하려는 주소가 해당 페이지 or 프레임으로부터 얼마나 떨어져 있는지
그래서 페이징 시스템에서는
모든 논리 주소가 기본적으로 "페이지 번호(Page Number)"와 "변위 (Offset)"로 이루어져 있다.
- 페이지 번호 : 접근하고자 하는 페이지 번호
- 변위 : 접근하려는 주소가 프레임의 시작 번지로부터 얼마나 떨어져 있는지
논리 주소는 [ 페이지 번호, 변위 ] / 물리 주소는 [ 프레임 번호, 변위 ]로 구성되어 있으며,
페이지 테이블을 통해 서로 변환된다.
만약 CPU가 [ 3번 페이지, 2 변위 ]라는 논리 주소에 접근한다고 가정하면?
"페이지 테이블"을 보고 3번 페이지는 2번 프레임이 존재한다는 것을 알 수 있다.
그러면 CPU는 [ 2번 프레임, 2 변위 ]로 변환하여 접근하게 된다.
결과적으로 2번 프레임의 시작인 0x009번지에서 +2번째인 메모리의 0x011번지에 접근한다.
[ 3, 2 ] -> 페이지 테이블 -> [ 2, 2 ]
--
페이지 테이블 엔트리 (PTE, Page Table Entry)
--
PTE는
페이지 테이블의 각 행들을 의미한다.
사실 "페이지 테이블"에는 페이지 번호와 프레임 번호 외에도 다른 정보를 담고 있다.
페이지 테이블의 대표적인 정보(속성)
- 유효 비트 (Valid Bit)
- 보호 비트 (Protection Bit)
- 참조 비트 (Reference Bit)
- 수정 비트 (Modified Bit)
유효 비트 (Valid Bit)
현재 해당 데이터가 메모리에 적재되어 있는지에 대한 정보로 해당 페이지에 접근 가능 여부를 나타낸다.
(일반적으로 프로세스를 이루는 모든 페이지가 메모리에 적재되어 있지 않는다.)
(일부 페이지는 스왑 영역에 존재할 가능성이 높다.)
- 0 : 현재 메모리에 적재되지 않은 페이지
- 1 : 현재 메모리에 적재된 페이지
만약 유효 비트가 0인(메모리에 적재되어 있지 않은) 페이지로 접근하면
"페이지 폴트 (Page Fault)"라는 예외가 발생한다.
보호 비트 (Protection Bit)
페이지 보호 기능을 위한 비트로
해당 페이지는 읽기, 쓰기에 대해 가능한 페이지인지 나타낸다.
- 0 : 읽기만 가능하고 쓰기는 불가능한 페이지
- 1 : 읽기, 쓰기 모두 가능한 페이지
조금 더 복잡하게 3개의 비트로 나누어 구현할 수도 있다.
읽기(Read), 쓰기(Write), 실행(Execute)으로 나누어 각자 권한을 명시할 수도 있다.
참조 비트 (Reference Bit)
CPU가 해당 페이지에 접근한 적이 있는지에 대한 여부를 나타낸다.
- 0 : 적재 이후 한 번도 접근한 적 없는 페이지
- 1 : 적재 이후 접근한 적 있는 페이지
수정 비트 (Modified Bit)
해당 페이지에 데이터를 사용(수정)한 적이 있는지에 대한 수정 여부를 나타낸다.
(이를 "더티 비트 (Dirty Bit)"라고도 부른다.)
- 0 : 값을 변경한 적 없는 페이지 (한 번도 접근한 적이 없거나 읽기만 했던 페이지)
- 1 : 값이 변경된 적이 있는 페이지
수정 비트에 대한 존재 이유는
페이지가 메모리에서 사라질 때(작업 완료로 메모리 반납)
변경 내용이 있다면 보조기억장치에 변경된 값을 적용(쓰기 작업)을 해야 하는지 판단하기 위해 사용된다.
--
'CS > 운영체제' 카테고리의 다른 글
파일 시스템 (0) | 2024.10.09 |
---|---|
[메모리 관리] 요구 페이징의 페이지, 프레임 관리 기법 (+ 페이지 교체, 프레임 할당) (0) | 2024.10.03 |
[메모리 관리] 연속 메모리 할당 (+ 스와핑, 외부 단편화) (0) | 2024.10.01 |
교착 상태 (0) | 2024.09.30 |
프로세스 동기화 (0) | 2024.09.29 |