가상 메모리란?
가상 메모리는 운영체제가 프로그램에게 제공하는 추상화된 메모리 주소 공간이다. 이는 실제 물리적 메모리(RAM)의 크기와 상관없이 프로그램에게 더 크고 연속적인 메모리 공간을 제공한다.
가상 메모리의 핵심은 주소 변환 메커니즘이다. 프로그램은 가상 주소를 사용하고, 이 주소는 메모리 관리 장치(MMU)에 의해 실제 물리 주소로 변환된다. 이때 모든 가상 주소가 항상 물리 메모리에 매핑되어 있는 것은 아니며, 필요한 경우에만 하드 디스크와 같은 보조 기억장치에서 물리 메모리로 데이터를 가져온다.
따라서 하드디스크 자체가 메모리처럼 동작하는 것이 아니라, 가상 주소 공간을 효율적으로 관리함으로써 제한된 물리 메모리를 효율적으로 사용하고 필요시 보조 기억장치를 활용하는 것이다.
운영체제는 가상 메모리를 다음과 같이 관리한다:
- 주소 변환(Address Translation): 프로그램이 사용하는 가상 주소를 실제 물리 주소로 변환
- 스와핑(Swapping): 현재 사용하지 않는 메모리 영역을 디스크로 옮기고, 필요한 데이터를 메모리로 가져오는 작업
- 페이지 교체(Page Replacement): 새로운 페이지를 메모리에 로드해야 할 때, 어떤 페이지를 디스크로 내보낼지 결정하는 알고리즘
가상 메모리는 다음과 같은 중요한 특징을 가지고 있다:
- 메모리 효율성 향상: 실제 필요한 데이터만 물리 메모리에 로드되므로 메모리를 효율적으로 사용할 수 있다.
- 큰 주소 공간: 32비트 시스템은 최대 4GB, 64비트 시스템은 이론상 거의 무한대에 가까운 주소 공간을 제공한다.
- 메모리 보호: 각 프로세스는 자신만의 가상 주소 공간을 가지므로, 다른 프로세스의 메모리에 접근할 수 없어 시스템 안정성이 향상된다.
- 메모리 단편화 감소: 물리적 메모리의 연속된 공간이 아닌 여러 조각으로 나누어 할당할 수 있어 단편화 문제를 줄인다.
- 프로그램 개발 용이성: 프로그래머는 물리 메모리 구조를 신경 쓰지 않고, 가상 메모리를 자유롭게 사용할 수 있다.
가상 주소는 왜 필요한가?
가상 주소를 관리해야 하는 이유는 다음과 같다.
- 메모리 보호: 각 프로세스는 독립된 가상 주소 공간을 가져 다른 프로세스의 메모리에 접근할 수 없게 된다. 이는 시스템의 안정성과 보안성을 크게 향상시킨다.
- 메모리 위치의 독립성: 프로그램은 항상 같은 가상 주소를 사용하지만, 실제 물리 메모리에서는 다른 위치에 로드될 수 있다. 이를 통해 프로그램 재배치가 용이하다.
- 동적 메모리 관리: 프로그램 실행 중 필요에 따라 메모리를 할당하고 해제하는 과정을 단순화한다.
- 메모리 제약 해소: 실제 물리 메모리보다 더 큰 메모리를 사용할 수 있게 해준다.
예를 들어, 여러 개의 프로그램이 동시에 실행될 때 각 프로그램이 0번지부터 시작하는 자신만의 가상 주소 공간을 가질 수 있다. 이를 통해 각 프로그램은 다른 프로그램의 존재를 모르고 독립적으로 실행될 수 있다.
가상 메모리의 주소 변환
가상 메모리 시스템에서는 두 종류의 주소가 존재한다:
- 가상 주소(Virtual Address): 프로그램이 참조하는 주소
- 물리 주소(Physical Address): 실제 메모리 하드웨어가 사용하는 주소. 실주소라고도 함.
주소 변환은 가상 주소를 물리 주소로 매핑하는 과정이다. 이 변환 과정은 MMU(Memory Management Unit)라는 하드웨어에 의해 수행된다.
기본적인 주소 변환 과정은 다음과 같다:
- 프로그램이 가상 주소를 참조***
- MMU가 해당 가상 주소를 물리 주소로 변환
- 물리 주소에 있는 데이터에 접근
이 변환 정보는 '페이지 테이블'이라는 자료구조에 저장되며, 각 프로세스마다 고유한 페이지 테이블을 가진다.
***
프로그램이 가상 주소를 참조한다는 것은 프로그램이 메모리에 접근할 때 물리적인 RAM 주소가 아닌 가상 메모리 주소 체계를 사용한다는 뜻이다.
모든 프로그램은 CPU에서 실행될 때 메모리에 있는 데이터를 읽거나 쓰는 작업을 수행한다. 프로그램의 코드 안에는 변수 접근, 함수 호출, 배열 인덱싱 등 메모리 주소를 사용하는 명령어들이 있다. 이 때 프로그램에서 사용하는 주소는 가상 주소이다. 예를 들어 프로그램이 0x1000 주소에 있는 데이터를 읽으려고 하면, 이 0x1000은 가상 주소 체계에서의 주소이다. 프로그램은 마치 자신이 메모리의 시작 주소부터 연속된 공간을 모두 사용하는 것처럼 동작한다. 실제로는 그런 물리적 메모리 배치가 아니더라도 말이다. 컴파일된 프로그램의 모든 메모리 참조(포인터 연산, 배열 인덱싱, 변수 접근 등)는 이런 가상 주소를 기준으로 계산된다.
간단한 예를 들면, C 언어에서 다음과 같은 코드가 있을 때:
int array[10]; // 10개의 정수를 저장할 수 있는 배열을 가상 메모리에 할당
array[5] = 42; // 배열의 여섯 번째 요소(인덱스 5)에 값 42를 저장
여기서 array[5]에 값을 저장하는 작업은 실제로 '배열의 시작 주소 + 5*sizeof(int)'라는 가상 주소를 참조하는 것이다. 이 주소는 프로그램의 가상 주소 공간 내에서의 주소이며, MMU가 이 가상 주소를 실제 물리 메모리의 어느 위치에 매핑할지 결정한다.
***
바이트 단위로 주소를 변환하면 어떻게 될까?
가상 메모리에서 바이트 단위로 주소를 변환하면 다음과 같은 문제가 발생한다:
- 막대한 맵핑 테이블(사상표) 크기: 바이트마다 맵핑 정보를 저장하면 매핑 테이블 크기가 메모리 크기와 거의 같아진다. 예를 들어 4GB 메모리를 바이트 단위로 관리하면 43억 개의 매핑 정보가 필요하다.
* 4GB = 4 * 2^30 바이트 = 4 * 1,073,741,824 바이트 = 4,294,967,296 바이트 = 약 43억 바이트 - 비효율적인 메모리 사용: 변환 테이블 자체가 너무 많은 메모리를 차지하게 된다.
- 변환 시간 증가: 거대한 테이블에서 정보를 찾는 데 시간이 오래 걸린다.
- 관리 오버헤드: 바이트 단위로 메모리를 관리하면 모든 메모리 연산에 대해 변환 작업이 필요해진다.
- 지역성 활용 불가: 프로그램은 연속된 메모리 영역을 자주 사용하는 특성(지역성)이 있는데, 바이트 단위 변환은 이러한 특성을 활용할 수 없다.
이러한 문제점 때문에 실제 시스템에서는 바이트 단위가 아닌 블록 단위로 주소를 변환한다.
블록 단위 주소 변환
바이트 단위 변환의 문제점을 해결하기 위해 메모리를 일정 크기의 블록으로 나누어 관리한다. 이때 가상 주소는 다음과 같이 두 부분으로 나뉜다:
- 블록 번호(Block Number): 어떤 블록인지 식별
- 변위(Offset 또는 Displacement): 블록 내에서의 위치. 메모리 블록의 시작점으로부터 얼마나 떨어져 있는지를 나타내는 값
블록 크기에 따른 비트 분배
블록 크기는 가상 주소를 블록 번호와 변위로 나누는 데 결정적인 역할을 한다. 블록 크기가 커질수록 변위에 필요한 비트 수가 증가하고, 블록 번호에 사용되는 비트 수가 줄어든다.
블록 크기 | 변위 비트 수 | 블록 번호 비트 수 | 최대 블록 개수 |
4KB (2^12) | 12비트 | 20비트 | 2^20 = 1,048,576 |
64KB (2^16) | 16비트 | 16비트 | 2^16 = 65,536 |
1MB (2^20) | 20비트 | 12비트 | 2^12 = 4,096 |
- 4KB 블록: 변위에 12비트, 블록 번호에 20비트
- 64KB 블록: 변위에 16비트, 블록 번호에 16비트
- 1MB 블록: 변위에 20비트, 블록 번호에 12비트
예시 1: 블록 크기가 1KB(2^10바이트)인 경우
32비트 가상 주소 체계에서:
- 하위 10비트(2^10 = 1024)는 블록 내 변위를 나타냄
- 상위 22비트는 블록 번호를 나타냄
예시 2: 블록 크기가 4KB(2^12바이트)인 경우
32비트 가상 주소 체계에서:
- 하위 12비트는 블록 내 변위를 나타냄
- 상위 20비트는 블록 번호를 나타냄
주소 변환 과정
- 가상 주소에서 블록 번호와 변위를 추출
- 블록 번호를 사용해 맵핑 테이블에서 해당 블록의 물리적 블록 번호(프레임 번호) 찾기
- 물리적 블록 번호와 변위를 결합하여 최종 물리 주소 계산
블록 크기가 클수록:
- 맵핑 테이블 크기가 작아짐 (관리해야 할 블록 수가 줄어듦)
- 내부 단편화가 증가할 수 있음 ( 블록이 클수록 프로그램이 사용하는 데이터보다 더 큰 공간이 할당되고,
그만큼 사용되지 않는 여유 공간이 많아질 가능성이 커짐)
'KNOU CS > 운영체제' 카테고리의 다른 글
[운영체제] 병행 프로세스 - 세마포어 완벽 정리 Part 3 - 판독기-기록기 문제 (0) | 2025.03.19 |
---|---|
[운영체제] 병행 프로세스 - 세마포어 완벽 정리 Part 2 - 생산자-소비자 문제 (0) | 2025.03.18 |
[운영체제] 병행 프로세스 - 세마포어 완벽 정리 Part 1 - 상호배제, 동기화 (feat. 비행기 화장실) (1) | 2025.03.12 |