물리 주소와 논리 주소
- CPU와 프로세스는 메모리의 하드웨어 상 실제 주소인 물리 주소 이용 X
- 논리 주소 사용: 프로세스마다 부여되는 0번지부터 시작되는 주소 체계
- 실제로 정보가 저장되어 있는 하드웨어 상의 메모리와 상호작용 하기 위해서는 반드시 논리 주소와 물리 주소 간의 변환이 필요
- 메모리 관리 장치(MMU): CPU와 메모리 사이에 위치, CPU가 이해하는 논리 주소를 메모리가 이해하는 물리 주소로 변환

스와핑과 연속 메모리 할당
스와핑
- 메모리에 적재된 프로세스들 중에서는 대기 상태가 되었거나 오랫동안 사용하지 않은 프로세스가 있을 수 있다
- 스와핑: 이러한 프로세스들을 임시로 스왑 영역이라는 보조기억장치의 일부인 영역으로 쫓아내고 프로세스를 쫓아낸 자리에 생긴 메모리 상의 빈 공간에 다른 프로세스를 적재하여 실행하는 메모리 관리 방식
- 스왑 아웃: 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것
- 스왑 인: 스왑 영역에 있는 프로세스가 다시 메모리로 옮겨오는 것

연속 메모리 할당과 외부 단편화
- 연속 메모리 할당: 프로세스에 연속적인 메모리 공간 할당

- 연속 메모리 할당은 외부 단편화 문제가 있다
- 프로세스의 실행과 종료를 반복하며 메모리 사이 사이에 빈 공간이 생김

페이징을 통한 가상 메모리 관리
- 스와핑, 연속 메모리 할당 문제
- 외부 단편화
- 물리 메모리보다 큰 프로세스를 실행할 수 없음
- 가상 메모리: 실행하고자 하는 프로그램의 일부만 메모리에 적재해, 실제 메모리보다 더 큰 프로세스를 실행할 수 있도록 만드는 메모리 관리 기법
페이징
- 프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 나누고, 물리 주소 공간을 페이지와 동일한 크기의 프레임이라는 일정한 단위로 나눈 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법
- 프로세스를 구성하는 페이지는 물리 메모리 내에 불연속적으로 배치될 수 있음

- 페이지라는 일정한 크기로 잘린 프로세스들을 메모리에 불연속적으로 할당할 수 있다면 연속 메모리 할당처럼 프로세스 바깥에 빈 공간이 생길 수 없음
- 스와핑 사용 가능
- 프로세스 전체가 스왑 아웃/인 되는 것이 아니라 페이지 단위로 페이지 아웃/인 됨
- 프로세스를 실행하기 위해 전체 프로세스가 메모리에 적재될 필요 없음

- 물리 메모리 내에 페이지가 불연속적으로 배치되어 있다면, CPU 입장에서는 다음으로 실행할 페이지의 위치를 찾기 어렵다
세그멘테이션
- 프로세스를 일정한 크기의 페이지 단위가 아닌 가변적인 크기의 세그먼트 단위로 분할
- 세그먼트의 크기가 일정하지 않기 때문에 외부 단편화가 발생할 수 있음

페이지 테이블
- 프로세스의 페이지와 실제로 적재된 프레임을 짝지어주는 정보
- 프로세스마다 각자 페이지 테이블 정보를 갖고 있으므로, CPU가 서로 다른 프로세스를 실행할 때는 각 프로세스의 페이지 테이블을 참조하여 메모리에 접근

- 페이지 엔트리: 페이지 테이블을 구성하고 있는 각각의 행들

유효 비트
- 해당 페이지에 접근이 가능한지 여부
- `1`: 페이지가 메모리에 적재되어 있음, `0`: 페이지가 메모리에 적재되어 있지 않음
- CPU가 유효 비트가 `0`인 페이지에 접근하려고 하면 페이지 폴트라는 예외 발생
- 페이지 폴트 처리 과정
- 기존 작업 내용 백업
- 페이지 폴트 처리 루틴 실행. 페이지 폴트 처리 루틴은 원하는 페이지를 메모리로 가져와 유효 비트를 1로 변경해주는 작업
- 페이즈 폴트 처리 루틴 실행 후, 메모리에 적재된 페이지 실행
보호 비트
- 페이지 보호 기능을 위해 존재
- `r`(읽기), `w`(쓰기), `x`(실행)의 조합으로 페이지에 접근할 권한 제한
- 예) 보호 비트가 `100` 으로 설정된 페이지는 읽기만 가능
참조 비트
- CPU가 해당 페이지에 접근한 적이 있는지의 여부를 나타냄
- `1`: 페이지를 적재한 이후에 CPU가 읽거나 쓴 페이지
- `0`: 적재한 이후에 한 번도 읽거나 쓴 적이 없는 페이지
수정 비트 (더티 비트)
- 해당 페이지에 데이터를 쓴 적이 있는지 여부
- `1`: 변경된 적이 있는 페이지
- `0`: 변경된 적이 없는 페이지 (한 번도 접근한 적 없거나 읽기만 했던 페이지)
- 수정 비트가 1일 경우, 페이지를 메모리에서 삭제해야 할 때 페이지의 수정 내역을 보조기억장치에도 반영해 두어야 하므로 보조기억장치에 대한 쓰기 작업 필요
- 페이징은 내부 단편화 발생 가능
- 모든 프로세스가 페이지 크기에 딱 맞게 잘리는 것이 아님
- 예) 페이지 크기는 10KB인데 프로세스의 크기가 107KB인 경우 마지막 페이지는 3KB만큼 남음

