gimmickbutreal

[CS] 가상 메모리 본문

CS

[CS] 가상 메모리

isshosng 2024. 12. 17. 21:01

사용자가 프로그램을 실행하면 운영체제는 디스크에 저장된 데이터를 메모리로 로드합니다. 하지만 메모리 공간은 한정되어 있고, 사용자는 동시에 많은 프로그램을 실행하고 싶어하는 상황에 놓이게 됩니다. 이러한 딜레마의 해결사로 가상 메모리가 등장했습니다.
 

가상 메모리(virtual memory)는 프로세스의 일부만 메모리에 로드하고, 나머지는 디스크에 둔 상태로 프로세스를 실행하는 방식입니다. 

쉽게 말해서, 가상 메모리는 한정된 메모리 공간을 효율적으로 사용하기 위해 등장했습니다. 
 
 

By Ehamberg - 자작, CC BY-SA 3.0

 
 
위 그림과 같이 물리 메모리에 프로세스 일부를 로드하고, 프로세스의 나머지 영역은 디스크에 두면 더 많은 프로세스를 메모리에 로드할 수 있습니다.
 
그렇기 때문에 다음과 같은 장점이 있습니다

 

가상 메모리의 장점

 

  1.  프로그램이 메모리 크기에 대한 제약을 덜 받을 수 있다.
    -> 가상 메모리는 프로그램 전체를 물리 메모리에 올릴 필요가 없으므로, 실제 RAM 크기보다 큰 프로그램도 실행할 수 있습니다. 예를 들어, 물리 메모리가 4GB 뿐이어도 8GB 크기의 프로그램을 실행할 수 있는 환경을 제공합니다. 이로 인해, 개발자는 메모리 크기 제한을 신경 쓰지 않고 더 큰 프로그램을 설계할 수 있으며, 사용자도 더 복잡한 애플리케이션을 실행할 수 있습니다.

  2. 동시에 많은 프로그램을 실행하므로 CPU 이용률과 처리율을 높일 수 있다.
    -> 가상 메모리는 여러 프로그램의 일부만 물리 메모리에 로드하고, 나머지는 디스크에 유지하기 때문에 더 많은 프로세스를 메모리에 올릴 수 있습니다. 결과적으로, 멀티태스킹 환경에서 더 많은 프로그램들이 동시에 실행될 수 있으며, 프로세스들이 CPU를 사용할 기회를 더 자주 얻습니다. 이로 인해, CPU가 작업할 데이터와 코드를 더 많이 확보하므로, 유휴 상태를 주링고 시스템 전반의 처리율이 증가합니다.

  3. 필요한 영역만 메모리에 로드해 스와핑 횟수를 줄여서 프로그램 실행 속도를 높일 수 있다.
    -> 가상 메모리는 프로그램의 실행 중에 필요한 페이지만 물리 메모리로 로드합니다. 이는 디스크 I/O를 최소화하고, 불필요하게 전체 프로그램을 물리 메모리에 로드하지 않으므로 메모리 사용 효율성을 극대화합니다. 또한, 디스크와 물리 메모리 간의 스와핑 횟수를 줄이기 때문에 실행 속도가 빨라집니다. 이로 인해, 자주 사용되는 물리 메모리에 유지하고, 필요 없는 데이터를 디스크로 이동시킴으로써 프로그램이 더 원활히 실행됩니다.

 

가상 메모리의 단점

위와 같은 장점에도 불구하고, 가상 메모리는 몇 가지 단점도 있습니다.

  1. 디스크 의존성 증가
    -> 페이지를 디스크에서 읽어오는 작업이 잦아지면, 시스템 성능이 디스크 속도에 의해 제한될 수 있습니다.

  2. 페이지 폴트(Page Fault)
    -> 필요한 페이지가 물리 메모리에 없을 경우, 디스크에서 데이터를 읽어와야 하는데, 이 과정이 과도하면 스레싱(Thrashing) 현상이 발생할 수 있습니다.

  3. 추가적인 메모리 관리 비용
    -> 운영 체제가 페이지 테이블과 같은 데이터 구조를 유지하며 추가적인 오버헤드가 발생합니다.

 

