[OS] 가상 메모리

얄루얄루·2022년 9월 18일
0

Computer Science

목록 보기
9/10

등장 배경

여러 프로세스를 동시에 돌리려니 모든 프로세스를 전부 메모리에 올리기에는 메모리 크기의 한계에 봉착함 -> 이를 극복할 어떤 기술의 필요성 대두

프로세스 내에는 여러 데이터들이 들어가 있지만 그 모든 데이터들이 계속해서 빈번하게 프로세서에 의해 사용되지는 않음 -> 당장 쓰이지 않는 데이터는 굳이 메모리에 올려두지 않아도 프로세스 실행에는 문제가 없음

쓰이지 않는 데이터라고 해도 메모리 주소를 프로세스가 가지고는 있어야 나중에라도 CPU가 접근 가능 -> 실제로는 메모리에 없지만 있는 것처럼 보이게 하면 어떨까?

가상 메모리

  • 메모리가 실제 메모리보다 많아 보이게 하는 기술
  • 실제 사용하는 메모리의 크기는 얼마 되지 않는다는 데서 고안 됨
  • 프로세스 공간 분리로 프로세스 이슈가 전체 시스템에 영향을 주지 않음

원리

  • 프로세스는 가상 주소를 사용. 해당 주소를 통해 데이터를 읽고 쓸 때에만 물리 주소로 변환
  • 물리 메모리에 올라 갈 필요가 없는 데이터는 덩치가 큰 보조 메모리에 집어넣어 데이터 보존 및 메인 메모리 공간 확보

Memory Menagement Unit (MMU) : 가상 주소 -> 물리 주소 변환을 담당하는 H/W 장치

페이징 시스템

가상 메모리 기술의 구현 방법 중 하나이며, 현 시대에 가장 메이저한 방법

  • 크기가 동일한 페이지로 가상 주소 공간과 물리 주소 공간을 관리
  • 하드웨어 지원이 필요 (e.g. Intel x86 시스템은 4KB, 2MB, 1GB 지원)
  • 페이지 번호를 기반으로 가상 주소/물리 주소 매핑 정보(Page Table)를 기록/사용
  • Page Table에는 각 페이지의 번호와 첫 주소, 현재 메모리에 올라와 있는 지의 여부만 기록
  • 가상 주소는 페이지 번호 + 변위(해당 페이지의 첫 주소와의 차이)로 변환 가능
  • 물리 주소를 찾을 때는 첫 주소의 실 주소 + 변위로 계산

예를 들어, 가상 주소 0x00004105는

정해진 길이에 따라 앞부분을 페이지 넘버 0x00004, 뒷부분을 변위 0x105로 나눈다.

페이지 넘버를 가지고 페이지 테이블에 가서 물리 주소를 찾는다

물리 주소 0x0007에 변위 0x105를 합쳐 최종 물리 주소를 찾는다.

