Computer Science/운영체제

[OS] 가상 메모리(Virtual Memory)와 페이징

findTheValue 2021. 10. 21. 05:23

가상메모리(VM != Virtual Machine)

  • 다중 프로그래밍 = 많은 프로세스를 동시에 메모리에 올려야함.
  • 프로세스 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법.
  • 물리 메모리보다 프로그램이 커도 된다.
  • 메모리 오버레이 기법에서 나머지를 관리하기 위한 공간
  • 보통 SSD로 C드라이브가 아닌 D드라이브 등에 가상메모리를 설정하는게 좋음.
  • 만약 C가 SSD고 D가 HDD면 그냥 C에 설정.
  • 윈도우 가상메모리 파일 이름은 pagefile.sys

 

개발 배경

  • 가상메모리 이전 : 모든 코드는 물리메모리에 존재. 메모리 용량보다 큰 프로그램 실행 불가.
  • 용량의 한계, 페이지 교체 등 성능이슈. 가끔 사용하는 코드가 항상 메모리에 올라올 필요 x

 

가상 메모리를 사용하면?

  • 물리 메모리 크기에 제약 받지 않음.
  • 더 많은 프로그램 동시 실행 가능.
  • 응답 시간 유지, CPU 이용률, 처리율 상승
  • swap에 필요한 입출력이 줄어들기 때문에 실행이 빨라짐.(context switch, kernel 개입 최소화)
swap은 메모리 공간 부족을 해소하기 위해 주 기억장치와 보조 기억장치로 프로세스를 불러오고 내보내는 행위.

 

 

 

가상 메모리가 하는 일.

 

  • 물리 메모리 + 논리 메모리로의 분리. 작은 메모리로 큰 가상 주소 공간을 프로그래머에 제공.

 

가상 주소 공간

  • 한 프로세스가 메모리에 저장되는 논리적인 공간.
  • 프로세스가 요구하는 메모리 공간을 가상 메모리에서 제공함으로써
  • 현재 필요하지 않은 메모리 공간은 실제 물리 메모리에 올리지 않음.

| `Stack` | free (60KB) | `Heap` | `Data` | `Code` |

 

프로세스간 페이지 공유.

가상메모리의 역할

  • 시스템 라이브러리가 여러 프로세스 사이에 공유될 수 있도록 한다.
  • 각 프로세스는 공유 라이브러리를 자신의 가상 주소 공간에 두고 사용하는 것처럼 인식하지만
  • 사실 라이브러리가 실제 올라간 물리 메모리 페이지들은 모든 프로세스가 공유하는 형태이다.
  • 프로세스들은 공유 메모리를 통해 통신한다.
  • `fork()`를 통한 프로세스 생성 과정에서 페이지들이 공유하는걸 가능하게 한다.

 


 

Demand Paging(요구 페이징)

 

  • 프로그램 실행 시작 시 초기에 필요한 것들만 물리 메모리에 적재하는 전략.
  • 대개 페이지로 관리.

페이징: 하나의 프로세스가 사용하는 메모리 공간은 연속적일 필요 없다.

물리 메모리는 frame이라는 고정크기로 분리, 논리 메모리(프로세스가 점유하는)는 페이지라 불리는 고정 크기의 블록으로 분리된다.

연속되어 저장되지 아니하고 물리 메모리의 남는 프레임에 적절히 배치된다.

하나의 프로세스가 사용하는 공간은 여러개의 페이지로 나뉘어 논리메모리에서 관리되고 개별 페이지는 순서에 상관없이 물리메모리의 frame에 mapping되어 저장된다.

고정크기의 블록이기 때문에 페이지크기 10에 33이 요구되면 4페이지의 마지막에 7이 남는 내부 단편화가 발생할 수 있다.

  • 가상 메모리에서 필요해질 때 페이지가 적재된다. 즉 접근되지 않은 페이지는 물리메모리에 적재x

 

