조성호 님의 "쉽게 배우는 운영체제" 책을 정리한 포스팅 입니다
1. 개요
- 메모리의 크기는 컴퓨터마다 다름
- OS가 물리 메모리 크기에 의존한다면, 메모리 크기가 다른 환경에서는 프로그램이 정상적으로 동작하지 않을 수 있음
- 이를 해결하기 위해 가상 메모리 개념이 등장함
가상 메모리
- 물리 메모리의 실제 크기와 상관없이 프로세스에게 충분히 큰 메모리 공간을 제공하는 기술
- ➡️ 물리 메모리 크기, 실제 메모리 위치, 다른 프로세스 존재 등을 고려하지 않고 메모리를 사용할 수 있습니다
메모리 관리자
- 메모리 자원을 효율적으로 관리하고 프로세스들이 요구하는 메모리를 적절히 제어하는 역할
| 기능 | 설명 |
| 스왑 |
물리 메모리가 부족하면 스왑 영역으로 일부 데이터를 보냄.
|
| 동적 주소 변환 |
가상 주소를 물리 주소로 변환하여 실제 메모리 위치를 참조.
|
| 매핑 테이블 관리 |
가상 주소와 물리 주소를 일대일로 매핑하는 테이블을 관리.
|
2. 페이징 기법
- 고정 분할 방식을 이용한 가상 메모리 관리 기법
- 가상 메모리와 물리 메모리를 같은 같은 크기의 블록 단위로 나누어 관리
페이지 vs 프레임
| 구분 | 페이지 | 프레임 |
| 위치 | 가상 메모리 | 물리 메모리 |
| 크기 | 고정 크기 |
페이지와 동일한 크기.
|
| 번호 | 0번부터 시작 |
0번부터 시작
|
페이지 테이블
- 각 페이지가 어떤 프레임에 매핑되어 있는지 기록하는 테이블
- 프로세스마다 페이지 테이블을 운영함
- 페이지 테이블의 크기가 커지면 메모리 자원이 많이 필요함
- ✅ PTBR: 각 프로세스의 페이지 테이블의 시작 주소를 저장하는 레지스터 (각 프로세스의 PCB에 저장됨)
- ✅ 페이지 테이블 용량이 커질수록, 실제 사용할 수 있는 영역이 줄어듬
- ➡️ 페이지 테이블의 크기를 적정하게 유지하는 것이 중요
| 필드 | 설명 |
| 페이지 번호 | 가상 주소의 페이지 번호 |
| 프레임 번호 |
물리 메모리에서 페이지가 저장된 프레임 번호 (주소 필드)
|
| 플래그 비트 |
페이지의 접근 상태 및 속성을 나타내는 여러 비트들
|
표) 플래그 비트
더보기
| 필드 | 설명 | 종류 |
| 접근 비트 | 페이지가 사용된 적이 있는지 나타내는 비트 | |
| 변경 비트 | 페이지가 수정된 적이 있는지 나타내는 비트 | |
| 유효 비트 | 페이지가 영역에 있는지를 나타내는 비트 | - 0: 페이지가 메모리에 있음 - 1: 페이지가 스왑 영역에 있음 |
| 읽기 비트 | 페이지가 읽기 가능한지 나타내는 비트 | |
| 쓰기 비트 | 페이지가 쓰기 가능한지 나타내는 비트 | |
| 실행 비트 | 페이지가 실행 가능한지 나타내는 비트 |
관리
| 매핑 방식 | 설명 | 장점 | 단점 |
| 직접 매핑 | 페이지 테이블 전체를 물리 메모리에 상주 | 빠른 주소 변환 | 메모리 사용량 큼 |
| 연관 매핑 | 페이지 테이블을 스왑 영역에 저장. 일부만 로드 | 메모리 효율적 |
주소 변환 속도 느림
|
| 집합-연관 매핑 | 페이지 테이블을 디렉토리로 나누어 관리 | 효율적 주소 변환 |
일부 페이지 테이블을 여전히 검색 필요
|
| 역매핑 | 물리 메모리 프레임 번호 기준으로 테이블 관리 | 하나의 테이블만 존재 |
전체 테이블 스캔이 필요할 수 있음
|
주소 변환
- 가상 주소 x번지가 어느 페이지에 해당하는지 찾기
- 페이지 테이블의 페이지 y로 가서 해당 페이지의 프레임 찾기
- 물리 메모리 프레임 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) 비트 | 메모리에 존재 여부 (없으면 스왑/디스크에 있음) |
세그먼테이션 오류
- 사용자의 프로세스가 주어진 메모리 공간을 벗어나거나 권한이 없는 곳에 접근하는 오류
주소 변환
- 가상 주소 확인 (세그먼트 번호, 오프셋)
- 세그먼트 테이블에서 s번 엔트리 조회
- valid 확인
- limit 확인 (offset >= limit 일 경우 segmentation fault)
- 물리 주소 접근 (base+offset)
4. 세그먼테이션 - 페이징 기법
- 논리적 보호는 세그먼트로, 물리 메모리 관리는 페이징으로 관리하는 구조
- ➡️ 각 세그먼트는 물리적으로는 비연속적으로 배치되지만, 세그먼트 단위로 권한을 관리하고 내부는 페이징으로 관리함
주소 변환
- 가상 주소 확인 (세그먼트 번호, 페이지 번호, 오프셋)
- 세그먼트 테이블에서 s번 엔트리 조회 → 해당 세그먼트의 페이지 테이블 시작 주소 획득
- limit 확인 (p*page_size+d >= limit 이면 segmentation fault)
- 페이지 테이블에서 p 검색 → 프레임 번호 획득
- 물리 주소 접근
5. 캐시 매핑 기법
- CPU 캐시와 RAM 사이에서 어떤 메모리 블록을 캐시의 어느 위치에 저장할지 결정하는 방식
- 데이터를 효율적으로 교환하기 위해 사용하는 방법
태그
- 캐시에 저장된 데이터가 원래 메모리의 어느 위치에서 온 데이터인지 식별하기 위한 상위 주소 정보
종류
| 항목 | 직접 매핑 | 연관 매핑 |
집합-연관 매핑
|
| 블록 | 하나의 고정된 캐시 위치에 매핑 | 캐시 아무 위치나 매핑됨 |
캐시를 집합으로 나누고, 집합 내에서 자유
|
| 주소 | Tag + Index + Offset | Tag + Offset | Tag + Set Index + Offset |
| 검색 방식 | Index로 바로 접근 후 Tag 비교 | 전체 캐시와 Tag 비교 | Set 내에서 Tag 비교 |
| 장점 | 구조 단순, 속도 빠름 | 캐시 충돌 적음 |
자리다툼 문제가 완화됨
|
| 단점 | 충돌 심함 | 검색 느림 |
충돌 가능성 있음
|
'OS' 카테고리의 다른 글
| [쉽게 배우는 운영체제] 11-1. 파일 시스템: 파일 (3) | 2024.12.14 |
|---|---|
| [쉽게 배우는 운영체제] 9. 가상 메모리 관리 (0) | 2024.12.13 |
| [쉽게 배우는 운영체제] 7. 물리 메모리 관리 (0) | 2024.12.12 |
| [쉽게 배우는 운영체제] 6. 교착 상태 (1) | 2024.12.12 |
| [쉽게 배우는 운영체제] 5-1. 프로세스 동기화: 임계 영역 (0) | 2024.12.12 |