가상 메모리 시스템
가상 메모리 (Virtual Memory)는 실제 메모리보다 더 큰 프로그램을 실행할 수 있도록 하는 메모리 관리 기법입니다. 가상 메모리는 실제 메모리(RAM)와 디스크(SSD 또는 HDD)를 결합하여, 마치 시스템이 더 큰 메모리를 가진 것처럼 동작하게 만듭니다. 즉, 프로세스의 전체 메모리가 물리적 메모리에 존재하지 않아도 실행이 가능합니다.
- 실행 과정:
- 가상 메모리에서 프로그램이 실행되면, 처음에는 필요한 코드와 데이터의 일부분만 메모리에 로드됩니다. 이때 운영체제는 메모리에서 프로그램의 일부분만 실행해도 될 만큼 작은 Resident Set을 유지합니다.
- 프로그램이 메모리에 없는 주소에 접근할 때 페이지 폴트(Page Fault)가 발생합니다. 페이지 폴트는 현재 메모리에 없는 페이지를 디스크에서 불러오라는 요청을 운영체제에 전달하는 것입니다.
- 요청된 페이지가 메모리로 로드되고, 프로세스는 다시 실행됩니다.
지역성의 원리 (Principle of Locality)
지역성이란, 프로세스가 실행 중 특정 시점에서 주로 몇 개의 메모리 페이지만 참조하는 특성을 말합니다. 이러한 지역성 덕분에 가상 메모리 시스템은 모든 프로그램 데이터를 동시에 메모리에 두지 않아도 프로그램을 효과적으로 실행할 수 있습니다. 지역성의 원리는 두 가지로 나뉩니다:
- 시간적 지역성: 최근에 참조된 데이터는 가까운 미래에 다시 참조될 가능성이 높습니다.
- 공간적 지역성: 가까운 주소에 있는 데이터는 연이어 참조될 가능성이 높습니다.
페이지 교체 알고리즘
페이지 교체가 필요한 상황은, 메모리가 꽉 차서 새로운 페이지를 로드하기 위해 기존 페이지를 내보내야 할 때 발생합니다. 이때, 운영체제는 어떤 페이지를 교체할지 결정하는 다양한 알고리즘을 사용합니다.
- OPT (Optimal Page Replacement):
- 가장 이상적인 방법으로, 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체합니다. 그러나 미래의 참조 패턴을 예측할 수 없기 때문에 현실적으로 구현이 어렵습니다.
- LRU (Least Recently Used):
- 과거에 가장 오랫동안 사용되지 않은 페이지를 교체합니다. 지역성의 원리를 이용한 방법으로, 최근에 사용되지 않은 페이지는 앞으로도 사용되지 않을 가능성이 높다는 가정을 기반으로 합니다.
- FIFO (First-In, First-Out):
- 메모리에 가장 오래 있던 페이지를 먼저 교체합니다. 그러나 이 방식은 오래된 페이지가 여전히 필요할 수 있어 효율적이지 않은 경우가 많습니다.
- Clock 알고리즘 (Second Chance Algorithm):
- 각 페이지에 use bit라는 추가 비트를 둬서 교체할 페이지를 결정합니다. 메모리에 처음 로드될 때 use bit이 1로 설정되며, 참조될 때마다 다시 1로 설정됩니다. 교체가 필요할 때는 use bit이 0인 페이지를 찾아 교체하며, 중간에 1인 페이지는 다시 0으로 바꿔줍니다. 이를 통해 교체할 페이지를 결정합니다.
스래싱 (Thrashing)
스래싱은 너무 많은 페이지 폴트가 발생해 CPU가 페이지 교체 작업에만 시간을 소비하는 현상을 말합니다. 이로 인해 시스템 성능이 급격히 저하됩니다. 스래싱의 원인은, 실행 중인 프로세스가 사용할 수 있는 메모리 프레임 수가 너무 적어 필요한 페이지가 자주 메모리에서 빠져나가고 다시 들어오는 상황에서 발생합니다.
- 해결 방법: 운영체제는 페이지 폴트가 너무 자주 발생할 경우 프로세스의 작업 세트 (Working Set) 크기를 조정하거나 프로세스를 일시 중단해 메모리 자원을 확보할 수 있습니다.
페이지 크기 및 TLB (Translation Lookaside Buffer)
페이지 크기는 운영체제에서 중요한 설정입니다. 페이지 크기가 작을수록 메모리 낭비가 적고, 페이지 테이블 크기가 커집니다. 반면 페이지 크기가 크면 메모리 접근이 효율적일 수 있지만, 내부 단편화가 발생할 수 있습니다.
TLB는 자주 사용하는 페이지 테이블 항목을 캐싱하는 고속 캐시 메모리입니다. 페이지 테이블을 직접 참조하는 대신, TLB에서 최근 사용된 페이지의 물리적 주소를 빠르게 찾을 수 있습니다. 이로써 메모리 접근 속도를 크게 향상시킬 수 있습니다