본문 바로가기
Study/CS

03 - 5 가상 메모리

by dailycoding777 2025. 2. 19.

가상 메모리 (Virtual Memory)

물리 메모리보다 더 큰 메모리를 쓰는 기술

1️⃣ 물리 메모리(RAM)보다 더 많은 메모리를 사용할 수 있도록 하는 기법으로, 실제 메모리보다 큰 공간을 제공함.

2️⃣ 디스크의 일부를 “스왑 영역(Swap Space)"로 활용하여 부족한 RAM을 보완함.

3️⃣ 페이지 단위로 메모리를 관리하며, 자주 사용하는 페이지는 RAM에, 덜 쓰는 페이지는 디스크로 이동 (페이지 교체).

4️⃣ 장점: 프로세스당 큰 메모리 공간 사용 가능, 멀티태스킹 효율 증가, 프로그램 간 메모리 보호 제공.

5️⃣ 단점: 디스크 접근 속도가 RAM보다 느려 페이지 폴트(Page Fault)가 많아지면 성능 저하 발생. 🚀

물리주소와 논리 주소

  • 물리 주소(physical address) : 하드웨어 상 실제 주소
  • 논리 주소(logical address) : CPU가 생성한 주소로, 가상 메모리에서의 위치를 나타내며 물리 주소로 변환(MMU)되어 실제 메모리에 매핑됨.
  • 프로세스마다 부여되는 0번지부터 시작되는 주소 체계
  • EX ) 현재 메모리 상에 웹 브라우저,메모장,게임 프로세스가 적재 → 이 모든 프로세스에는 0번지부터 시작하는 각자의 논리주소를 가지고 있는 셈
  • 중복되는 논리주소의 번지수는 얼마든지 존재할 수 있음.(물리 X)
  • 하지만 실제로 정보가 저장되어 있는 하드웨어 상의 메모리와 상호작용하기 위해선
  • 반드시 논리 주소와 물리 주소간의 변환이 이루어져야 한다.

그래서 존재하는 하드웨어가 바로 **메모리 관리장치(Memory Management Unit)**다.

 

스와핑과 연속 메모리 할당

스와핑

스왑(Swap)의 개념 정리

1️⃣ 스왑은 RAM이 부족할 때, 실행 중인 프로세스의 일부 또는 전체를 디스크(스왑 영역)로 옮겨 RAM을 확보하는 과정

2️⃣ **오랫동안 사용하지 않은 프로세스(비활성 프로세스)**를 스왑 영역으로 내보내고, 필요한 프로세스를 RAM으로 불러와 실행할 수 있도록 함.

3️⃣ CPU가 실행 중인 프로세스는 무조건 RAM에 있어야 하므로, 스왑된 프로세스가 다시 필요해지면 다시 RAM으로 로드해야 해.

4️⃣ 단점: 디스크 속도가 RAM보다 훨씬 느려서, 스왑이 너무 자주 발생하면 시스템 성능이 심각하게 저하됨 (스레싱, Thrashing).

5️⃣ 정리: 스왑은 안 쓰는 프로세스를 임시로 디스크로 옮겼다가, 필요하면 다시 불러오는 작업

  • 스왑 영역(Swap Area) : RAM이 부족할 때 디스크의 일부를 가상 메모리로 사용하는 공간
    • 보조저장장치임(ssd , hdd 등)
  • 스와핑(Swapping) : 프로세스를 통째로 스왑 영역으로 옮겼다가 다시 RAM으로 가져오는 과정.
  • 스왑 아웃(Swap-out) : 현재 실행되지 않는 프로세스가 스왑 영역으로 감
  • 스왑 인(Swap-in) : 스왑 영역에 있는 프로세스 → 다시 메모리로

연속 메모리 할당과 외부 단편화

연속 메모리 할당 (Contiguous Memory Allocation)

1️⃣ 프로세스가 실행될 때, 연속된(끊기지 않은) 메모리 공간을 할당하는 방식.

2️⃣ 메모리 공간이 **고정 분할(Fixed Partitioning) 또는 가변 분할(Variable Partitioning)**으로 나뉠 수 있음.

3️⃣ 장점: 관리가 단순하고, 프로세스가 메모리에서 연속적으로 배치되어 접근 속도가 빠름.