- 어떤 프로세스를 실행하려면 이 프로세스의 페이지 테이블이 메모리에 적재된 위치를 알아야 함
- 페이지 테이블 베이스 레지스터(PTBR): 특정 프로세스의 페이지 테이블이 적재된 메모리 상의 위치를 가리키는 레지스터
- PTBR은 프로세스마다 가지는 정보이므로 각 PCB에 기록되며, 다른 프로세스로의 문맥 교환이 발생할 때 변경
- 모든 프로세스의 페이지 테이블을 메모리에 두는 것은 1️⃣메모리 접근 횟수가 많아지고 2️⃣메모리 용량을 많이 차지함
메모리 접근 횟수
- 모든 프로세스의 페이지 테이블이 메모리에 적재되어 있을 경우, CPU는 페이지 테이블에 접근하기 위해 한 번, 실제 프레임에 접근하기 위해 한 번, 총 두 번 메모리에 접근해야 한다
- 이를 해결하기 위해 TLB라는 페이지 테이블의 캐시 메모리가 사용됨
- TLB: 참조 지역성의 원리로 자주 사용할 법한 페이지 위주로 페이지 테이블의 일부 내용 저장
- TLB 히트: CPU가 접근하려는 논리 주소의 페이지 번호가 TLB에 있을 경우, TLB는 CPU에게 해당 페이지 번호가 적재된 프레임 번호를 알려줌 → 한번만 메모리에 접근하면 됨
- TLB 미스: 페이지 번호가 TLB에 없는 경우 메모리 내의 페이지 테이블에 접근해야 함

메모리 용량
- 페이지 테이블의 크기가 생각보다 작지 않음
- 계층적 페이징: 페이지 테이블을 페이징하는 방식
- 프로세스의 페이지 테이블을 여러 개의 페이지로 자르고, CPU와 가까이 위치한 바깥 쪽에 페이지 테이블(Outer 페이지 테이블)을 하나 더 두어 잘린 페이지 테이블의 페이즈들을 가리킴
- Outer 페이지 테이블만 메모리에 유지하면 잘린 페이지 테이블의 일부가 보조기억장치에 있더라도 Outer 페이지 테이블을 통해 언제든 접근 가능

페이징 주소 체계
- 하나의 페이지 내에는 여러 주소가 포함되어 있기 때문에 페이징 시스템의 논리 주소는 기본적으로 `<페이지 번호, 변위>` 형태로 이루어져 있음
- 페이지 번호: 몇 번째 페이지 번호에 접근할지
- 변위: 접근하려는 주소가 페이지(프레임) 시작 번지로부터 얼마나 떨어져 있는지
- 논리 주소 `<페이지 번호, 변위>` ⇒ 물리 주소 `<프레임 번호, 변위>` 로 변환

- 예) CPU가 논리 주소 <5, 2>에 접근하면 5번 페이지는 1번 프레임에 있다는 것을 알고, CPU는 1번 프레임 변위 2에 접근하게 됨. 1번 프레임은 8번지부터 시작하므로 CPU는 10번지에 접근하게 됨

페이지 교체 알고리즘
- 요구 페이징: 메모리에 프로세스를 적재할 때 메모리에 필요한 페이지만을 적재하는 기법
- CPU가 특정 페이지에 접근하는 명령어를 실행
- 해당 페이지가 현재 메모리에 있을 경우 (유효 비트가 1일 경우) CPU는 페이지가 적재된 프레임에 접근
- 해당 페이지가 현재 메모리에 없을 경우 (유효 비트가 0일 경우) 페이지 폴트가 발생
- 페이지 폴트가 발생하면 페이지 폴트 처리 루틴을 통해 해당 페이지를 메모리로 적재하고, 유효 비트를 1로 설정
- 다시 1의 과정 수행
FIFO 페이지 교체 알고리즘
- 메모리에 가장 먼저 적재된 페이지부터 스왑 아웃하는 페이지 교체 알고리즘
- 구현은 간단하지만, 초기에 적재되어 계속 참조되고 있는 페이지를 스왑 아웃할 수 있음
최적 페이지 교체 알고리즘
- 앞으로 사용 빈도가 가장 낮은 페이지 교체하는 알고리즘
- 가장 낮은 페이지 폴트율을 보장함
- 미리 예측하기 어렵기 때문에 실제 구현이 어려움
LRU 페이지 교체 알고리즘
- 가장 적게 사용한 페이지를 교체하는 알고리즘
- 보편적으로 사용됨
페이지 폴트의 종류
메이저 페이지 폴트
- 보조기억장치에서 CPU가 원하는 페이지를 읽어 들이기 위해 입출력 작업이 필요한 페이지 폴트
- CPU가 접근하려는 페이지가 물리 메모리에 없을 때 발생
마이너 페이지 폴트
- 보조기억장치와의 입출력이 필요하지 않은 페이지 폴트
- CPU가 요청한 페이지가 물리 메모리에는 존재하지만, 페이지 테이블 상에는 반영되지 않은 경우에 발생
