지난 글에서는 캐시 메모리(Cache Memory)가 왜 필요한지, 그리고 어떤 원리로 성능을 향상시키는지에 대해 정리했습니다.
하지만 CPU가 실제로 실행할 프로그램(Program)과 데이터는 결국 주 기억 장치(Main Memory)에 적재되어야 합니다.
즉, 주 기억 장치(Main Memory)는 단순한 저장 공간이 아니라 프로그램(Program)이 실제로 실행되는 핵심 공간입니다.
문제는 주 기억 장치(Main Memory)의 크기가 한정되어 있다는 점입니다.
운영체제(OS)는 여러 프로세스(Process)가 이 공간을 함께 사용하는 환경에서, 메모리를 효율적으로 할당하고 보호하며 필요에 따라 교체까지 수행해야 합니다.
이번 글에서는 주 기억 장치(Main Memory)의 역할과 관리 방식, 페이지 교체 방식(Page Replacement Policy)까지 함께 정리해보겠습니다.

주 기억 장치(Main Memory)는 일반적으로 RAM(Random Access Memory)을 의미하며, 휘발성 메모리(Volatile Memory)에 해당합니다.
즉, 전원이 꺼지면 저장된 데이터가 사라지는 임시 저장 공간입니다.
주 기억 장치(Main Memory)에는 실행할 프로그램(Program)의 코드와 데이터가 적재됩니다.
이때 프로그램(Program)은 일반적으로 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack) 영역으로 나뉘어 메모리에 배치됩니다.
CPU는 주 기억 장치(Main Memory)에 접근하여 필요한 명령어와 데이터를 읽어와 사용합니다.
주 기억 장치(Main Memory)는 CPU가 직접 접근하는 중요한 공간이지만, 그 크기는 무한하지 않습니다.
하나의 프로세스(Process)만 실행되는 환경이라면 비교적 단순하게 사용할 수 있겠지만, 실제 컴퓨터에서는 여러 프로세스(Process)가 동시에 실행되며 모두 메모리를 필요로 합니다.
이때 운영체제(OS)가 개입하지 않으면 다음과 같은 문제가 발생할 수 있습니다.
따라서 운영체제(OS)는 각 프로세스(Process)에 적절한 메모리 공간을 할당하고, 서로의 영역을 침범하지 못하도록 보호하며, 사용이 끝난 메모리를 회수하는 역할을 수행합니다.
운영체제(OS)는 제한된 주 기억 장치(Main Memory)를 효율적으로 활용하기 위해 여러 가지 방식으로 관리합니다.
크게 보면 연속 할당(Contiguous Allocation)과 비연속 할당(Non-contiguous Allocation)으로 나눌 수 있습니다.

연속 할당(Contiguous Allocation)은 하나의 프로세스(Process)에 대해 연속된 메모리 공간을 할당하는 방식입니다.
즉, 프로세스(Process)가 사용할 메모리 영역이 물리적으로 이어져 있습니다.
구조가 단순하고 이해가 쉽다는 장점이 있지만, 메모리 사용이 복잡해질수록 비효율이 발생할 수 있습니다.
연속 할당은 다시 고정 분할(Fixed Partition)과 가변 분할(Variable Partition)으로 나눌 수 있습니다.
주 기억 장치(Main Memory)를 미리 정해진 크기의 여러 구역으로 나눈 뒤, 각 구역에 프로세스(Process)를 배치하는 방식입니다.
구현이 단순하다는 장점이 있지만, 프로세스(Process)의 크기와 분할 크기가 정확히 맞지 않으면 내부 단편화(Internal Fragmentation)가 발생할 수 있습니다.
프로세스(Process)의 크기에 맞게 필요한 만큼 메모리 공간을 나누어 할당하는 방식입니다.
고정 분할보다 공간 활용 면에서는 유리하지만, 여러 프로세스(Process)가 생성되고 종료되는 과정에서 빈 공간이 불규칙하게 남을 수 있고 외부 단편화(External Fragmentation)가 발생할 수 있습니다.
가변 분할(Variable Partition) 방식에서는 프로세스(Process)의 크기에 맞게 필요한 만큼 메모리를 할당합니다.
이때 운영체제(OS)는 여러 개의 빈 공간(Hole) 중 어느 공간에 프로세스를 배치할지 결정해야 하는데, 이를 위한 기준을 배치 정책(Placement Policy) 이라고 합니다.
대표적인 방식은 다음과 같습니다.
First Fit
First Fit은 프로세스(Process)가 들어갈 수 있는 첫 번째 빈 공간에 바로 할당하는 방식입니다.
구현이 단순하고 검색 속도가 빠르다는 장점이 있지만, 앞부분에 작은 빈 공간들이 많이 남아 외부 단편화(External Fragmentation)가 심해질 수 있습니다.
Best Fit
Best Fit은 프로세스(Process)가 들어갈 수 있는 빈 공간 중 가장 크기가 딱 맞는, 즉 가장 작은 적합 공간에 할당하는 방식입니다.
공간 낭비를 줄일 수 있을 것처럼 보이지만, 오히려 아주 작은 빈 공간들을 많이 남기게 되어 외부 단편화가 심해질 수 있습니다.
Worst Fit
Worst Fit은 프로세스(Process)가 들어갈 수 있는 빈 공간 중 가장 큰 공간에 할당하는 방식입니다.
큰 공간을 일부 잘라 사용하기 때문에 이후에도 비교적 큰 빈 공간을 유지할 수 있다는 장점이 있지만, 실제로는 공간 활용 측면에서 비효율적일 수 있습니다.
정리하면, 배치 정책은 모두 빈 공간을 어떻게 사용할지에 대한 기준이지만, 각 방식마다 메모리 활용 효율과 단편화 측면에서 서로 다른 특징을 가집니다.

