본문 바로가기
시리즈/운영체제

[운영체제] 가상 메모리

by 되고싶은노력가 2025. 2. 17.

연속 메모리 할당

지금까지는 메모리 내의 프로세스들이 연속적으로 배치되는 상황을 가정했습니다. 그리고 이렇게 할당하는 방식연속 메모리 할당 방식이라고 합니다. 프로세스들을 메모리에 연속적으로 할당할 때 무엇을 고려해야 하는지, 그리고 어떤 잠재적인 문제가 있는지 알아보겠습니다.

 

스와핑

메모리에 적재된 프로세스들 중에서 현재 실행되지 않는 프로세스가 있을 수 있습니다. 이러한 프로세스들을 임시로 보조기억장치 일부 영역으로 쫓아내고, 그렇게 해서 생긴 메모리상의 빈 공간에 또 다른 프로세스를 적재하여 실행하는 방식을 스와핑이라고 합니다.

 

이때 프로세스들이 쫓겨나는 보조기억장치의 일부 영역을 스왑 영역이라고 합니다. 그리고 프로세스가 스왑 영역으로 옮겨지는 것스왑 아웃, 반대로 스왑 영역에 있는 프로세스가 메모리로 옮겨지는 것스왑 인이라고 합니다.


메모리 할당

프로세스를 빈 공간에 연속적으로 할당하는 방식에는 대표적으로 최초 적합, 최적 적합, 최악 적합 세 가지 방식이 있습니다.

 

최초 적합

최초 적합은 메모리 내의 빈 공간을 순서대로 검색하다가 적재할 수 있는 공간을 발견하면 그 공간에 프로세스를 배치하는 방식입니다. 공간을 발견하는 즉시 적재하기에 검색을 최소화할 수 있고 빠른 할당이 가능합니다.

 

최적 적합

최적 적합은 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 작은 공간에 프로세스를 배치하는 방식입니다.

 

최악 적합

최악 적합은 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 큰 공간에 프로세스를 배치하는 방식입니다.


외부 단편화

연속 메모리 할당은 외부 단편화라는 문제를 내포하고 있습니다. 프로세스들이 실행되고 종료되기를 반복하면서 메모리 사이 사이에 빈 공간들이 생깁니다. 그러다 이러한 빈 공간보다 큰 프로세스들을 적재하기 어려운 상황을 초래하고 메모리 낭비로 이어지는 현상을 외부 단편화라고 합니다.

외부 단편화를 해결할 수 있는 대표적인 방안으로는 압축이 있습니다. 압축은 여기저기 흩어져 있는 작은 빈 공간들을 모아 하나의 큰 빈 공간으로 만드는 방법입니다.

 

다만 이러한 압축 방식은 작은 메모리를 모으는 동안 시스템은 하던 일을 중지해야 하고, 메모리에 있는 내용을 옮기는 작업은 많은 오버헤드를 야기합니다. 이에 외부 단편화를 없앨 수 있는 또 다른 해결 방안이 등장했는데, 가상 메모리 기법, 그 중 페이징 기법입니다. 


페이징을 통한 가상 메모리 관리

가상 메모리는 실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술입니다. 이러한 가상 메모리 관리 기법에는 크게 페이징세그멘테이션이 있습니다.

 

페이징이란

페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 자르고, 메모리 물리 주소 공간을 프레임이라는 페이지와 동일한 크기의 단위로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법입니다.

 

페이징에서도 앞서 배운 스와핑을 사용할 수 있으며 페이징 시스템에서의 스왑 아웃은 페이지 아웃, 스왑 인은 페이지 인이라고도 부르기도 합니다.

 

이러한 방식을 통해 프로세스를 이루는 페이지 중 실행에 필요한 일부 페이지만 메모리에 적재하고 필요하지 않은 페이지들은 보조기억장치에 남겨 둠으로써 물리 메모리보다 더 큰 프로세스를 실행할 수 있습니다.


페이지 테이블

페이징 방식으로 메모리를 적재하면 불연속적으로 메모리가 배치되기에 CPU 입장에서는 이를 순차적으로 실행할 수 없게 됩니다. 즉, 다음에 실행할 명령어 위치를 찾기 어려워집니다.

 

이를 해결하기 위해 프로세스가 실제 메모리 내의 주소(물리 주소)에 불연속적으로 배치되더라도 CPU가 바라보는 주소(논리 주소)에는 연속적으로 배치되도록 페이지 테이블을 이용합니다.

 

