[운영체제] Chapter10 Virtual Memory

강현주·2025년 4월 16일

10.1 Background

Chapter9에서 설명된 메모리 관리 알고리즘은 한 가지 기본 요구사항 때문에 필요하다: 실행되는 명령어는 물리 메모리에 있어야 한다. 이 요구사항을 충족하는 첫 번째 방법은, 전체 논리 주소 공간을 물리 메모리에 배치하는 것이다. Dynamic linking은 이러한 제약을 완화하는데 도움이 될 수 있지만, 일반적으로 프로그래머의 특별한 주의와 추가 작업이 필요하다.

명령어가 실행되려면 반드시 물리 메모리에 있어야 한다는 요구사항은 필요하고 타당해 보인다. 하지만, 프로그램의 크기를 물리 메모리 크기로 제한하기 때문에 부적절하다. 실제로, 실제 프로그램을 살펴보면, 많은 경우, 전체 프로그램이 필요하지 않다는 것을 알 수 있다. 예를 들어서, 다음을 고려해 보겠다:

  • 프로그램에는 종종 비정상적인 오류 조건을 처리하는 코드가 있다. 하지만, 이러한 오류는 드물게 발생하기 때문에, 이 코드는 거의 실행되지 않는다.
  • 배열, 리스트, 테이블은 실제로 필요한 것보다 많은 메모리를 할당받는 경우가 많다. 배열은 10x10 요소보다 큰 경우는 드물지만, 100x100요소로 선언될 수 있다.
  • 프로그램의 특정 옵션과 기능은 거의 사용되지 않을 수 있다. 예를 들어, U.S. 정부 컴퓨터에서 예산 균형을 맞추는 루틴은 수년 동안 사용되지 않았다.

프로그램 전체가 필요한 경우에도, 모든 프로그램이 동시에 필요하지 않을 수 있다.

메모리 일부에만 존재하는 프로그램을 실행할 수 있는 능력은 많은 이점을 준다:

  • 프로그램은 더 이상 사용 가능한 물리적 메모리 양에 제약받지 않는다. 사용자는 매우 큰 가상 주소 공간에 프로그램을 작성할 수 있어서, 프로그래밍 task가 간소화된다.
  • 각 프로그램이 차지하는 물리적 메모리가 줄어들어, 더 많은 프로그램을 동시에 실행할 수 있으며, 이에 따라 CPU 사용률과 처리량이 증가하지만, 응답 시간이나 처리 시간은 증가하지 않는다.
  • 프로그램의 일부를 메모리에 로드하거나 스왑하는 데 필요한 I/O가 줄어들어, 각 프로그램이 더 빠르게 실행된다.

따라서, 메모리에 전부 저장되지 않은 프로그램을 실행하는 것은 시스템과 사용자 모두에게 이롭다.

가상 메모리(virtual memeory) 는 개발자가 인식하는 논리 메모리와 물리 메모리를 분리하는 것을 의미한다. 이러한 분리를 통해 프로그래머는 더 작은 물리적 메모리만 사용할 수 있을 때, 매우 큰 가상 메모리를 제공할 수 있다(그림10.1).

가상 메모리는 프로그래머가 더 이상 사용가능한 물리 메모리의 양에 걱정할 필요가 없기 때문에, 프로그래밍 작업을 훨씬 쉽게 만는다. 대신 해결해야 할 문제를 프로그래밍하는 데 더 집중할 수 있다.

프로세스의 가상 주소 공간(virtual address space) 은 프로세스가 메모리에 저장되는 방식을 논리적(또는 가상) 관점에서 바라본다. 일반적으로, 이 관점은 프로세스가 특정 논리적 주소(ex: address 0)에서 시작하여 그림10.2와 같이 연속된 메모리로 존재한다는 것이다.

하지만, chapter9에서 언급했듯이, 실제로 물리적 메모리는 페이지 프레임으로 구성되며, 프로세스에 할당된 물리적 페이지 프레임은 연속적이지 않을 수 있다. 논리 페이지를 물리적 페이지 프레임에 매핑하는 것은 memory-management-unit(MMU)에 달려있다.

그림10.2에서 힙(heap)은 동적 메모리 할당에 사용되므로 메모리에서 위쪽으로 확장될 수 있다. 마찬가지로, 스택(stack)은 연속적인 함수 호출을 통해 메모리에서 아래쪽으로 확장될 수 있다. 힙과 스택 사이의 큰 빈 공간(또는 구멍)은 가상 주소 공간의 일부이지만, 힘이나 스택이 확장될 때만 실제 물리적 페이지가 필요하다. 홀을 포함하는 가상 주소 공간을 sparse(스파스, 드문드문한) 주소 공간이라고 한다. sparse 주소 공간을 사용하면, 스택이나 힙 세그먼트가 커질 때 빈 공간을 채울 수 있고, 프로그램 실행 중에 라이브러리(또는 다른 공유 객체)를 동적으로 연결할 수 있으므로 유용하다.

논리적 메모리와 물리적 메모리를 분리하는 것 외에도, 가상 메모리는 페이지 공유(섹션9.3.4)를 통해 두 개 이상의 프로세스가 파일과 메모리를 공유할 수 있도록 한다. 이를 통해 다음과 같은 이점을 얻을 수 있다:

  • 표준 C 라이브러리와 같은 시스템 라이브러리는 공유 객체를 가상 주소 공간에 매핑하여 여러 프로세스가 공유할 수 있다. 각 프로세스는 라이브러리를 자신의 가상 주소 공간의 일부로 간주하지만, 라이브러리가 물리적 메모리에 있는 실제 페이지는 모든 프로세스에 의해 공유된다(그림10.3). 일반적으로, 라이브러리는 연결된 각 프로세스의 공간에 read-only로 매핑된다.

  • 마찬가지로, 프로세스는 메모리를 공유할 수 있다. chapter3에서 두 개 이상의 프로세스가 공유 메모리를 사용하여 통신할 수 있다는 점을 기억해라. 가상 메모리를 사용하면 한 프로세스가 다른 프로세스와 공유할 수 있는 메모리 영역을 생성할 수 있다. 이 영역을 공유하는 프로세스는 해당 영역을 자신의 가상 주소 공간의 일부로 간주하지만, 실제 물리적 메모리 페이지는 그림10.3에서 볼 수 있듯이 공유된다.

  • fork() 시스템 콜을 통해 프로세스 생성 중에 페이지를 공유할 수 있으므로, 프로세스 생성 속도가 빨라진다.

0개의 댓글