OS

[쉽게 배우는 운영체제] 8. 가상 메모리의 기초

noahkim_ 2024. 12. 12. 22:45

조성호 님의 "쉽게 배우는 운영체제" 책을 정리한 포스팅 입니다


1. 개요

  • 메모리의 크기는 컴퓨터마다 다름
  • OS가 물리 메모리 크기에 의존한다면, 메모리 크기가 다른 환경에서는 프로그램이 정상적으로 동작하지 않을 수 있음
  • 이를 해결하기 위해 가상 메모리 개념이 등장함

 

가상 메모리

  • 물리 메모리의 실제 크기와 상관없이 프로세스에게 충분히 큰 메모리 공간을 제공하는 기술
  • ➡️ 물리 메모리 크기, 실제 메모리 위치, 다른 프로세스 존재 등을 고려하지 않고 메모리를 사용할 수 있습니다

 

메모리 관리자

  • 메모리 자원을 효율적으로 관리하고 프로세스들이 요구하는 메모리를 적절히 제어하는 역할
기능 설명
스왑
물리 메모리가 부족하면 스왑 영역으로 일부 데이터를 보냄.
동적 주소 변환
가상 주소를 물리 주소로 변환하여 실제 메모리 위치를 참조.
매핑 테이블 관리
가상 주소와 물리 주소를 일대일로 매핑하는 테이블을 관리.

 

2. 페이징 기법

  • 고정 분할 방식을 이용한 가상 메모리 관리 기법
  • 가상 메모리와 물리 메모리를 같은 같은 크기의 블록 단위로 나누어 관리

 

페이지 vs 프레임

구분 페이지 프레임
위치 가상 메모리 물리 메모리
크기 고정 크기
페이지와 동일한 크기.
번호 0번부터 시작
0번부터 시작

 

페이지 테이블

  • 각 페이지가 어떤 프레임에 매핑되어 있는지 기록하는 테이블
  • 프로세스마다 페이지 테이블을 운영함
  • 페이지 테이블의 크기가 커지면 메모리 자원이 많이 필요함
  • ✅ PTBR: 각 프로세스의 페이지 테이블의 시작 주소를 저장하는 레지스터 (각 프로세스의 PCB에 저장됨)
  • ✅ 페이지 테이블 용량이 커질수록, 실제 사용할 수 있는 영역이 줄어듬
  • ➡️ 페이지 테이블의 크기를 적정하게 유지하는 것이 중요
필드 설명
페이지 번호 가상 주소의 페이지 번호
프레임 번호
물리 메모리에서 페이지가 저장된 프레임 번호 (주소 필드)
플래그 비트
페이지의 접근 상태 및 속성을 나타내는 여러 비트들

 

표) 플래그 비트

더보기
필드 설명 종류
접근 비트 페이지가 사용된 적이 있는지 나타내는 비트  
변경 비트 페이지가 수정된 적이 있는지 나타내는 비트  
유효 비트 페이지가 영역에 있는지를 나타내는 비트 - 0: 페이지가 메모리에 있음 
- 1: 페이지가 스왑 영역에 있음 
읽기 비트 페이지가 읽기 가능한지 나타내는 비트  
쓰기 비트 페이지가 쓰기 가능한지 나타내는 비트  
실행 비트 페이지가 실행 가능한지 나타내는 비트  

 

관리

매핑 방식 설명 장점 단점
직접 매핑 페이지 테이블 전체를 물리 메모리에 상주 빠른 주소 변환 메모리 사용량 큼
연관 매핑 페이지 테이블을 스왑 영역에 저장. 일부만 로드 메모리 효율적
주소 변환 속도 느림
집합-연관 매핑 페이지 테이블을 디렉토리로 나누어 관리 효율적 주소 변환
일부 페이지 테이블을 여전히 검색 필요
역매핑 물리 메모리 프레임 번호 기준으로 테이블 관리 하나의 테이블만 존재
전체 테이블 스캔이 필요할 수 있음

 

주소 변환

  1. 가상 주소 x번지가 어느 페이지에 해당하는지 찾기
  2. 페이지 테이블의 페이지 y로 가서 해당 페이지의 프레임 찾기
  3. 물리 메모리 프레임 y의 (x번지 % 페이지 크기) 번째 위치에 접근

 

예) 직접 매핑

더보기
  • 가상 주소: 2 (테이블 인덱스) | 1 (오프셋)
  • 페이지 테이블에서 프레임 확인: 페이지 2 → 프레임 10
  • 물리 주소 계산: 10 * 4096 + 1

 

