SW 개발

OS일반 / 메모리관리 / 가상메모리 관리

. . . 2009. 5. 12. 01:50
반응형
  • md 변환완료 (190927)

가상메모리

실제 메모리가 부족하여 더 이상 새로운 프로세스를 실행할 수 없는 경우 메모리를 가상으로 확장시킨다.

  • 응용프로그램이 시작되면 응용프로그램은 운영체제에게 일정량의 메모리 공간을 요구한다.
  • 운영체제는 비어있는 메모리 주소를 응용프로그램에 할당한다.
    • 만약 할당할 수 있는 빈 메모리 주소가 없을 경우 운영체제는 실제 존재하지 않는 메모리 주소를 할당한다.
  • 잘못된 메모리 주소를 할당 받은 응용프로그램은 프로세스를 실행하기 위해 존재하지 않는 메모리 주소를 사용하려고 하고 CPU는 이에 대하여 에러 메시지를 보낸다.  --> PageFault
  • PageFault가 발생되면 운영체제는 빈 메모리 공간이 있는지 확인한다. 만약 빈 메모리 공간이 있다면 운영체제는 다시 실제 존재하는 빈 메모리 주소를 할당한다. 만약, 빈 메모리 공간이 없을 경우 운영체제는 현재 메모리에서 실행 중인 프로세스 중 현재는 사용되고 있지 않은 페이지 영역을 하드디스크로 옮긴 후(Page out) 남은 공간을 응용프로그램에 할당한다.
  • page out된 영역이 사용될 경우 운영체제는 다시 다른 page를 page out 시키고 page out(이전)된 페이지를 다시 메모리를 로드한다.(Page in)

페이징 메커니즘

페이징메카니즘이란 도대체 무얼 말하는것인가?

페이지는 시스템이 인식하는 가상메모리의 단위이다. 페이지는 CPU와 운영체제에 따라 그 크기가 다양한데 보통 Intel CPU의 윈도운영체제일 경우 보통 4K의 크기를 갖는다. 가상메모리는 페이지 단위로 스왑되거나 맵된다. 여러분이 단지 한바이트의 메모리만 할당한다하더라도 시스템은 하나의 페이지를 준비한다. 또 하나의 중요한 사실은 하나의 페이지는 연속된다는 것이다. 이 말은 하나 이상의 페이지는 실제로는 연속되지 않을수도 있다는 말이다.

보호모드에서의 가상메모리는 리얼모드와 달리 산술적인 연산으로 물리주소로 연결되지 않으며, 페이지디렉토리와 페이지테이블이라는 자료구조를 통해서 실제메모리(물리메모리)로 연결된다. 실제로 가상메모리상에서는 연속되는 메모리영역이라 하더라도 실제 물리메모리상에서는 연속되지 않을수도 있다. 이러한 개념은 매우 중요한데, 예를 들면 이러하다.

내가 만약 1메가바이트의 메모리를 할당했다고 하더라도 실제로 그 메모리는 물리주소상에서 연속된다고 보장할수는 없다. 가상메모리가 3페이지에 걸쳐서 존재한다면 그에 따르는 물리주소도 3페이지만큼이 존재하지만 그들의 위치는 우리가 예상하는대로 배치되지 않을수 있다는것이다.

프로세스와 메모리 관련

내가 만든 A라는 프로그램이 있다고 치자. 그놈이 어떤 메모리를 할당했는데 그것의 시작주소가 0x70000000 이었다고 가정하자. 그런데 B라는 프로그램도 메모리를 할당하는데 그것의 시작주소 또한 0x70000000 이었다고 한다면, A, B 두 프로세스가 가지고 있는 이 두개의 메모리 영역은 과연 실제로는 어디에 존재할까?

주소는 같지만 실제로 둘은 전혀다른 메모리이다. 둘다 같은 가상주소값을 가지고 있지만 둘은 엄연히 물리주소상에서는 다른 곳을 가리키고 있다. 이것이 어떻게 가능할까?

시스템은 현재프로세스가 변할때(태스크 스위칭이 일어날때)마다 페이지디렉토리의 내용을 갱신한다. 윗부분에서 가상주소는 페이지디렉토리와 페이지테이블를 통해 물리주소와 연결된다고 했다. 따라서 이들이 변한다는것은 실제 가상주소가 가리키는 실제주소(물리주소)가 변한다는 말과 같다. 이러한 원리로 프로세스 A와 B는 서로의 공간을 전혀 알수가 없으며 이로 인해서 운영체제가 더욱 견고해지는 것이다.

그렇다면 만약 10메가 바이트의 메모리를 사용하는 프로세스 10개가 동시에 동작한다면 100메가 바이트의 물리메모리가 필요할까? 반드시 그렇지는 않다. 왜냐면 위에서 말한 페이지 스왑이라는 기법을 운영체제가 지원하기 때문이다.

운영체제는 어떠한 페이지가 현재 필요하지 않다고 판단되면 그것을 디스크에 기록한후, 물리메모리에서 해제한다. 그러다가 그 페이지가 다시 필요한 시점에서 디스크에 보관된 페이지를 다시 물리메모리로 로드한다. 이러한 일련의 작업들로써 응용프로그램들은 현재 시스템에 장착된 메모리보다 더 큰 메모리를 사용할수 있는것이다. 우리가 자주보는 시스템 오류중 하나인 페이지 폴트(page fault)는 바로 이러한 페이징에 오류가 생겼을때 발생하는데 대표적인 경우는 현재 물리메모리가 할당되어지지 않은(디스크 스왑된) 페이지를 마치 메모리에 존재하는 페이지처럼 접근하려고 할때이다. 시스템은 기본적으로 이러한 에러를 예외핸들러를 설치해서 복구하게된다.

반응형