프로세스마다 각자의 페이지 테이블을 가지고 있고 각 프로세스의 페이지 테이블들은 메모리에 적재되어 있습니다. 그리고 CPU 내의 페이지 테이블 베이스 레지스터(이하 PTBR)는 각 프로세스의 페이지 테이블이 적재된 주소를 가리키고 있습니다.

 

이처럼 페이지 테이블을 메모리에 두면 문제가 하나 존재합니다. 메모리 접근 시간이 두 배로 늘어난다는 점입니다.

 

이와 같은 문제를 해결하기 위해 CPU 곁에 (일반적으로 MMU 내에) TLB라는 페이지 테이블의 캐시 메모리를 둡니다. 캐시이기 때문에 페이지 테이블의 일부 내용을 저장하고 참조 지역성에 근거해 최근에 사용된 페이지 위주로 가져와 저장합니다.

 

CPU가 보고자하는 페이지 번호가 TLB에 있을 경우 이를 TLB 히트라고 합니다. 반대로 TLB에 페이지 번호가 없을 경우 두 번 메모리에 접근하는 수밖에 없는데 이를 TLB 미스라고 합니다.

 


내부 단편화

페이징은 외부 단편화 문제를 해결할 수 있지만, 내부 단편화라는 문제를 야기할 수 있습니다. 가령 페이지 크기가 10KB인데 프로세스의 크기가 108KB라고 했을 때, 마지막 페이지는 2KB만큼의 크기가 남습니다. 이러한 메모리 낭비를 내부 단편화라고 합니다.


페이징에서의 주소 변환

페이징 시스템에서는 모든 논리 주소가 기본적으로 페이지 번호변위로 이루어져 있습니다. 페이지 번호는 접근하고자 하는 페이지 번호이고 변위는 접근하려는 주소가 프레임의 시작 번지로부터 얼만큼 떨어져 있는지 알기 위한 정보입니다.


페이지 테이블 엔트리

페이지 테이블의 각각의 행들을 페이지 테이블 엔트리라고 합니다. 여기에는 앞에서 나온 정보 외에도 유효 비트, 보호 비트, 참조 비트, 수정 비트라는 중요 정보들도 포함됩니다.

 

유효 비트

유효 비트현재 해당 페이지에 접근 가능한지 여부를 알려줍니다. 즉, 페이지가 메모리에 적재되어 있다면 유효 비트가 1, 페이지가 메모리에 적재되어 있지 않다면 유효 비트는 0이 됩니다.

만일 CPU가 유효 비트가 0인, 적재되어 있지 않은 페이지로 접근하려고 하면 페이지 폴트라는 예외가 발생합니다.

 

보호 비트

보호 비트는 페이지 보호 기능을 위해 존재하는 비트로 해당 페이지가 읽고 쓰기가 가능한 페이지인지에 대한 정보를 나타냅니다. 복잡하게 구현한다면 읽기(Read)를 나타내는 r, 쓰기(Write)를 나타내는 w, 실행(eXecute)을 나타내는 x로 표현하며 여기에 가능한 경우는 1을 아니면 0으로 설정됩니다.

 

참조 비트

참조 비트는 CPU가 이 페이지에 접근한 적이 있는지 여부를 나타냅니다.

 

수정 비트

수정 비트는 해당 페이지에 데이터를 쓴 적이 있는지 없는지 수정 여부를 알려줍니다. 더티 비트라고도 부릅니다.

수정 비트를 통해 보조기억장치에 수정된 값을 기록하는 작업을 할지 말지 판단합니다.

페이지 교체와 프레임 할당

운영체제는 프로세스들이 한정된 메모리를 효율적으로 이용할 수 있도록 기존에 메모리에 적재된 불필요한 페이지를 선별하여 보조기억장치로 내보낼 수 있어야 하고, 프로세스들에 적절한 수의 프레임을 할당하여 페이지를 할당할 수 있게 해야 합니다.

 

요구 페이징

프로세스를 메모리에 적재할 때 처음부터 모든 페이지를 적재하지 않고 필요한 페이지만 메모리에 적재하는 기법요구 페이징이라고 합니다.

  1. CPU가 특정 페이지에 접근하는 명령어를 실행한다.
  2. 해당 페이지가 현재 메모리에 있을 경우(유효 비트가 1일 경우) CPU는 페이지가 적재된 프레임에 접근한다.
  3. 해당 페이지가 현재 메모리에 없을 경우(유효 비트가 0일 경우) 페이지 폴트가 발생한다.
  4. 해당 페이지를 메모리로 적재하고 유효 비트를 1로 설정한다.