비연속 할당(Non-contiguous Allocation)은 하나의 프로세스(Process)를 떨어진 여러 메모리 공간에 나누어 저장할 수 있도록 하는 방식입니다.
이 방식은 메모리를 더 유연하게 사용할 수 있게 해주며, 현대의 메모리 관리 방식과 밀접하게 연결됩니다.
대표적으로 페이징(Paging)과 세그멘테이션(Segmentation)과 같은 방식이 있습니다.

페이징(Paging)은 프로세스(Process)의 논리 주소 공간을 고정된 크기의 페이지(Page) 단위로 나누고, 물리 메모리(Physical Memory)는 같은 크기의 프레임(Frame) 단위로 나누어 관리하는 방식입니다.
즉, 프로세스(Process)는 연속된 하나의 큰 공간에 올라가는 것이 아니라, 여러 페이지(Page)로 나뉘어 서로 떨어진 프레임(Frame)에 저장될 수 있습니다.
이 방식의 장점은 메모리를 일정한 크기로 나누어 관리하기 때문에, 연속된 큰 공간이 없어도 적재가 가능하다는 점입니다.
또한 외부 단편화(External Fragmentation)를 줄일 수 있습니다.
다만 페이지(Page)의 크기는 고정되어 있기 때문에, 마지막 페이지 내부에 사용되지 않는 공간이 남을 수 있으며 이로 인해 내부 단편화(Internal Fragmentation) 가 발생할 수 있습니다.
즉, 페이징(Paging)은 메모리를 고정 크기 단위로 나누어 효율적으로 관리하는 방식이라고 볼 수 있습니다.
세그멘테이션(Segmentation)은 프로세스(Process)를 고정된 크기가 아니라, 논리적인 의미 단위(세그먼트, Segment)에 따라 나누어 관리하는 방식입니다.
예를 들어 하나의 프로그램(Program)은 자연스럽게 다음과 같은 단위로 나눌 수 있습니다.
즉, 세그멘테이션(Segmentation)은 프로그램의 실제 구조를 반영하여 메모리를 나누는 방식이라고 볼 수 있습니다.
이 방식의 장점은 프로그램의 논리적 구조를 그대로 반영할 수 있어 이해하기 쉽고, 보호(Protection)나 공유(Sharing) 설정에도 유리하다는 점입니다.
하지만 세그먼트(Segment)의 크기가 서로 다르기 때문에, 메모리 사용이 반복되면 빈 공간이 불규칙하게 남아 외부 단편화(External Fragmentation) 가 발생할 수 있습니다.
즉, Segmentation은 논리적인 프로그램 구조를 기준으로 메모리를 나누는 방식이라고 이해하면 됩니다.

