개발자는 기록이 답이다

운영체제 Ch.5 - 가상메모리와 스와핑, 페이지폴트 그리고 스레싱 본문

CS/운영체제

운영체제 Ch.5 - 가상메모리와 스와핑, 페이지폴트 그리고 스레싱

slow-walker 2023. 10. 17. 00:41

 

가상 메모리(virtual memory)는 OS에서 사용되는 메모리 관리 기법의 하나로 컴퓨터가

실제로 이용가능한 메모리 자원(실제주소, physical address)을 추상화하여 이를 사용하는

사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말합니다.

 

[참고]

가상주소는 MMU와 페이지테이블(page table)에 의해 실제 주소로 변환됨.

페이지 : 가상 메모리를 사용하는 최소 크기 단위

프레임 : 실제 디스크나 메모리를 사용하는 최소 크기 단위

프로세스가 메모리를 필요로 할 때, 가상 메모리를 기반으로 특정 메모리가 필요하다고 요청합니다. 이 요청은 다음과 같이 이루어집니다:

  1. 가상 메모리 요청: 프로세스가 가상 메모리 상에서 필요한 메모리 주소를 요청합니다.
  2. 페이지 테이블 매핑: 내부적으로, 가상 메모리의 페이지들은 메모리 관리 유닛(MMU)에 의해 관리되는 페이지 테이블을 기반으로 실제 메모리 주소와 매핑됩니다.

가상 메모리는 종종 가상 메모리와 물리적 RAM 간의 추상화 기준을 제공합니다.

다시말해서 작은 메모리를 크게 만들어서 사용자가 좀 더 많은 프로세스를 구동할 수 있게끔 구현한 것입니다.이것은 다음과 같은 몇 가지 이점을 제공합니다:

  • 메모리 효율성: 가상 메모리 시스템을 통해 작은 물리적 메모리를 크게 확장하여 더 많은 프로세스를 동시에 실행할 수 있습니다.
  • 주소 매핑: 내부적으로, 실제 램의 주소와 가상 메모리 주소 간에 매핑이 이루어집니다. 이것은 페이지 테이블에 의해 관리되며 MMU에 의해 관리됩니다.

가상 메모리와 페이지 테이블은 운영체제의 중요한 요소 중 하나로, 메모리 관리 및 프로세스 간 메모리 격리를 유지하는 데 중요한 역할을 합니다. 페이지 테이블은 물리적 메모리와 가상 메모리 간의 매핑을 관리하며, 이것은 MMU에 의해 효율적으로 처리됩니다.

 

페이지테이블

가상 메모리는 가상주소와 실제주소가 매핑되어있는 페이지 테이블로 관리되며 이 때 속도

향상을 위해 캐싱계층인 TLB를 씁니다. 가상주소에서 바로 페이지테이블을 가는게 아니라 TLB에서 있는지를 확인하고 만약 없다면 페이지테이블로 가서 실제주소를 가져옵니다

위의 그림을 좀 더 자세하게 나타내면 아래와 같습니다:

가상 메모리 시스템에서 가상 주소는 실제 주소로 매핑됩니다. 이 과정에서 TLB라는 중간 계층이 사용됩니다.

  1. 가상 주소 매핑: 프로세스가 가상 주소를 참조할 때, 이 가상 주소가 실제 주소로 어떻게 매핑되는지가 중요합니다.
  2. TLB의 역할: TLB는 Translation Lookaside Buffer의 약자로, 가상 주소와 실제 주소 간의 매핑 정보를 저장합니다. 이 정보는 주소 변환을 빠르게 하기 위해 사용됩니다.
  3. TLB 조회: 가상 주소를 참조할 때 시스템은 먼저 TLB를 확인합니다. TLB에 해당 가상 주소의 매핑 정보가 있다면 실제 주소로 바로 이동할 수 있습니다.
  4. TLB 미스: 그러나 만약 TLB에 해당 정보가 없다면, 페이지 테이블을 통해 가상 주소를 실제 주소로 매핑합니다. 이렇게 변환된 정보는 TLB에도 저장되어 미래의 참조를 위해 활용됩니다.

페이지폴트와 스와핑

앞서 설명한 것처럼 가상메모리는 작은 메모리를 매우 큰 메모리로 보이게끔 하는 것이기 때문에 가상메모리는 있는데, 참조하려는 실제 메모리 영역이 없을 수도 있습니다.

이 때 메모리의 당장 사용하지 않는 영역을 하드디스크로 옮기고 하드디스크의 일부분을 “마치 메모리처럼” 불러와 쓰는 것을 스와핑이라고 합니다.

즉, 가상메모리에는 존재하지만 실제 메모리인 RAM에는 현재 없는 데이터나 코드에 접근할 경우가 있으며 이 때 페이지 폴트가 발생합니다.

스와핑 동작 원리 그림

페이지 폴트의 과정