4️⃣ 단점: 메모리 조각화(Fragmentation) 발생 (사용할 수 없는 작은 조각들이 생기는 현상)

→외부 단편화 발생 - 작은 빈 공간이 많아지고, 새 프로세스가 할당되기 어려울 수 있음.

5️⃣ 해결책: 압축(Compaction) 기법을 사용하여 조각난 메모리를 정리하거나, 페이징/세그멘테이션 방식으로 전환.

외부 단편화 (External Fragmentation)

  • 메모리 외부
  • 설명: 메모리에 빈 공간(홀, Hole)이 존재하지만, 이 공간들이 서로 떨어져 있어서 새로운 프로세스가 사용할 수 없는 상황

내부 단편화 (Internal Fragmentation)

  • 메모리 내부
  • 설명: 할당된 메모리 블록 내부에서 실제로 필요한 것보다 더 많은 공간이 주어져서 낭비되는 현상

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

스와핑(램 <→ ssd) 과 연속 메모리 할당은 두가지 문제를 내포한다.

  • 외부 단편화
  • 물리 메모리보다 큰 프로세스를 실행할 수 없다. ex) 4기가 메모리 컴퓨터 → 4.1기가 프로그램 실행불가

이러한 문제는 해결하는 운영체제의 메모리 관리 기술이 가상 메모리다.

가상메모리

실행하고자 하는 프로그램의 일부만 메모리에 적재 → 실제 메모리보다 더 큰 프로세스를 실행할 수 있도록 만드는 메모리 기법

페이징과 세그멘테이션이 있음.

  • 가상주소공간(virtual address space)이란? 가상 메모리 기법으로 생성된 논리 주소 공간

페이징(가상 메모리 기법 1) - 외부단편화 발생 X

 

  • 프로세스의 논리 주소 공간을 **페이지(page)**라는 단위로 나눔

물리 주소 공간을 페이지와 동일한 크기의 **프레임(frame)**이란 ****단위로 일정하게 나눔

  • 페이지를 프레임에 할당하는 가상 메모리 기법

이와 같이 메모리를 할당하면 외부 단편화가 발생하지 않는다.

페이지라는 일정한 크기로 잘린 프로세스들을 메모리에 불연속적으로 할당할 수 있다면 ,

연속 메모리 할당처럼 프로세스 바깥에 빈 공간이 생길 수 없기 때문

페이징에서 스왑 인/아웃

페이징을 사용하는 시스템에선 프로세스 전채가 스왑 아웃/스왑인이 아니라

페이지 단위로 스왑 인/아웃 된다.

이것을 페이지 아웃 / 페이지 인 이라고 부른다.


세그맨테이션(segmentation) - 외부단편화 발생할 수 있음

프로세스를 일정한 크기의 페이지 단위가 아닌 가변적인 크기의 segment 단위로 분할하는 방식

  • 나누는 단위가 일정하지 않더라도 유의미한 논리적 단위로 분할하는 방식
  • 한 세그먼트는 코드영역(의 일부)일 수도, 데이터 영역(의 일부) 일수도.
  • 크기가 일정하지 않아서 외부 단편화가 발생할 수 있다.

프로세스를 구성하는 페이지는 물리 메모리 내에 불연속적으로 배치될 수 있다.

이러면 CPU는 다음 실행할 페이지의 위치를 찾기가 어렵다..

 

그래서 등장한 게 페이지 테이블임

페이지 테이블 (번역기 역할)

  • 가상 주소(Virtual Address) → 물리 주소(Physical Address)로 변환하는 매핑 테이블
  • 운영체제(OS)가 각 프로세스마다 별도의 페이지 테이블을 관리
  • 페이지 테이블을 통해 프로세스가 연속되지 않은 메모리를 사용할 수 있게 함 (외부 단편화 해결)

📌 구조 예시 (가상 주소 → 물리 주소 변환)

가상 주소 (Virtual Page Number) → 페이지 테이블 → 물리 주소 (Frame Number)

🔷 2. 페이지 테이블 엔트리 (PTE, Page Table Entry)

  • 페이지 테이블에 저장된 각 페이지의 정보
  • 한 개의 페이지 엔트리(PTE) = 가상 페이지와 매핑된 물리 프레임의 정보