페이징 시스템 생성 및 사용 과정

  • 프로세스 생성 시, 물리 메모리에 페이지 테이블 정보 생성 후 pcb에 저장
  • pcb 등에서 해당 페이지 테이블 접근 가능하고, 관련 정보는 물리 메모리에 적재
  • 프로세스 구동 시, 해당 페이지 테이블 base 주소가 별도 레지스터 (CR3)에 저장
  • MMU가 해당 프로세서의 page table에 해당 가상 주소가 포함된 page 번호가 있는 지 확인
  • page 번호가 있으면 이 page가 매핑된 첫 물리 주소를 알아냄(p')
  • p' + d(변위)가 최종 물리 주소

다중 단계 페이징 시스템

  • 미리 페이징 정보를 만들어놓지 않고, 특정 페이징 주소 영역(디렉토리)에 대해서만 만들어 놓는다.
  • 32bit 시스템에서 4kb 페이지를 위한 페이징 시스템은 하위 12bit = 오프셋, 상위 20bit가 페이지 번호. 즉 2^20개의 페이지 정보가 필요
  • 페이징 정보를 단계를 나누어 생성. 당장 필요 없는 페이지는 생성하지 않으면 시간/공간 절약 가능.
  • 이 경우 CR3 레지스터에는 페이지 디렉토리의 주소를 넣고, 해당 디렉토리에서 필요한 페이지 테이블을 찾고, 또 해당 페이지 테이블에서 변위 참조하여 실물리 주소를 찾음

요구 페이징

  • 프로세스의 모든 페이지를 메모리로 적재하지 않고, 실행 중 필요한 시점에서만 메모리로 적재
  • 선행 페이징(anticipatory paging or prepaging)의 반대 개념
  • 더 이상 필요하지 않은 페이지 프레임은 다시 저장매체에 저장 (페이지 교체 알고리즘)
  • 찾는 페이지 없을 경우 Page fault 인터럽트 발생

페이지 폴트

  • 어떤 페이지가 실제 물리 메모리에 없을 때 일어나는 '인터럽트'
  • Page fault가 일어나면 운영체제가 해당 페이지를 물리 메모리에 올림
  • 페이지 올리고 cpu에게 같은 페이지 재요청을 요청

Page replacement policy

  • 페이지 폴트 발생을 줄여보고자 나온 방법 중 하나
  • 물리 메모리가 full일 때 페이지 폴트 발생하면, 기존 페이지 중 하나를 물리 메모리에서 저장 매체로 내리고 새로운 페이지를 물리 메모리에 올린다

Page replacement algorithm

  • 페이지 교체 시 어떤 페이지를 물리 메모리에서 저장 매체로 내릴 것인가를 결정하는 알고리즘
  • FIFO : 먼저 올라온 것부터 내림
  • OPT (Optimal) : 앞으로 가장 오랫동안 사용하지 않을 페이지를 내림. 일반 OS에서는 구현 불가
  • LRU(Least Recently Used) : 가장 오래전에 사용된 페이지를 내림. 참조의 국한성에 의거해 가장 효율적으로 동작.
  • LFU(Least Frequently Used) : 가장 적게 사용된 페이지를 내림
  • NUR(Not Used Recently) : LRU와 마찬가지로 최근에 사용하지 않은 페이지부터 내림. 각 페이지마다 참조 비트 (R), 수정 비트 (M)을 둠 (R, M). 그리고 (0, 0) > (0, 1) > (1, 0) > (1, 1) 순으로 페이지 교체

스레싱(Thrashing)
반복적으로 페이지 폴트가 발생해서 과도한 페이지 교체 작업이 일어나 실제로는 아무 일도 하지 못하는 상황

Translation Lookaside Buffer (TLB, 페이지 정보 캐쉬)

  • 기존 가상 메모리 구조에서는 MMU가 메모리에 접근을 해야 하기에 레지스터/캐시메모리 접근에 비해 상대적으로 시간이 오래걸림
  • TLB는 최근에 CPU가 요청한 가상 주소에 대한 물리 주소 정보를 저장하고 있음

TLB 사용 시

  1. CPU가 가상 주소에 접근을 시도하면 MMU가 우선 TLB에서 해당 주소를 찾음

  2. 없다면 기존 방법대로 페이지 테이블에서 찾음

TLB, 페이지 폴트 포함한 전체적인 실행 과정

  • CPU -> MMU : Virtual address 요청
  • MMU -> TLB : TLB 확인
  • MMU -> Memory : CR3의 base address 가지고 테이블 확인
  • Memory -> OS : 테이블에 페이지 없다면 페이지 폴트 발생
  • CPU -> MMU : 페이지 폴트 처리 후, 가상 주소 접근 재요청
  • Memory -> CPU : 데이터 전달

페이지 폴트 발생 시,

  • OS -> Storage : 저장 공간에서 페이지 블록 검색
  • Storage -> Memory : 검색 된 페이지 블록 메모리에 탑재
  • Memory : 페이지 테이블 업데이트
  • OS -> CPU: 가상 주소 접근 재요청을 요청

Segmentation

페이징이 프로세스를 모두 동일한 단위로 조각낸다면, 세그멘테이션은 각기 다른 크기로 조각을 낸다.

예를 들어,
Stack 영역은 Page로 따지면 5개와 맞먹는 크기의 세그먼트1.
Heap 영역은 Page 3개와 맞먹는 세그먼트2.
이런 식이다.

그 외에 동작 과정에서 크게 다를 바는 없지만, 단점이 다르다.

Paging의 단점
내부 단편화 : 고정 된 크기이기에 5KB의 영역을 4KB의 페이지로 나누면 2번째 페이지는 3KB의 빈 공간으로 메모리를 낭비

Segmentation의 단점
외부 단편화 : Page에 비해 덩치가 크기 때문에 메모리의 총 빈 공간은 넣을 Segment에 비해 크지만, 이 공간이 조각 나 있어 여기저기 흩어져 있을 경우에 각 빈 공간의 크기는 넣을 Segment에 비해 작게 되므로 넣을 수가 없다.
H/W 지원 부족: Paging과 Segmentation 둘 다 H/W 지원이 필요한데, 지원되는 H/W 종류가 이쪽이 더 적다.

References

profile
시간아 늘어라 하루 48시간으로!

0개의 댓글