페이지 폴트가 일어난 다음 스와핑이 일어난다. 페이지 폴트 과정을 좀 더 자세히 알아보고자 합니다. 다음과 같은 일련의 과정을 거쳐서 일어납니다.

  1. 어떤 명령어가 유효한 가상주소에 접근했으나 해당 페이지가 만약 없다면 트랩이 발생되어 운영체제에 알리게 됩니다.
  2. 운영체제는 실제 디스크로부터 사용하지 않은 프레임을 찾습니다.
  3. 해당 프레임을 실제 메모리에 가져와서 페이지교체알고리즘을 기반으로 특정페이지와 교체합니다. (이 때 스와핑이 일어납니다.)
  4. 페이지테이블을 갱신시킨 후 해당 명령어를 다시 시작합니다.
1. 내가 참조하려는 메모리 영역이 없으면
2. 트랩이 발생해서 운영체제에게 알린다
3. 운영체제는 디스크로부터 사용하지 않는 프레임을 찾는다
4. 프레임을 찾은 후 페이지 교체 알고리즘을 기반으로 스와핑한다
5. 해당 페이지 테이블을 갱신시킨다
6. 그리고 나서 다시 해당 instruction 명령어를 다시 실행 시킨다

스레싱

스레싱은 메모리의 페이지 폴트율이 높은 것을 의미합니다. 스레싱은 메모리에 너무 많은 프로세스가 동시에 올라가게 되면 스와핑이 많이 일어나서 발생합니다. 즉, 페이지 폴트가 많이 일어나면 스와핑도 많이 일어는데, 그러한 상황을 스레싱이라고 합니다.

페이지폴트가 일어나면 CPU 이용률은 낮아집니다. CPU 이용률은 낮아지게 되면 운영체제는 CPU의 가용성을 높이기 위해 더 많은 프로세스를 메모리에 올리게 됩니다. 이러한 악순환이 반복되어 스레싱이 일어나게 됩니다.

프로세스를 많이 올리다보면 빨간색 화살표부터 페이지 폴트가 많이 발생하고,

프로세스가 많으니까 메모리 참조를 많이하게 되고 부족해진 메모리 때문에 스와핑이 많아지는데, 스와핑을 많이 할 수록 CPU의 이용도가 줄어든다. 그러면 운영체제는 CPU가 일을 안한다고 생각해서 일을 더 주는 것입니다(프로세스를 더 주는 것) 그래서 더욱더 CPU이용률을 떨어지게 되는 것입니다.

이를 하드웨어적으로 해결하는 방법으로는 메모리를 늘리거나 (8GB를 사용했다면 32GB로 늘려서 페이지폴트를 최소화 시키고 스레싱을 막을 수 있습니다) HDD를 사용한다면 HDD를 조금 더 빠른 SSD로 바꾸는 방법이 있으며 운영체제에서 해결하는 방법은 작업세트와 PFF가 있습니다.

작업세트

작업세트(working set)는 프로세스의 과거 사용이력을 기반으로 많이 사용하는 페이지집합을 만들어 한꺼번에 미리 메모리에 로드하는 것을 말합니다.

PFF

PFF(page fault frequency)는 페이지 폴트 빈도를 조절하는 방법으로 상한선과 하한선을 만들고 상한선에 도달한다면 프레임을 늘리고 하한선에 도달한다면 프레임을 줄이는 방법입니다.

가상 메모리의 필요성

주기억장치의 효율적 관리(스와핑)

하드디스크를 주기억장치에 대한 캐시로 설정하여, 당장 사용하는 영역만 유지하고 쓰지 않는 데이터는 하드디스크로 옮긴 뒤, 필요할 때만 램에 데이터를 불러와 올리고 다시 사용하지 않으면 하드디스크로 내림으로써 램을 효과적으로 관리하게 됩니다.

메모리 관리의 단순화

각 프로세스마다 가상메모리의 통일된 주소 공간을 배정할 수 있으므로 메모리 관리가 단순해집니다. → 가상 메모리를 통해 여러 프로세스가 메모리를 공유할 수 있습니다. 예를 들어, 프로세스 A가 특정 메모리 영역을 참조하고 있다면, 다른 프로세스 B도 동일한 메모리 영역을 참조할 수 있습니다.

메모리 용량 및 안정성 보장

한정된 공간의 램이 아닌 거의 무한한 가상메모리 공간을 배정함으로써 프로세스들끼리 메모리 침범이 일어날 여지를 크게 줄이게 됩니다.

→ 가상 메모리는 작은 물리적 메모리를 기반으로 큰 가상 메모리를 제공하므로, 메모리 공간의 침범 문제를 방지할 수 있습니다.

→ 침범을 안하는 이유? 페이지 교체, 가상 메모리 주소 공간, 접근 권한 제어, 메모리 보호 등의 기술을 통해 침범 방비