운영체제의 메모리 관리: 가상 메모리, 스레싱, 메모리 할당과 페이지 교체 알고리즘
운영체제는 한정된 물리 메모리를 효율적으로 관리하기 위해 다양한 기법을 사용합니다.
이 글에서는 가상 메모리 기법부터 시작해, 스와핑과 페이지 폴트, 스레싱, 그리고 메모리 할당 방식 및 페이지 교체 알고리즘을 살펴보겠습니다.
가상 메모리 (Virtual Memory)
가상 메모리의 기본 개념
가상 메모리는 실제 물리 메모리(RAM)가 부족해도 프로그램이 큰 메모리 공간을 사용하는 것처럼 보이게 하는 기법입니다.
- 가상 주소(Virtual Address)
프로그램이 인식하는 메모리 주소입니다. 사용자는 이 주소만 신경 쓰면 되며, 실제 메모리 위치는 운영체제가 관리합니다. - 실제 주소(Physical Address)
실제 RAM 내에 저장된 데이터의 주소입니다. - 메모리 관리 장치(MMU, Memory Management Unit)
가상 주소를 실제 주소로 변환하는 하드웨어 장치로, 매핑 정보를 페이지 테이블(Page Table) 에 저장합니다.
페이지 테이블과 TLB
- 페이지 테이블
가상 메모리의 각 페이지와 실제 메모리 프레임 사이의 매핑 정보를 저장합니다.
예를 들어, 가상 주소 0x1000이 실제 주소 0x2000에 매핑된다면, 페이지 테이블에 해당 정보가 기록됩니다. - TLB (Translation Lookaside Buffer)
페이지 테이블의 매핑 정보를 캐시하는 작은 메모리입니다.- TLB 히트: CPU가 가상 주소를 변환할 때 TLB에 매핑 정보가 있으면, 빠르게 실제 주소를 얻습니다.
- TLB 미스: TLB에 해당 정보가 없으면, 페이지 테이블을 검색해야 하므로 시간이 더 소요됩니다.
TLB의 효과는 전체 주소 변환 시간을 크게 단축시키며, 최신 시스템에서는 TLB의 크기와 효율성이 매우 중요합니다.
가상 메모리의 이점
실제 RAM보다 훨씬 큰 메모리 공간을 사용할 수 있게 해주며, 여러 프로그램이 동시에 실행될 수 있도록 돕습니다.
프로그램은 연속된 메모리 주소를 사용하는 것처럼 보이지만, 실제로는 분산된 프레임에 저장될 수 있어 메모리 활용도를 높입니다.
스와핑과 페이지 폴트
페이지 폴트 (Page Fault)
페이지 폴트는 프로그램이 가상 메모리 주소에 접근했으나 해당 페이지가 RAM에 존재하지 않을 때 발생합니다.
- 동작 과정
- CPU가 가상 주소에 접근 → 해당 페이지가 메모리에 없으면 페이지 폴트가 발생
- 운영체제가 디스크(보조기억장치)에서 해당 페이지를 찾습니다.
- 현재 사용하지 않는 RAM 프레임을 선택하여, 그 위치에 디스크에서 읽어온 페이지를 로드합니다.
- 페이지 테이블을 갱신한 후, 해당 명령어를 재실행합니다.
- Ex
큰 프로그램을 실행할 때, 사용하지 않는 페이지는 디스크에 저장되어 있다가 필요한 순간에 RAM으로 불러와집니다.
스와핑 (Swapping)
스와핑은 RAM이 부족할 때, 덜 사용되는 데이터를 보조기억장치(디스크)로 옮기고 필요한 데이터를 RAM으로 불러오는 과정입니다.
- 목적
한정된 RAM 공간을 효율적으로 재배분하여, 여러 프로그램이 동시에 실행될 수 있도록 합니다. - Ex
여러 응용 프로그램이 동시에 실행될 때, 사용 빈도가 낮은 프로그램의 일부 데이터를 디스크로 옮기고, 사용 중인 데이터는 RAM에 유지합니다.
스레싱 (Thrashing)
스레싱은 페이지 폴트가 너무 자주 발생하여, CPU가 실제 연산 대신 메모리 교체 작업에 대부분의 시간을 소비하는 현상입니다.
너무 많은 프로세스가 동시에 실행되어, 각 프로세스가 필요한 페이지를 자주 교체해야 하는 경우 발생합니다.
- 해결 방법
- 물리적 RAM을 늘리거나, 느린 HDD 대신 빠른 SSD를 사용
- 운영체제에서 작업 세트(Working Set)와 페이지 폴트 빈도(Page Fault Frequency, PFF) 조절 기법을 사용하여 교체 빈도를 조절
작업 세트 (Working Set)
프로세스가 일정 시간 동안 참조한 페이지들의 집합을 미리 메모리에 로드해두어 스와핑과 페이지 폴트를 줄이는 기법입니다.
예를 들어, 프로그램이 반복적으로 사용하는 데이터가 미리 RAM에 로드되어 있어, 페이지 폴트 없이 빠르게 접근할 수 있습니다.
PFF (Page Fault Frequency)
페이지 폴트가 발생하는 빈도를 모니터링하고, 상한선과 하한선을 정해 페이지 폴트가 너무 많으면 더 많은 메모리 프레임을 할당하고, 너무 적으면 메모리 프레임을 줄이는 방식입니다.
예를 들어, 페이지 폴트가 일정 이상 발생하면, 운영체제가 해당 프로세스에 더 많은 RAM을 할당하여 성능 저하를 방지합니다.
메모리 할당 방식
운영체제는 프로그램에 메모리를 할당할 때 여러 방식으로 관리합니다. 크게 연속 할당과 불연속 할당으로 구분됩니다.
연속 할당 (Contiguous Allocation)
연속 할당은 프로그램에 필요한 메모리를 연속된 공간에 할당하는 방식입니다.
고정 분할 방식 (Fixed Partitioning)
메모리를 미리 일정 크기로 나누어, 각 파티션에 프로그램을 할당합니다.
- 장점:
관리가 간단합니다. - 단점
- 내부 단편화(Internal Fragmentation): 파티션 크기보다 작은 프로그램은 남는 공간이 생겨 낭비됩니다.
- 100KB 크기로 미리 나눈 파티션에 70KB 크기의 프로그램을 할당하면 30KB는 낭비됩니다.
3.1.2 가변 분할 방식 (Variable Partitioning)
프로그램의 크기에 따라 메모리를 동적으로 나누어 할당합니다.
- 장점
내부 단편화를 줄일 수 있습니다. - 단점
- 외부 단편화(External Fragmentation): 여러 프로그램이 들어간 후 남는 작은 공간들이 합쳐지지 않아, 큰 프로그램이 들어가지 못하는 경우가 발생합니다.
- 할당 알고리즘
- 최초 적합(First Fit)
메모리의 처음부터 빈 공간을 찾아 할당합니다. - 최적 적합(Best Fit)
프로그램 크기 이상인 빈 공간 중 가장 작은 공간에 할당하여 낭비를 최소화합니다. - 최악 적합(Worst Fit)
가장 큰 빈 공간에 할당하여, 남는 공간을 보다 균등하게 만듭니다.
- 최초 적합(First Fit)
불연속 할당 (Non-Contiguous Allocation)
불연속 할당은 메모리를 고정 크기의 단위로 나눈 후, 프로그램의 각 부분을 분산하여 할당합니다.
페이징 (Paging)
메모리를 고정 크기의 페이지로 나누어, 각 페이지를 RAM의 어느 위치에 저장할 수 있게 합니다.
- 장점
외부 단편화 문제를 해결할 수 있습니다. - 단점
주소 변환이 필요해 오버헤드가 발생합니다. - Ex
4KB 크기의 페이지 단위로 메모리를 관리하고, 각 페이지의 위치를 페이지 테이블에 기록하여 필요한 페이지를 동적으로 로드합니다.
세그멘테이션 (Segmentation)
프로그램을 의미 단위(코드, 데이터, 스택 등)로 나누어, 각 세그먼트를 별도로 관리합니다.
- 장점
프로그램의 논리적 구조에 맞게 메모리를 관리할 수 있으며, 공유와 보안에 유리합니다. - 단점
세그먼트 크기가 가변적이어서 내부 단편화가 발생할 수 있습니다. - Ex
하나의 프로그램을 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트로 분리하여 각각의 용량에 맞게 메모리를 할당합니다.
페이지드 세그멘테이션 (Paged Segmentation)
세그멘테이션과 페이징을 결합한 방식으로, 각 세그먼트를 고정 크기의 페이지로 다시 분할하여 관리합니다.
- 장점
세그멘테이션의 의미 단위 관리와 페이징의 단편화 문제 해결 효과를 동시에 가져옵니다. - 단점
주소 변환 과정이 복잡해질 수 있습니다. - Ex
애플리케이션의 각 세그먼트를 먼저 논리적 단위로 나누고, 이후 각 세그먼트를 4KB 페이지로 분할하여 메모리 관리 테이블에 기록합니다.
페이지 교체 알고리즘 (Page Replacement Algorithms)
RAM은 한정되어 있으므로, 필요한 데이터를 유지하면서 덜 사용되는 데이터를 제거하는 페이지 교체 알고리즘이 필요합니다.
오프라인 알고리즘 (Optimal Algorithm)
미래에 어떤 페이지가 참조될지를 미리 알고 있다고 가정하고, 가장 오랫동안 사용되지 않을 페이지를 교체하는 이상적인 알고리즘입니다.
미래를 정확하게 예측할 수 없으므로, 이론적인 상한선으로만 사용됩니다.
FIFO (First-In, First-Out)
먼저 들어온 페이지를 먼저 교체합니다.
- 장점
구현이 매우 간단합니다. - 단점
가장 오래된 페이지가 항상 덜 중요한 페이지는 아니므로, 효율성이 떨어질 수 있습니다. - Ex
RAM에 순서대로 1, 2, 3, 4가 저장되어 있고, 새로운 페이지 5가 필요하면 가장 먼저 들어온 페이지 1을 내보냅니다.
LRU (Least Recently Used)
가장 오랫동안 사용되지 않은 페이지를 교체합니다.
- 장점
시간 지역성 원칙에 기반하여, 최근에 사용된 페이지는 앞으로도 사용될 가능성이 높다는 점을 이용합니다. - 단점
각 페이지의 사용 기록을 유지해야 하므로, 구현 시 추가 오버헤드가 발생할 수 있습니다. - 구현
해시 테이블과 이중 연결 리스트를 사용하여, 가장 오래 사용된 페이지를 빠르게 찾습니다. - Ex
페이지들이 순서대로 사용된 후, 페이지 3과 4가 오랫동안 사용되지 않았다면, 새로운 페이지 요청 시 이들 중 하나를 교체합니다.
NUR (Not Used Recently) / Clock 알고리즘
각 페이지에 참조 비트(Reference Bit) 를 두어, 최근에 사용되었는지 여부를 판단합니다. 시계 모양의 구조를 따라 사용 비트가 0인 페이지를 찾아 교체합니다.
- 장점
LRU보다 구현이 단순하고 오버헤드가 낮습니다. - Ex
페이지들이 순환 구조(clock)로 배열되어 있고, 주기적으로 참조 비트를 리셋한 후 0인 페이지를 찾아 교체합니다.
LFU (Least Frequently Used)
가장 적게 사용된 페이지, 즉 전체 참조 횟수가 가장 낮은 페이지를 교체합니다.
- 장점
데이터 사용 빈도를 고려하여, 자주 사용되지 않는 페이지를 제거할 수 있습니다. - 단점
시간에 따른 사용 빈도의 변화(예를 들어, 최근 사용 빈도가 높아진 경우)를 반영하기 어려워 구현이 복잡할 수 있습니다. - Ex
여러 페이지 중 참조 횟수가 가장 낮은 페이지를 찾아 교체합니다.
정리
운영체제는 한정된 물리 메모리를 효율적으로 관리하기 위해 다양한 기법을 사용합니다.
- 가상 메모리는 실제 RAM보다 큰 메모리처럼 프로그램에 보여주어, 여러 프로세스가 동시에 실행될 수 있도록 돕습니다.
- 페이지 테이블과 TLB는 가상 주소를 실제 주소로 빠르게 변환해 주며, 페이지 폴트가 발생하면 운영체제가 필요한 데이터를 하드디스크에서 가져와 RAM에 로드합니다.
- 스와핑은 필요 없는 데이터를 디스크로 옮겨, RAM 공간을 확보하는 기법이며, 너무 빈번하게 발생하면 스레싱 현상이 발생하여 시스템 성능이 급격히 떨어집니다.
- 메모리 할당 방식은 연속 할당과 불연속 할당으로 나뉘며, 각 방식은 내부 단편화와 외부 단편화 문제를 다르게 해결합니다.
- 페이지 교체 알고리즘은 RAM이 부족할 때 어떤 페이지를 내보낼지를 결정하는 중요한 역할을 하며, FIFO, LRU, NUR/Clock, LFU 등의 알고리즘이 사용됩니다.
이러한 모든 기술들은 서로 긴밀하게 연관되어, 운영체제가 메모리를 효율적으로 관리하고, 프로그램이 빠르게 실행될 수 있도록 도와줍니다.
'CS_운영체제' 카테고리의 다른 글
[CS_운영체제] 프로세스 관리와 통신 (PCB, 컨텍스트 스위칭, 멀티 프로세싱, IPC) (2) | 2025.03.20 |
---|---|
[CS_운영체제] 프로세스와 스레드, 컴파일 과정과 메모리 구조 (0) | 2025.03.10 |
[CS_운영체제] 메모리와 캐시 (0) | 2025.03.04 |
[CS_운영체제] 컴퓨터 요소 (2) | 2025.01.22 |
[CS_운영체제] 운영체제의 역할과 구조 (0) | 2025.01.10 |