[OSTEP] 물리 메모리 크기의 극복 : 메커니즘

kshired·2021년 8월 12일
0

물리 메모리 크기의 극복 : 메커니즘

우리는 이전 포스트까지 주소 공간이 비현실적을 작아서 모두 물리 메모리에 탑재가 가능하다는 가정을 하였습니다.

정확히는, 실행 중인 프로세스의 전체 주소 공간이 메모리에 탑재된다고 가정하고 있었습니다.

이제는 그 가정을 완하하겠습니다.

이 포스트에서는 다수의 프로세스들이 동시에 각자 큰 주소 공간을 사용한다고 가정하겠습니다.

이를 위해서는 메모리 계층에 레이어가 추가적으로 필요하게 됩니다.

지금까지는 모든 페이지들이 물리 메모리에 존재하는 것을 가정하였지만, 운영체제는 큰 주소 공간을 지원하기 위해 주소 공간 중에 현재는 크게 필요하지 않은 일부를 보관해 둘 공간이 필요합니다.

일반적으로 그 공간은 메모리 공간보다 더 크지만 느립니다.

이걸 HDD가 담당하게 될 것입니다.

스왑 공간

일단 디스크에 페이지들을 저장할 수 있는 일정 공간을 확보해야합니다.

이 공간을 스왑 공간( Swap Space )라고 부릅니다.

스왑 공간이라고 불리는 이유는 메모리 페이지를 읽어서 Swap out하고, 페이지를 읽어 메모리에 Swap in하기 때문입니다.

Swap 공간을 Page 단위로 입출력한다고 가정할 것이며, Swap 공간에 있는 모든 페이지들의 디스크 주소를 운영체제가 기억해야합니다.

그리고 Swap 공간의 크기는 메모리 Page의 최대 숫자를 결정합니다.

일단 지금은, Swap 공간이 매우 크다고 가정하겠습니다.

먼저 예제를 보겠습니다.

물리 메모리와 Swap 공간에는 각각 4개의 Page와 8개의 Page를 위한 공간이 존재합니다.

이 예제에서는 세 개의 프로세스 ( Proc 0 ~ Proc 2 ) 가 물리 메모리를 공유하고 있습니다.

이들 세 프로세스는 몇 개의 유효 페이지들만 메모리에 존재하며, 나머지는 Swap out 되어 디스크에 존재하고 있습니다.

Proc3의 주소 공간은 모두 디스크에 Swap out 되어 있으므로, 현재 실행중이 아님을 알 수 있습니다.

이 예제를 통해, Swap 공간을 이용하면 시스템에 실제 물리적으로 존재하는 메모리보다 더 많은 공간이 존재하는 것 처럼 작동할 수 있다는 것을 알 수 있습니다.

Present Bit

디스크에 Swap 공간을 확보했으니 이제 페이지 Swap을 위한 기능을 다루겠습니다.

하드웨어 기반의 TLB를 가정하겠습니다.

기본적인 TLB 동작과정은 TLB 히트가 되면 물리 주소를 얻은 후 메모리로 가져오게 되고,

TLB가 미스되면, PTBR과 VPN을 이용하여 PTE를 추출하고 PTE에서 PFN을추출하는 과정을 겪었습니다.

이제 페이지가 디스크로 swap 된다면, 여기에 많은 다른 기법들이 추가 되어야합니다.

일단 PTE가 물리 메모리에 존재하는지에 대한 표현을 정의해야합니다. 하드웨어는 이것을 present bit라는 것을 이용하여 표현합니다.

Present bit가 1이라면 물리 메모리에 해당 페이지가 존재한다는 것이고, Present bit가 0이라면 메모리에 해당 페이지가 존재하지 않고 디스크에 존재한다는 것입니다.

물리 메모리에 존재하지 않는 페이지를 접근하는 행위를 일반적으로 Page Fault라고합니다.

Page Fault가 발생하면, page-fault-handler가 실행됩니다.

페이지 폴트

TLB 미스 처리방법에 따라 두 종류의 시스템이 있었습니다.

하드웨어 기반의 TLB와 소프트웨어 기반의 TLB 였습니다.

둘 중 어느 것이던, 페이지 폴트가 발생하면 운영체제가 그 처리를 담당하게 됩니다.

Page Fault Handler는 그 처리를 담당하게 됩니다.

만약 요청된 페이지가 메모리에 없고, 디스크로 스왑되어 있다면 운영체제는 해당 페이지를 메모리로 스왑해옵니다.

원하는 페이지가 디스크로 스왑되어 있을 때 위치를 파악하기 위해, 운영체제는 PFN이나 PTE비트들을 페이지의 디스크 주소를 나타내는데 사용하게 됩니다.