아무런 페이지도 적재하지 않은 채 무작정 실행부터 진행하여 페이지 폴트를 일으키고, 페이지가 어느 정도 적재된 이후부터 점차 페이지 폴트의 발생 빈도를 떨어뜨리는 기법을 순수 요구 페이징 기법이라고 합니다.

 

위와 같이 요구 페이징 시스템이 작동하려면 필연적으로 페이지 교체프레임 할당, 두 가지를 해결해야 합니다.


페이지 교체 알고리즘

좋은 페이지 교체 알고리즘은 일반적으로 페이지 폴트가 가장 적게 일어나는 알고리즘을 일컫습니다. 그렇기에 페이지 교체 알고리즘을 제대로 이해하려면 페이지 폴트 횟수를 알 수 있어야 하며 페이지 폴트 횟수는 페이지 참조열을 통해 알 수 있습니다.

 

페이지 참조열은 CPU가 참조하는 페이지들 중 연속된 페이지를 생략한 페이지열을 의미합니다.

 

FIFO 페이지 교체 알고리즘

FIFO(First-In First-Out Page Replacement Algorithm) 페이지 교체 알고리즘은 메모리에 먼저 올라온 페이지부터 내쫓는 방식입니다.

 

FIFO 페이지 알고리즘은 자주 참조되는 페이지가 먼저 적재되었다는 이유만으로 내쫓길 수 있다는 문제가 있습니다. 이를 보완한 알고리즘이 2차 기회 페이지 교체 알고리즘 입니다.

 

최적 페이지 교체 알고리즘

최적 페이지 교체 알고리즘앞으로의 사용 빈도가 가장 낮은 페이지를 교체하는 방식입니다.

 

가장 낮은 페이지 폴트율을 보장하지만, 최적 페이지 교체 알고리즘은 실제 구현이 어렵습니다.

 

LRU 페이지 교체 알고리즘

LRU(Least Recently Used Page Replacement Alogorithm) 페이지 교체 알고리즘오랫동안 사용되지 않은 페이지를 교체하는 방식입니다.


스래싱과 프레임 할당

페이지 폴트가 자주 발생하는 근본적인 이유에는 프로세스가 사용할 수 있는 프레임 수가 많은 영향을 끼칩니다. 프레임이 부족하면 CPU는 페이지 폴트가 자주 발생하고 결과적으로 CPU의 이용률도 떨어집니다. 이처럼 프로세스가 실제 실행되는 시간보다 페이징에 더 많은 시간을 소요하여 성능이 저해되는 문제스래싱이라고 합니다.

 

운영체제는 스래싱 문제를 해결하고자 각 프로세스들이 무리 없이 실행하기 위한 최소한의 프레임 수를 파악하고 적절한 수만큼 할당해 줄 수 있어야 합니다.

 

균등 할당

세 개의 프로세스에 총 300개의 프레임을 할당할 수 있다면 각 프로세스에 100개의 프레임을 할당하는 방식을 균등 할당이라고 합니다.

 

비례 할당

각 프로세스의 크기에 따라 프레임을 할당해 주는 방식으로  비례 할당이라고 합니다. 합리적으로 보이나 프로세스에 크기에 비해 많은 프레임을 필요로 하지 않거나 프로세스 크기가 작아도 프레임을 많이 필요로 하는 프로세스가 존재합니다.


배분할 프레임을 결정하는 방식에는 크게 작업 집합 모델페이지 폴트 빈도를 사용하는 방식이 있습니다.

 

작업 집합 모델은 CPU가 특정 시간 동안 주로 참조한 페이지 개수만큼만 프레임을 할당하는 방식으로 실행 중인 프로세스가 일정 시간 동안 참조한 페이지의 집합 작업 집합이라고 합니다.

 

 

페이지 폴드 빈도를 기반으로 한 프레임 할당은 단순한 가정으로 생겨난 아이디어입니다.

  1. 페이지 폴트율이 너무 높으면 그 프로세스는 너무 적은 프레임을 갖고 있다.
  2. 페이지 폴트율이 너무 높으면 그 프로세스는 너무 많은 프레임을 갖고 있다.

 

페이지 폴트율이 상한선보다 더 높아지면 그 프로세스는 너무 적은 프레임를 갖고 있다고 볼 수 있기에 프레임을 더 할당해주고, 반대로 페이지 폴트율이 하한선보다 더 낮아지면 다른 프로세스에 할당하기 위해 프레임을 회수합니다.