📌 PTE(페이지 엔트리) 주요 정보

필드 설명

프레임 번호 (Frame Number) 해당 페이지가 물리 메모리에서 어느 프레임에 있는지
보호 비트(protection bit) 페이지 보호를 위해 존재하는 비트
유효 비트 (Valid Bit) 해당 페이지가 현재 메모리에 있는지 (1: 있음, 0: 없음)
페이지 존재 비트 (Present Bit) 페이지가 물리 메모리에 로드되었는지 (스왑된 경우 0)
읽기/쓰기 비트 (R/W Bit) 해당 페이지가 읽기/쓰기가 가능한지 여부
참조 비트 (Reference Bit) 최근에 사용되었는지 추적 (페이지 교체 알고리즘에 활용)
수정 비트 (Dirty Bit) 해당 페이지가 수정되었는지 여부 (수정된 경우 디스크에 다시 저장 필요)

🔥 한 줄 요약

  • 페이지 테이블 = 가상 주소를 물리 주소로 변환하는 매핑 테이블
  • 페이지 테이블 엔트리 (PTE) = 개별 페이지의 정보(프레임 번호, 읽기/쓰기 권한 등)를 저장하는 항목
  • 페이지폴트란?(Page fault) : 프로세스가 접근하려는 페이지가 물리 메모리에 없어서 디스크(스왑 영역)에서 불러와야 하는 상황 , 유효비트가 0인 페이지에서 접근하면 뜸 (예외처리)

👉 PTE를 통해 운영체제는 가상 메모리를 관리하고, 필요하면 페이지 교체를 수행


페이징은 외부단편화 문제를 해결할 수 있지만

내부 단편화라는 문제를 야기한다.

내부 단편화 (Internal Fragmentation)

1️⃣ 고정 크기 메모리 블록 할당 방식에서, 프로세스가 필요로 하는 메모리보다 더 큰 블록이 할당되면서 남는 공간이 낭비되는 현상

2️⃣ 예: 4KB 블록에서 3KB 크기의 프로세스를 할당하면 1KB가 낭비됨.

3️⃣ 원인: 메모리 블록 크기가 고정되어 있어, 남는 공간을 다른 프로세스가 활용하지 못함.

4️⃣ 해결책: 블록 크기를 최적화하거나, 슬래브 할당(Slab Allocation) 같은 동적 메모리 할당 기법 사용.

5️⃣ 한 줄 요약: "할당된 메모리 내부에서 낭비되는 공간이 생기는 문제."


각 프로세스의 페이지 테이블은 메모리에 적재될 수 있다.

→ 어떤 프로세스 실행하고 싶어 → 프로세스의 페이지 테이블이 메모리에 적재 된 위치를 알아야 한다. → 그 위치를 알려주는게 페이지 테이블 베이스 레지스터다.

페이지 테이블 베이스 레지스터 (네이버지도다.)

Page Table Base Register (PTBR)

CPU가 현재 실행 중인 프로세스의 페이지 테이블 시작 주소를 저장하는 레지스터.

  • 프로세스마다 페이지 테이블이 다르므로, 문맥 전환(Context Switch) 시 PTBR을 변경해야 함.
  • 가상 주소 → 물리 주소 변환 시, PTBR이 페이지 테이블의 위치를 알려줘 변환 속도를 빠르게 함.
  • 페이지 테이블이 커질 경우, **TLB(Translation Lookaside Buffer)**를 사용해 변환 속도를 최적화함.
  • 한 줄 요약: "CPU가 참조할 페이지 테이블의 시작 주소를 저장하는 레지스터."

모든 프로세스의 페이지 테이블을 메모리에 두면 비효율적임

길 찾고 싶다 → 모든 경로를 크롬창에 띄워놨어 → 효율적입니까? X

1. 메모리 접근 횟수가 많아진다.

모든 프로세스의 page table이 메모리 적재 시 cpu는 페이지 테이블에 접근하기 위해 총 두번 메모리에 접근해야 함. (1. 페이지 테이블 접근 ,2.실제 프레임 접근) ⇒ 시간이 2배