운영체제는 페이지 폴트 발생시, 페이지 테이블에서 PFN과 PTE를 보고 디스크에 어느 위치에 있는지 파악하고 메모리로 탑재하게 됩니다.

탑재가 완료되면, 운영체제는 PTE의 PFN의 값을 메모리 위치로 변경하게 됩니다.

이 작업이 완료되면 페이지 폴트를 발생시킨 명령어를 재실행하게 됩니다.

이로 인해 TLB 미스가 발생 될 수 있고, TLB 미스 처리 과정에서 TLB 값을 갱신하게 됩니다.

최종적으로 TLB를 통해 주소변환을 하고 메모리에서 데이터나 명령어를 가져오게 됩니다.

디스크에서 메모리로 I/O 되는 동안 blocked 상태가 된다는 것을 유의해야합니다.

보통의 운영체제들은 그 동안 다른 프소세스들을 실행하고 그것을 보통 overlap( 중첩 )시킨다고 표현합니다.

메모리에 빈 공간이 없다면?

스왑 공간에서 page in을 시도했을 때 여유 메모리가 있다고 가정을하고 위 예시를 진행했었습니다.

하지만, 항상 이런 경우만 존재하지는 않습니다.

이를 위해 새로운 페이지를 위한 공간을 확보하기위해 다른 페이지들을 page out하려고 할 수 있습니다.

이를 교체 ( replace )라고 하고, 교체를 위한 페이지를 선택하는 것을 페이지 교체 정책이라고합니다.

페이지 폴트의 처리

위 코드는 하드웨어를 통한 주소변환을 나타냅니다.

아래 코드는 페이지 폴트 발생 시 운영체제의 동작을 나타냅니다.

위 두 개의 코드를 통해 페이지 폴트 처리에 대해 알아보겠습니다.

하드웨어 처리 과정에서 TLP 미스 발생시, 세 가지의 경우가 존재한다는 것을 알 수 있습니다.

  1. 페이지가 존재하며 유효한 경우 ( 18 - 21 line )
  2. 페이지가 유효하지만 존재하지 않는 경우
  3. 페이지가 유효하지않은 경우

1의 경우는 TLB 미스 핸들러가 PTE에서 PFN을 가져와 명령어를 재시도하게 됩니다.

2의 경우는 페이지 폴트 핸들러가 반드시 실행되어야합니다. 물리 메모리에 스왑되어있는 페이지이기 때문입니다.

3의 경우는 프로그램의 버그등으로 잘못된 주소를 접근하게 되는 경우입니다.

두 번째의 코드를 보면 페이지 폴트 처리 방식을 볼 수 있습니다.

물리 프레임을 먼저 확보를하고, 여유 공간이 없다면 교체 알고리즘을 실행하여 메모리를 확보하게 됩니다.

물리 프레임을 확보한 후, I/O 요청을 통해 스왑 영역에서 페이지를 가져와 물리 메모리에 탑재합니다.

그 후 운영체제는 페이지 테이블을 갱신하고 명령어를 재실행합니다.

이 때 TLB는 당연히 미스를 발생시키고, 재시도하여 히트하게 됩니다.

교체는 실제 언제 일어나는가

메모리에 항상 어느 정도의 여유 공간을 비워두기 위해, 대부분의 운영체제는 여유 공간에 관련된 최댓값(High Watermark)과 최솟값(Low Watermark)을 설정하여 교체 알고리즘 작동에 활용합니다.

교체 방식은 다음과 같습니다.

운영체제가 여유 공간의 크기가 최솟값보다 작아지면 여유 공간의 확보를 담당하는 쓰레드가 동작하고, 쓰레드가 여유 공간의 크기가 최댓값에 이를 때까지 페이지를 제거합니다.

이 백그라운드 쓰레드는 일반적으로 Swap Daemon 혹은 Page Daemon이라고 불립니다.

충분한 여유공간이 확보되면 백그라운드 쓰레드는 슬립모드로 들어가게됩니다.

일시에 여러개를 교체하는 방식을 사용하면 성능 개선이 가능합니다.

많은 시스템들은 다수의 페이지들을 클러스터나 그룹으로 묶어서 한번에 스왑 파티션에 저장함으로써 디스크의 효율을 높입니다.

요약

이 포스트에서는 실제 존재하는 물리 메모리의 크기보다 더 많은 메모리를 사용하는 방법을 알아보았습니다.

이를 위해 present bit와 page fault, page fault handler를 알아보았습니다.

이러한 모든 스왑 작업은 프로세스가 인지하지 못하는 상황에서 처리된다는 것을 기억해야하며, 프로세스는 자신이 개별적인 연속된 메모리에 접근하는 것처럼 보입니다.

실제로는 불연속적인 위치일 수도 있으며, 디스크에서 가져오는 경우도 존재합니다.

profile
글 쓰는 개발자

0개의 댓글