위에서 설명하면서 단편화(Fragmentation)이 등장했었습니다.
단편화(Fragmentation)은 메모리(Memory)를 할당하고 해제하는 과정에서 사용하지 못하는 빈 공간이 생기는 현상을 의미합니다.
내부 단편화(Internal Fragmentation)은 할당된 공간 내부에서 사용되지 않는 부분이 남는 경우를 말합니다.
예를 들어 100KB 크기의 공간을 할당받았지만 실제로는 80KB만 사용한다면, 나머지 20KB는 할당은 되었지만 활용되지 않는 공간이 됩니다.
주로 고정 분할(Fixed Partition)과 페이징(Paging) 기법에서 발생합니다.
외부 단편화(External Fragmentation)는 메모리에 작은 빈 공간이 흩어져 있어서, 총합으로는 여유 공간이 있어도 연속된 큰 공간을 할당하지 못하는 경우를 말합니다.
예를 들어 5KB 크기의 공간이 메모리 내에 4곳에 존재하지만 20KB 크기의 공간을 할당하지 못하는 경우를 말합니다.
주로 가변 분할(Variable Partition)과 세그멘테이션(Segmentation) 기법에서 발생합니다.
주 기억 장치(Main Memory)의 공간이 부족할 때, 운영체제(OS)는 모든 프로세스(Process)를 주 기억 장치(Main Memory)에 올려둘 수 없습니다.
이 때 사용되는 방식 중 하나가 스와핑(Swapping) 입니다.
스와핑(Swapping)은 현재 당장 실행되지 않는 프로세스(Process)를 주 기억 장치(Main Memory)에서 보조 기억 장치(Secondary Stroage)로 옮기고, 필요한 다른 프로세스(Process)를 다시 주 기억 장치(Main Memory)로 가져오는 방식입니다.
즉, 한정된 메모리 공간을 효율적으로 사용하기 위해 프로세스(Process)를 잠시 밖으로 내보냈다가 다시 불러오는 개념입니다.
다만 보조 기억 장치(Secondary Storage)는 주 기억 장치(Main Memory)보다 훨씬 느리기 때문에 스와핑이 자주 발생하면 시스템 성능이 저하될 수 있습니다.
Paging 방식에서는 프로세스(Process)의 메모리 공간이 여러 페이지(Page) 단위로 나뉘어 관리됩니다.
이때 CPU가 필요한 페이지(Page)에 접근하려 했지만, 해당 페이지가 현재 주 기억 장치(Main Memory)에 없다면 페이지 부재(Page Fault)가 발생합니다.
운영체제(OS)는 필요한 페이지를 메모리로 가져와야 하며, 빈 프레임(Frame)이 없다면 기존 페이지 중 하나를 내보내야 합니다.
즉, 어떤 페이지를 교체할 것인지 결정하는 기준이 바로 페이지 교체 정책(Page Replacement Policy)입니다.
페이지 교체 정책을 이해하려면 먼저 페이지 부재(Page Fault) 개념을 알아둘 필요가 있습니다.
페이지 부재(Page Fault)는 CPU가 어떤 페이지(Page)에 접근하려고 했지만, 그 페이지가 현재 주 기억 장치(Main Memory)에 올라와 있지 않은 상황을 의미합니다.
이 경우 운영체제(OS)는 다음과 같은 과정을 수행합니다.
즉, 페이지 부재(Page Fault)는 운영체제(OS)가 메모리 부족 상황에서 어떤 페이지를 교체할지 판단해야 하는 직접적인 계기가 됩니다.

FIFO(First In First Out)는 가장 먼저 들어온 페이지(Page)를 가장 먼저 교체하는 방식입니다.
즉, 메모리에 가장 오래 머물렀던 페이지를 내보내는 방식이라고 볼 수 있습니다.
구조가 단순하고 구현이 쉽다는 장점이 있지만, 오래 있었다는 이유만으로 앞으로도 계속 필요할 수 있는 페이지가 교체될 수 있다는 문제가 있습니다.
따라서 성능이 항상 좋다고 보기는 어렵습니다.
OPT(Optimal Page Replacement)는 앞으로 가장 오랫동안 사용되지 않을 페이지(Page)를 교체하는 방식입니다.
이론적으로는 가장 이상적인 방법이며, 페이지 부재(Page Fault)를 최소화할 수 있습니다.
하지만 미래에 어떤 페이지가 언제 사용될지를 미리 정확히 알아야 하므로 실제 시스템에서 직접 구현하기는 어렵습니다.
그래서 보통 다른 교체 정책의 성능을 비교하는 기준으로 사용됩니다.
LRU(Least Recently Used)는 가장 오랫동안 사용되지 않은 페이지(Page)를 교체하는 방식입니다.
과거에 오래 사용되지 않았다면 가까운 미래에도 사용되지 않을 가능성이 높다고 가정하는 방식입니다.
프로그램의 지역성(Locality) 특성과 잘 맞기 때문에 실제로 매우 자주 언급되는 정책입니다.
다만 각 페이지(Page)가 마지막으로 언제 사용되었는지를 계속 추적해야 하므로 구현 비용이 커질 수 있습니다.
LFU(Least Frequently Used)는 사용 횟수가 가장 적은 페이지(Page)를 교체하는 방식입니다.
즉, 자주 사용되지 않는 페이지는 앞으로도 중요도가 낮을 것이라고 가정합니다.
하지만 과거에 잠깐 많이 사용되었지만 지금은 거의 쓰이지 않는 페이지가 계속 남아 있을 수 있다는 문제가 있습니다.
따라서 단순 사용 횟수만으로 판단하면 실제 사용 패턴을 충분히 반영하지 못할 수 있습니다.
Clock(Second Chance) 방식은 FIFO(First In First Out)를 개선한 형태로, 각 페이지(Page)에 참조 비트(Reference Bit)를 두고 최근 사용 여부를 확인한 뒤 교체 대상을 정하는 방식입니다.
참조 비트가 0이면 교체 대상으로 삼고, 1이면 한 번 더 기회를 주고 비트를 0으로 바꾼 뒤 다음 페이지로 넘어갑니다.
LRU(Least Recently Used)의 장점을 어느 정도 반영하면서도 구현 부담은 상대적으로 적기 때문에 실제 시스템에서 자주 활용되는 방식입니다.
NRU는 최근에 사용되지 않은 페이지(Page)를 우선적으로 교체하는 방식입니다.
운영체제(OS)는 각 페이지(Page)에 대해 보통 다음과 같은 비트를 참고합니다.
NRU는 이 두 비트를 기준으로 페이지를 몇 개의 등급으로 나누고, 최근에 사용되지 않았고 수정도 덜 된 페이지를 우선적으로 교체하려고 합니다.
일반적으로는 아래와 같이 분류할 수 있습니다.
운영체제(OS)는 보통 낮은 클래스의 페이지부터 교체 대상으로 선택합니다.
즉, NRU는 최근에 사용되지 않았고, 가능하면 다시 기록할 필요도 적은 페이지를 우선적으로 교체하는 방식이라고 볼 수 있습니다.
장점
단점
즉, NRU는 구현 부담은 비교적 낮추면서도 최근 사용 여부를 반영하려는 절충형 정책이라고 이해하면 됩니다.
각 페이지 교체 정책은 다음과 같은 특징을 가집니다.
즉, 운영체제(OS)는 단순히 가장 좋은 정책 하나만 사용하는 것이 아니라, 성능, 구현 난이도, 현실적인 비용을 함께 고려하여 적절한 방식을 선택하게 됩니다.
페이지 교체가 지나치게 자주 발생하면 CPU가 실제 작업보다 페이지를 교체하고 적재하는 데 더 많은 시간을 쓰게 되는 상황이 발생할 수 있습니다.
이러한 현상을 스레싱(Thrashing) 이라고 합니다.
스레싱이 발생하면 시스템은 겉보기에는 매우 바쁘게 동작하지만, 실제 성능은 크게 떨어집니다.
즉, 주 기억 장치(Main Memory)가 부족한 상태에서 너무 많은 프로세스(Process)를 동시에 실행하려 하면, 오히려 전체 처리 효율이 급격히 낮아질 수 있습니다.
따라서 운영체제(OS)는 메모리 사용량과 페이지 교체 빈도를 적절히 조절하여 스레싱을 방지해야 합니다.
주 기억 장치(Main Memory)는 단순한 데이터 저장 공간이 아니라, 프로그램(Program)이 실제로 실행되고 운영체제(OS)의 자원 관리가 이루어지는 핵심 공간입니다.
운영체제(OS)는 이 한정된 공간을 효율적으로 활용하기 위해 메모리를 할당하고, 보호하고, 회수하며, 필요할 경우 스와핑(Swapping)과 페이지 교체(Page Replacement)까지 수행합니다.
또한 메모리 관리 방식에 따라 단편화(Fragmentation) 문제가 발생할 수 있으며, 페이지 부재(Page Fault)와 스레싱(Thrashing)은 시스템 성능과 직접적으로 연결됩니다.
결국 주 기억 장치(Main Memory)의 관리 방식을 이해하는 것은 운영체제(OS)가 제한된 자원을 어떻게 효율적으로 다루는지 이해하는 데 매우 중요한 기초라고 할 수 있습니다.
| 논리 주소와 물리 주소로 이해하는 가상 메모리(Virtual Memory) (0) | 2026.04.27 |
|---|---|
| 캐시 메모리의 동작 과정 (0) | 2026.04.21 |
| 메모리의 구조와 동작 방식은 어떻게 될까? (0) | 2026.04.20 |
| CPU의 구조와 동작 과정은 어떻게 될까? (1) | 2026.04.20 |
| 운영체제는 어떻게 프로그램을 실행할까? (0) | 2026.04.16 |