이를 해결하기 위해 TLB(주소 변환 캐시)를 사용해 자주 사용할 법한 페이지 위주로

페이지 테이블의 일부 내용을 저장함.

TLB (Translation Lookaside Buffer) - 주소 변환 캐시

1️⃣ 페이지 테이블을 빠르게 참조하기 위해 사용하는 캐시 메모리로, 가상 주소 → 물리 주소 변환 속도를 높여줌.

2️⃣ 페이지 테이블을 직접 접근하는 대신, 자주 사용하는 주소 매핑 정보를 TLB에 저장하여 빠르게 검색.

3️⃣ TLB 히트(TLB Hit): 찾으려는 가상 주소가 TLB에 존재하는 경우, 즉 페이지 테이블을 거치지 않고 빠르게 변환됨. (어? 주소 찾음!)

4️⃣ TLB 미스(TLB Miss): TLB에 주소 정보가 없어서 페이지 테이블을 직접 조회해야 하는 경우, 속도가 느려짐. (어? 주소 없네..검색해서 찾아봐야지..)

5️⃣ 한 줄 요약: "페이지 테이블 조회를 빠르게 하기 위한 CPU 캐시 역할을 하는 변환 테이블."

👉 TLB 히트율이 높을수록 주소 변환 속도가 빨라져 성능이 향상됨

2.메모리 용량을 많이 차지한다.

페이지 테이블의 크기는 생각보다 작지 않다.

그래서 등장한 방법 중 하나가 계층적 페이징이다.

계층적 페이징 - 페이지 테이블을 페이징하는 방식

다단계 페이지 테이블 기법이라고도 부름

계층적 페이징 (Hierarchical Paging) - 다단계 페이지 테이블

1️⃣ 페이지 테이블 크기가 너무 커질 경우, 이를 여러 단계로 나누어 관리하는 방식.

2️⃣ 1차(상위) 페이지 테이블이 2차(하위) 페이지 테이블의 주소를 가리키는 구조로, 한 번에 전체 페이지 테이블을 로드하지 않아도 됨.

3️⃣ 메모리 사용량을 줄일 수 있지만, 주소 변환 과정이 여러 번 발생하여 접근 속도가 느려질 수 있음.

4️⃣ 2단계(2-Level), 3단계(3-Level) 등 여러 단계로 구성될 수 있으며, 대형 시스템에서 주로 사용됨.

객체 안에 객체 같은 느낌이다.


페이징 주소 체계 (걍 도로명 주소임)

하나의 페이지 내에 여러 주소가 포함되어 있기 때문에

페이징 시스템의 논리주소는 기본적으로 <페이지번호,변위>와 같은 형태로 되어 있음.

  • 페이지 번호 : 몇번째 페이지 번호에 접근할지를 나타냄
  • 변위 : 접근하려는 주소가 페이지(프레임) 시작 번지로부터 얼만큼 떨어져 있는지를 나타냄

📌 페이지 주소 체계 = 현실 주소 체계 비교

현실 주소 🏡 페이지 주소 🖥

서울특별시 상위 페이지 테이블 (Page Directory)
마포구 중간 페이지 테이블 (Page Table Level 2)
고산길 하위 페이지 테이블 (Page Table Level 3)
30-3번지 실제 메모리 프레임 (Physical Frame)

📌 설명

1️⃣ 서울특별시 → 마포구 → 고산길 → 30-3 순서로 점점 더 구체적인 위치를 찾듯이,

2️⃣ 계층적 페이징도 "상위 페이지 테이블 → 하위 페이지 테이블 → 물리 메모리 프레임" 순서로 찾아감

👉 즉, 페이지 주소 체계는 현실의 주소 체계와 같은 개념이며, 점점 더 세부적인 주소를 따라가면서 원하는 데이터를 찾는 구조! 🚀


페이지 교체 알고리즘

페이지 교체 알고리즘 (Page Replacement Algorithms)

💡 페이지 교체란?

  • 메모리에 빈 공간이 없을 때, 기존 페이지를 내보내고 새로운 페이지를 가져오는 과정
  • 요구 페이징(Demand Paging): 필요한 페이지만 메모리에 로드하는 방식 (J)
  • 순수 요구 페이징(Pure Demand Paging): 처음부터 메모리에 아무 페이지도 올리지 않고, 필요한 페이지만 불러옴 ( P)

