> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/os_with_joonion/20-.-paging-swapping.md).

# 20강. Paging, Swapping

### Paging

* 프로그램의 물리 메모리 주소를 연속적이지 않고 작은 페이징 단위로 쪼개어 관리하는 방식
* 가장 기본적으로 고정적인 크기로 메모리를 쪼개면 프레임이라고 하는데, 이것을 똑같은 크기의 논리 주소(페이지)와 논리적으로 연결하는 것
* 물리적 메모리와 논리적 메모리가 프레임 단위로 쪼개져있기 때문에 이것들이 연속적인 필요가 없어진다. 또한 논리적 주소와 물리적 주소의 연결은 운영체제가 담당한다. 즉, 사용자가 신경쓸 필요가 없어진다.
* 내부적으로는 CPU가 논리적 주소 (페이지 번호, offset)를 통해 페이지 테이블을 탐색하고 물리 주소를 알아내어 접근하는 방식
* 페이지의 사이즈가 너무 크면 내부 단편화가 일어나고, 너무 작으면 호율이 떨어진다.
* 신규 프로세스가 생성되면 운영체제는 free-frame list에서 빈 공간을 찾아서 할당한다.
* CPU의 제어가 끝나서 Context Switch가 발생하면 Page Table도 함께 업데이트되어야 한다. 이를 보완하기 위해 Page Table Base Register를 이용하여 레지스터에 페이지 시작점을 기록해둬서 context switch 발생 시에 효율성을 높일 수 있다.
* TLB: 페이지 테이블을 계속 조회하는 것이 비효율적이라 TLB 라는 캐시 메모리 공간을 별도로 확보해두고 빠르게 메모리 주소를 확인하는 방식도 사용된다. 단 캐시 메모리니까 100% 히트는 아니다.

<br>

#### Memory Protection

* 연속 할당 방식은 메모리 할당 범위가 명확하기 때문에 메모리 범위에 대한 규제가 빡빡할 필요가 없었지만, 페이징 방식을 도입하면 메모리 범위에 대한 규제가 필요해지기 때문에 Proctection Bit 가 필요해진다. 이를 통해 하드웨어에 대한 접근이 유효한지 그렇지 않은지 판별한다.

<br>

#### Shared page

* 페이징을 사용하게 되면 공유 메모리를 통해 공용 코드를 두고 사용하기 좋아진다.

<br>

#### 너무 큰 페이지 테이블 문제

* 계층적인 테이블
  * 테이블이 아닌 트리 구조로 테이블을 계층화한다. 탐색이 빨라지고 메모리 점유량이 늘어나것지
* 해시 테이블
  * 해시 fucntion을 통해 페이지 테이블 접근을 지원하는 하드웨어를 구현하는 방식
  * 테이블이 32bits 이상일 경우 사용한다.
* 역전된 페이지 테이블
  * pid를 가지고 해당 프로세스가 어떤 메모리 주소를 점유하고 있는지를 저장하여 페이지 테이블의 사이즈를 줄인다.

<br>

### Swapping

* 실제 메모리 공간보다 실행 프로그램의 크기가 더 큰 경우가 생기기 마련이고, 페이징 방식을 사용하면 프로그램은 사용되는 일부만 페이지로 로딩하여 메모리에 적재하여 사용할 수 있다.
* 그래서 사용되던 프로그램 일부를 메모리에서 내리는 작업을 `page-out`, 메모리에 일부 적재하는 방식을 `page-in` 이라고 한다.