요구 페이징과 페이지 폴트

보통 이러한 가상 메모리 기법은 요구 페이징(demand paging) 기법을 사용하게 됩니다. 

요구 페이징은 프로세스에서 필요한 페이지만 메모리에 로드하는 방식입니다. 페이지를 모두 메모리에 로드하지 않고 초기엔 필요한 영역에만 로드한 후에, 다른 영역은 요청(request)이 올 때 메모리에 로드합니다.

 

 

요구 페이징 & 페이지 폴트

 

요구 페이징은 대략 이런 흐름으로 이어집니다.

가정) 네 개의 페이지 P0, P1, P2, P3가 있는 프로세스 P를 실행한다.

 

1. 프로그램 실행 & 페이지 테이블 생성

프로그램을 시작하면 운영체제는 해당 프로그램에 특정 양의 메모리를 할당하고, 해당 프로그램에 대해 프로세스를 설정합니다.

어떤 프로그램이 어느 메모리에 있고, 어느 페이지가 디스크에 있는지 추적하기 위해 운영체제는 각 프로세스에 대한 페이지 테이블을 만듭니다.

 

2. 페이징 폴트(page fault) 관리

프로그램이 현재 메모리에 없는 페이지에 접근하려고 할 때 페이징 폴트가 발생한다고 말합니다. 필요한 페이지가 디스크에 있는지 확인하기 위해선 운영체제가 애플리케이션을 일시 중지하고 페이지 테이블을 참조합니다.

 

3. 페이지 가져오기(page fetch)

운영체제는  디스크에 필요한 페이지가 있으면 디스크에서 검색해서 메모리에 로드합니다. 이렇게 되면, 메모리에서 페이지의 새로운 위치가 페이지 테이블에 반영됩니다.

 

4. 프로그램 재개(Resuming the program)

운영체제는 필요한 페이지가 메모리에 로드되면 중단된 부분부터 다시 시작합니다.

 

5. 페이지 교체(page replacement)

프로그램에 필요한 모든 페이지를 보관할 만큼 충분한 메모리의 여유가 없다면, 운영체제는 페이지 교체를 실시합니다.

 

6. 페이지 정리(page cleanup)

프로세스가 종료되면 운영체제는 프로세스에 할당된 메모리를 해제하고 페이지 테이블에서 해당 항목을 정리합니다. 

 

스레싱(thrashing)

스레싱은 동시에 일정 수 이상의 프로그램을 실행했을 때 오히려 CPU 이용률이 떨어지는 상황을 말합니다.

 

스레싱 발생 시점

 

가상 메모리를 구현해 다중 프로그래밍을 하면 cpu 이용률이 높아지지만 페이지 폴트가 자주 일어나게 됩니다. 메모리 관리를 실패해서 시스템이 실제 작업보다 페이지 교체 작업에 더 많은 시간을 소비하기 때문입니다. 이를 예방하기 위해 워킹 세트(working set)를 설정하는 방법이 있습니다.

 

워킹 세트는 지역성(locality)을 기반으로 자주 사용하는 페이지를 저장해 두는 기법인데, 이를 바탕으로 자주 사용하는 페이지를 물리 메모리의 프레임에 고정하여 이러한 문제를 예방할 수 있습니다.

 

 

반응형

'CS' 카테고리의 다른 글

브라우저의 기본 구조  (0) 2024.11.03
[Java] JVM이란 무엇일까?  (0) 2023.11.16
[Network] OSI 7 Layer (OSI 7계층) - 요약  (0) 2023.09.21
스택과 큐 Stack & Queue  (0) 2023.07.12
연결리스트 LinkedList  (0) 2023.07.12