🔥 1. FIFO (First-In-First-Out) 페이지 교체 알고리즘

  • 가장 먼저 들어온 페이지를 먼저 내보냄 (Queue 방식)
  • 장점: 구현이 간단함
  • 단점: 오래된 페이지가 아직 필요할 수도 있어 성능 저하 발생 (Belady’s Anomaly, 벨라디의 모순)
  • 예제
  • 페이지 요청 순서: [1, 2, 3, 4, 1, 2, 5] (프레임 3개) 1 1 1 1 1 1 5 2 2 2 2 2 2 3 3 3 3 3 교체: 3이 제거됨

🔥 2. OPT (Optimal, 최적 페이지 교체 알고리즘)

  • 가장 나중에 다시 사용될 페이지를 제거 (이론적으로 가장 적은 페이지 폴트 발생)
  • 장점: 가장 효율적인 알고리즘
  • 단점: 미래의 페이지 요청을 미리 알아야 해서 실제 구현이 불가능함 (이론적 비교용)
  • 예제
  • 페이지 요청 순서: [1, 2, 3, 4, 1, 2, 5] (프레임 3개) 1 1 1 1 1 1 5 2 2 2 2 2 2 3 3 4 4 4 교체: 3이 나중에 다시 사용되지 않으므로 제거됨

🔥 3. LRU (Least Recently Used) 페이지 교체 알고리즘

  • 가장 오랫동안 사용되지 않은 페이지를 제거
  • 장점: 실제로 자주 쓰이는 페이지를 유지할 수 있어 성능이 좋음
  • 단점: 사용 이력을 추적해야 해서 구현이 복잡하고 오버헤드 발생
  • 예제
  • 페이지 요청 순서: [1, 2, 3, 4, 1, 2, 5] (프레임 3개) 1 1 1 1 1 1 5 2 2 2 2 2 2 3 3 4 4 4 교체: 가장 오래 사용되지 않은 3이 제거됨

🔥 요약 비교표

알고리즘 방식 장점 단점

FIFO 먼저 들어온 페이지 제거 구현 간단 오래된 페이지가 여전히 필요할 수도 있음 (Belady's Anomaly)
OPT 미래에 가장 늦게 사용될 페이지 제거 가장 적은 페이지 폴트 발생 (이론적 최적) 미래를 알아야 해서 실제 구현 불가능
LRU 가장 오래 사용되지 않은 페이지 제거 실제 사용 패턴을 반영 사용 이력 추적 필요 (오버헤드 발생)

한 줄 요약

  • FIFO들어온 순서대로 제거 (오래됐다고 안 쓰는 게 아님 😭)
  • OPT가장 나중에 다시 사용될 페이지 제거 (이론적으로 최고지만 현실 불가 🤯)
  • LRU가장 오래 사용 안 된 페이지 제거 (현실적이고 성능 좋음 👍)

👉 운영체제는 보통 FIFO 대신 LRU 또는 LRU 근사 알고리즘을 사용함! 🚀

페이지 폴트(Page fault)

프로세스가 참조하려는 페이지가 현재 메모리(RAM)에 없을 때 발생하는 이벤트.

메이저 페이지 폴트 (Major Page Fault)

  • 페이지가 물리 메모리에 없어서 디스크(스왑 영역)에서 불러와야 하는 경우 → 속도가 느림.
  • 디스크에서 데이터를 읽어야 하므로 큰 성능 저하 발생 (I/O 오버헤드).

마이너 페이지 폴트 (Minor Page Fault)

  • 페이지가 물리 메모리에 있지만, 프로세스의 페이지 테이블에 매핑되지 않은 경우.
  • 디스크 접근 없이 매핑만 갱신하면 되므로 성능 영향이 적음.

'Study > CS' 카테고리의 다른 글

4.1 ~ 4.4 자료구조  (1) 2025.02.26
03 - 6 파일 시스템  (0) 2025.02.19
03 - 4 CPU 스케줄링  (0) 2025.02.19
03-3 동기화와 교착 상태  (0) 2025.02.12
03-2 프로세스와 스레드  (1) 2025.02.12