본문 바로가기
프로그래밍/Desktop App

[시스템 프로그래밍] 가상 메모리와 힙

by YuminK 2023. 12. 4.

가상 메모리

프로그램에게 할당된 데이터는 메인 메모리의 크기를 넘을 수 있는데, 어떻게 이것이 가능할까? 프로그램은 할당된 메모리를 전부 사용하지 않을 확률이 높다. 이런 컨셉으로 나오는 것이 가상 메모리 시스템이다.

 

MMU(Memory Management Unit)

CPU가 마치 프로세스에 할당된 메모리가 실제로 존재하는 것처럼 관리해준다. CPU는 메모리를 요청할 때 직접 메모리에 접근하지 않고 MMU를 통해서 요청한다. 

 

페이지 프레임은 실제 메모리 블록을 의미하고 페이지는 가상 메모리 블록을 의미한다. 가상 메모리는 물리 메모리와 매핑이 되어 있다. MMU는 CPU의 요청에 따라 매핑되는 페이지를 계산한다. 근데 만약에 물리 메모리에 해당 페이지 정보가 로드된 상태가 아니라면? 하드디스크를 메인 메모리로 확장하여 문제를 해결한다. (스왑 파일)

 

물리 메모리에 저장된 페이지 정보를 하드디스크에 저장하고 필요한 페이지 정보를 로드한다. 따라서 CPU는 필요한 페이지 정보에 접근할 수 있게 된다. 이러한 시스템으로 여러 프로세스가 동시에 실행되어서 메인 메모리의 크기가 넘어가도 문제 없이 동작하는 것이다. 만약 다른 프로세스가 실행되어야 한다면 메인 메모리에 올라간 프로세스의 파일을 저장/로드하는 과정을 거치게 된다. 

 

Reserve, Commit, Free

가상 메모리 크기 / 페이지 하나 크기 = 페이지 수

 

Reserve는 예약, Commit은 할당, Free는 할당되지 않음을 나타낸다. 모든 페이지는 Reserved, Commit, Free 상태 중 하나의 상태를 나타낸다. 해당 페이지가 물리 메모리(RAM, HDD)에 할당된 상태라면 Commit 상태이다. 동적할당을 하여 메모리를 받았다면 해당 페이지가 Commit 상태가 된다. 

 

물리메모리에 전혀 할당이 되지 않은 영역은 FREE로 표시된다. Reserve 상태의 페이지를 다른 할당 함수에 의해 할당되지 않도록 할 수 있으며, 일부만 Commit 상태로 변경하는 것도 가능하다. 가상 메모리 시스템은 페이지 단위로 관리되며, 페이지 중간 위치에서 할당을 시작할 수 없다. 페이지 크기의 배수 단위로 할당이 이루어진다. 

 

힙 컨트롤

힙에 메모리를 할당(new/free)을 하면 디폴트 힙 영역에 메모리를 할당하게 된다. 디폴트 힙을 구성하는 페이지의 상태는 Reserve이다. IDE 내에서 디폴트 힙의 크기를 지정할 수 있다. 그렇다면 디폴트 힙의 크기를 넘어가는 크기는 어떻게 할당을 하는거지? 라는 의문이 남는다. 디폴트 힙은 윈도우즈 시스템에서 정한 기본 크기이고 자동으로 늘어날 수 있다. 

 

디폴트 힙의 크기를 지정할 때 얻게 되는 장점은 Reserve 상태의 페이지를 그대로 사용한다는 것이다. 페이지를 Reserve 상태로 만드는 것은 리소스를 많이 사용한다. 따라서 미리 필요한 만큼 예약하고 사용한다면 성능 향상을 기대할 수 있다. 

 

동적 힙 

디폴트 힙 이외에 시스템 함수 호출을 통해서 생성되는 힙을 동적 힙(다이나믹 힙)이라고 한다. 힙을 미리 선언하면 할당된 페이지가 Reserve 상태가 되기 때문에 메모리 단편화가 발생하지 않는다. 반면에 디폴트 힙을 사용하는 경우 힙 크기 증가에 따른 메모리 단편화가 심하게 발생한다. 

 

블로킹 함수와 동기 I/O

한번 호출되면, 완료될 때까지 블로킹되는 함수를 블로킹 함수라고 하며 이 함수들을 활용한 입출력 연산을 가리켜 동기 I/O라 표현한다. I/O 작업을 진행하는 중에 버퍼링된 데이터를 토대로 영상을 보여준다면, 이것은 비동기 I/O 처리라고 볼 수 있다. 

 

중첩 I/O

블로킹 함수는 동시에 2가지 작업을 진행할 수 없다. 데이터를 읽으면서 다른 처리도 동시에 하고 싶다면 넌 블로킹 함수를 이용한다. 넌 블로킹 함수는 작업의 완료에 상관없이 바로 반환하는 특성을 지닌다. (반환 후에도 작업은 계속 된다) 중첩 I/O 모델은 여러 I/O 처리를 중첩된 형태로 진행할 수 있음을 보여준다. 

댓글