예) 연관 매핑

더보기
  • 가상 주소: 2 (테이블 인덱스) | 1 (오프셋)
  • 페이지 테이블에서 프레임 확인: 페이지 2 → 프레임 10
    • ✅ 페이지 테이블에 엔트리 없으면 스왑 영역에서 가져오기
    • 엔트리가 invalid이면 페이지 폴트
  • 물리 주소 계산: 10 * 4096 + 1

 

예) 집합-연관 매핑

더보기
  • 가상 주소: 1 (디렉토리 인덱스) | 2 (테이블 인덱스) | 1 (오프셋)
  • 디렉토리 테이블에서 페이지 테이블 확인: 디렉토리 1 → 테이블 2
  • 페이지 테이블에서 프레임 확인: 페이지 2 → 프레임 10
    • ✅ 페이지 테이블에 엔트리 없으면 스왑 영역에서 가져오기
    •  엔트리가 invalid이면 페이지 폴트
  • 물리 주소 계산: 10 * 4096 + 1

 

예) 역 매핑

더보기
  • 가상 주소: 2 (테이블 인덱스) | 1 (오프셋)
  • 페이지 테이블에서 풀스캔해서 프레임 확인:  (현재 프로세스, 페이지 2) → 프레임 10
  • 물리 주소 계산: 10 * 4096 + 1

 

3. 세그먼테이션 기법

  • 프로세스 메모리를 논리적 단위로 (세그먼트) 나눠서 관리하는 방식
  • 가변 분할 (세그먼트마다 크기가 다를 수 있음)
  • 각 세그먼트는 연속된 물리 메모리에 배치됨
  • 세그먼트 단위로 권한 설정 가능 (코드, 데이터, 스택, 힙 등)

 

세그먼테이션 테이블 

항목 설명
base(address) 세그먼트의 물리 메모리 시작 주소
limit 세그먼트의 크기
권한 비트 읽기/쓰기/실행 가능 여부
valid(present) 비트 메모리에 존재 여부 (없으면 스왑/디스크에 있음)

 

세그먼테이션 오류

  • 사용자의 프로세스가 주어진 메모리 공간을 벗어나거나 권한이 없는 곳에 접근하는 오류

 

주소 변환

  1. 가상 주소 확인 (세그먼트 번호, 오프셋)
  2. 세그먼트 테이블에서 s번 엔트리 조회
  3. valid 확인
  4. limit 확인 (offset >= limit 일 경우 segmentation fault)
  5. 물리 주소 접근 (base+offset)

 

4. 세그먼테이션 - 페이징 기법

  • 논리적 보호는 세그먼트로, 물리 메모리 관리는 페이징으로 관리하는 구조
  • ➡️ 각 세그먼트는 물리적으로는 비연속적으로 배치되지만, 세그먼트 단위로 권한을 관리하고 내부는 페이징으로 관리함

 

주소 변환

  1. 가상 주소 확인 (세그먼트 번호, 페이지 번호, 오프셋)
  2. 세그먼트 테이블에서 s번 엔트리 조회 → 해당 세그먼트의 페이지 테이블 시작 주소 획득
  3. limit 확인 (p*page_size+d >= limit 이면 segmentation fault)
  4. 페이지 테이블에서 p 검색  → 프레임 번호 획득
  5. 물리 주소 접근

 

5. 캐시 매핑 기법

  • CPU 캐시와 RAM 사이에서 어떤 메모리 블록을 캐시의 어느 위치에 저장할지 결정하는 방식
  • 데이터를 효율적으로 교환하기 위해 사용하는 방법

 

태그

  • 캐시에 저장된 데이터가 원래 메모리의 어느 위치에서 온 데이터인지 식별하기 위한 상위 주소 정보

 

종류

항목 직접 매핑 연관 매핑
집합-연관 매핑
블록 하나의 고정된 캐시 위치에 매핑 캐시 아무 위치나 매핑됨
캐시를 집합으로 나누고, 집합 내에서 자유
주소 Tag + Index + Offset Tag + Offset Tag + Set Index + Offset
검색 방식 Index로 바로 접근 후 Tag 비교 전체 캐시와 Tag 비교 Set 내에서 Tag 비교
장점 구조 단순, 속도 빠름 캐시 충돌 적음
자리다툼 문제가 완화됨
단점 충돌 심함 검색 느림
충돌 가능성 있음