페이지 교체

  • 모든 항목이 물리메모리에 없기 때문에 프로세스가 필요한 페이지 요청 간 page fault(페이지 부재) 가 일어날 수 있고 이때 원하는 페이지를 보조저장장치에서 swap-in해 가져오게 된다. (반대로 가상메모리로 페이지를 가져가는 것은 swap-out) - swap하는 비용은 성능 저하를 야기하기 때문에 메모리 여유율을 유지하는 것이 성능에 중요함.
  • 이때 물리 메모리가 모두 사용중이면 페이지 교체가 이루어지거나 프로세스 강제 종료가 일어난다.

 

과정

  1. 디스크에서 필요한 페이지 위치를 찾음
  2. 빈 페이지 프레임을 찾음
    • 페이지 교체 알고리즘을 통해 희생될(victim) 페이지를 고름
    • 희생될 페이지를 디스크에 기록하고, 관련 페이지 테이블을 수정한다.
  3. 새롭게 비워진 페이지 테이블 내 프레임에 새 페이지를 읽어오고, 프레임 테이블을 수정
  4. 사용자 프로세스 재시작.

 


 

페이지 교체 알고리즘(메인메모리 frame이 가득찼을 때 운영체제가 관리)

  • FIFO(First-In First-Out)
    • 이해와 구현이 쉽다.
    • 오래된 페이지가 항상 불필요한 정보를 포함하는 것은 아니다.
    • 자주쓰이는 페이지를 교체시켜 부재율이 높아질 수 있다.
    • Belady의 모순: 페이지 프레임의 갯수를 늘려도 페이지 부재가 더 많이 발생하게 된다.
  • OPR(Optimal Page Replacement)
    • 앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체.(Belady의 모순이 발생 x)
    • 가장 낮은 페이지 부재율
    • 구현이 어려움(모든 프로세스 메모리 참조 계획을 미리 알아야 가능(신만 가능))
  • LRU(Least Recently Used)
    • 가장 오래 사용되지 않은 페이지를 선택해 교체
    • FIFO < LRU < OPT
  • LFU(Least Frequently Used)
    • 참조횟수가 가장 적은 페이지 교체(자주쓰이면 미래도 많이 쓰일 것이다.)
    • 특정 체이지를 집중적으로 사용. 그러나 다른 기능을 사용할때 안써도 되는데 계속 메모리에 머물러 초기 가정이 어긋날 수 있음.
    • 최적(OPT) 페이지 교체를 제대로 근사할 수 없어 잘 안쓰임
  • MFU(Most Freaquently Used)
    • 참조 횟수가 가장 작은 페이지가 최근에 올라오면 앞으로 계속 사용될 것이다.라는 가정
    • LFU와 비슷하게 잘 안쓰임.
  • clock Algorithm
    • 각 page마다 상태 bit0, 1을 가지고 교체되면 한바퀴 돌면서 1은 0으로 0은 교체 대상이 되는 알고리즘
    • TLB의 도움을 받음.
  • 변경사항 반영 등 모두 운영체제가 담당함.

 


Thrashing

  • frame이 가득차면 page fault가 일어나고 swap이 일어남. 이때 CPU가 놀게됨.
  • 그럼 운영체제는 더 많은 프로세스를 메모리에 불러옴(악순환.)\
  • 이를 해소하기 위해 Working set알고리즘과 Page Fault Frequency 알고리즘 사용.
  • working set은 특정 시간마다 page갯수를 파악하고 그만큼 frame이 비면 교체를 진행( set단위로)
  • frame이 가득하면 또 working-set단위로 쫓아냄
  • PFF는 page fault 비율에 따라 지급하는 Frame갯수을 조정함. 부족하면 프로세스 단위로 쫓아냄

 

메모리 고갈시

  • 프로세스 Swap 활발 -> CPU 사용률 하락
  • 운영체제 프로세스 추가 쓰레싱 발생
  • 쓰레싱 해소 안되면 Out of Memory 상태로 판단
  • 중요도가 낮은 프로세스를 찾아 강제 종료
CPU 사용률을 계속 체크하는 이유는
CPU사용률이 급격하게 떨어진다는 것은 page fault가 일어나고 있을 확률이 높다는 뜻이고
메모리 적재량 확인과 함꼐 쓰레싱 유무를 확인해야 하기 때문.
그 후 추가적인 서버자원을 배치하는 등 해결 방안을 마련해야 한다.

 


 

더 공부할 것.

 

Reference