brunch

You can make anything
by writing

C.S.Lewis

by zwoo Dec 15. 2022

[정글]열두째주. 메모리를 효율적으로 관리하는 방법

swap out / swap in

컴퓨터 입장에서 가장 공포스러운 상황 중의 하나는 바로 물리 공간이 부족한 상황이다. 커다란 응용프로그램부터 작은 코드조각 하나까지, 메모리 공간에 올리지 않고서는 사용자가 원하는 작업을 수행할 수 없다. 운영체제는 가상메모리라는 시스템을 통해서 메모리 효율을 높인다. 


운영체제는 커다란 가상 주소체계를 만들어두고 각 프로세스에게 서로 다른 주소 공간을 할당해준다. 여러 프로세스가 가진 데이터들은 실제로는 동일한 물리 공간을 가리키고 있지만, 여러 후보들 중 실제로 올라가는 것은 현재 활성화된 프로세스의 데이터들 뿐이다. 또한 현재 활성화된 프로세스의 데이터들도 프로세스가 실행되는 순간 한꺼번에 다 물리메모리에 올라가는 것이 아니라, 미리 현재 프로세스가 가진 페이지 테이블에 기록만 되어있다가 꼭 필요한 순간에만 올라가게 된다. 


그렇다면 여기서 의문이 생긴다. 그럼에도 불구하고 물리 메모리가 다 차면 어떻게 될까?



SWAP IN, SWAP OUT

https://www.thebluediamondgallery.com/handwriting/s/swap.html


운영체제가 사용하는 물리공간은 RAM이라는 주기억장치이다. RAM은 휘발성 메모리로, CPU가 작업하고 있는 내용을 저장하는 공간이기 때문에 컴퓨터가 꺼지면 데이터는 모두 사라진다. 이와 달리 우리가 흔히 하드디스크라고 부르는 공간은 보조기억장치로, 직접 삭제하지 않는 한 데이터가 영구히 저장된다. 


물리 메모리라고 하면 RAM을 가리키는 것이고, 스왑공간은 보조기억장치인 디스크에 만들어진다. 메모리 공간이 이미 꽉 찼고, 스왑디스크에 있는 데이터를 읽어들이려는 상황이라고 가정해보자. 스왑이 이루어지는 순서는 다음과 같다. 


메모리 할당 요청이 들어온다 -> RAM이 다 차서 page fault 발생 -> page_fault 핸들러에서 삭제할 페이지를 선정한다 -> 스왑 공간으로 페이지 이동(SWAP OUT) -> 새롭게 생겨난 프레임공간이 할당된다 -> 스왑공간의 데이터를 RAM으로 스왑인


https://gist.github.com/yeonwooz/01dd8771573243413ce535800d8f4c90


스왑디스크에 쓰고 읽는다는 것

스왑디스크에 대해 좀더 자세히 살펴보면 재밌는 점을 발견할 수 있다. RAM의 데이터가 스왑디스크에 쓰여지고(WRITE), 다시 RAM으로 읽어들이는(READ) 과정이 마치 파일데이터를 읽고 쓰는 과정과 유사해보인다. 그렇다. 파일데이터는 파일 자체를 스왑디스크로 사용하면 되는 것이다. 스왑디스크가 필요한 이유는 RAM 에만 올라가는 데이터들을 위해서 필요하다. 


프로세스에서 관리하는 데이터는 페이지 단위로 관리되며, 앞서 말한 것처럼 파일에 기반한 데이터는 File Backed Page, 파일에 기반하지 않고 RAM에만 존재할 수 있는 데이터를 Anonymous Page라고 구분한다. 주인이 있는 페이지와 없는 페이지라고 생각하면 쉽다. 어떤 페이지가 주인이 없을까? 대표적으로 어플리케이션을 이루고 있는 코드조각들이나 텍스트같은 데이터들이다. 


핀토스에서는 이렇게 파일로부터, 혹은 스왑디스크로부터 페이지를 읽어들일 때는 물리 프레임과 1대1로 매핑된 커널영역의 주소에 데이터를 읽어들이고(READ), 원래 영역에서는 삭제한다. 반대로 스왑 아웃을 시켜야 할 때는 해당 프레임을 가리키는 커널주소를 값으로 갖는 유저영역의 가상주소를 찾아간 후에 스왑디스크 혹은 파일에 쓰고(WRITE), 가상주소에서는 삭제한다. 이 방식은 한번 들으면 다소 복잡하기에 한번 더 정리해보겠다. 물리 프레임은 커널주소와 매핑되고, 커널주소는 유저가상주소 상에 값으로 매핑된다. 프로세스가 가진 주소록(페이지테이블) 에서 유저가상주소를 탐색해서 그 값을 찾아가면 커널주소가 있고, 해당 커널주소에서 매핑된 프레임으로 찾아가 데이터 원본을 참조할 수 있는 것이다.


이렇게 스왑인 스왑아웃을 통해 제한된 물리공간마저 마치 무한한 것처럼 효율적으로 쓸 수 있게 되었다. 물론 스왑디스크까지 다 차면 방법이 없다.(있을까?) 운영체제가 이렇게 극단적으로 메모리를 아껴 쓰는 이유는 용량이 아주 큰 하드디스크 저장공간을 따로 둔다고 해도 데이터 교환에 시간이 오래 걸리기 때문이다. 되도록 작업에 필요한 데이터들은 모두 RAM에 저장해두고 불러다 쓰는 것이 훨씬 빠르다. 




Photo by Florian Rieder on Unsplash



매거진의 이전글 [정글]열한째주. 운영체제가 메모리를 관리하는 방법
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari