이번 포스트에서는 운영체제의 핵심 기능 중 하나인 메모리 관리에 대해 자세히 알아보려 한다.
메모리 관리는 운영체제가 시스템의 메모리를 효율적으로 할당하고 관리하여 여러 프로그램이 동시에 실행될 수 있도록 하는 기능이다. 이는 시스템의 안정성과 성능에 직접적인 영향을 미친다.
메모리 할당 및 해제: 운영체제는 프로그램이 필요로 하는 메모리를 할당하고, 사용이 끝난 메모리를 회수하여 다른 프로그램이 사용할 수 있도록 한다.
주소 변환: 프로그램이 사용하는 가상 주소를 실제 물리 주소로 변환하여 프로그램이 메모리에 접근할 수 있도록 한다.
메모리 보호: 각 프로그램이 자신의 메모리 영역만 접근하도록 하여 다른 프로그램의 메모리를 침범하지 않도록 보호한다.
메모리 공유: 여러 프로그램이 동일한 메모리 영역을 공유하여 효율적인 메모리 사용을 가능하게 한다.
이미지 출처 - https://www.geeksforgeeks.org/difference-between-contiguous-and-noncontiguous-memory-allocation/
고정 분할: 메모리를 여러 개의 고정된 크기의 분할로 나누고, 각 분할에 하나의 프로그램을 할당한다. 하지만 프로그램 크기와 분할 크기가 일치하지 않으면 메모리 낭비가 발생할 수 있다.
가변 분할: 프로그램의 크기에 맞게 메모리를 동적으로 할당하는 방식이다. 하지만 메모리 단편화(fragmentation)가 발생할 수 있다.
이미지 출처 - https://inkyu-yoon.github.io/docs/Learned/OS/MemoryManage
페이징(Paging): 메모리를 동일한 크기의 페이지로 나누고, 프로그램도 동일한 크기의 페이지로 나누어 메모리에 적재하는 방식이다. 이는 외부 단편화를 해결하지만, 페이지 테이블을 관리해야 하는 오버헤드가 있다.
세그멘테이션(Segmentation): 프로그램을 논리적인 단위인 세그먼트로 나누고, 각 세그먼트를 메모리에 적재하는 방식이다. 이는 프로그램의 논리적 구조를 반영하지만, 세그먼트 테이블을 관리해야 하는 오버헤드가 있다.
가상 메모리(Virtual Memory): 실제 물리 메모리보다 큰 메모리를 사용하는 것처럼 프로그램을 실행할 수 있게 하는 기법이다. 이는 주로 페이징과 스와핑(swapping)을 통해 구현된다.
메모리 단편화는 메모리 할당과 해제가 반복되면서 사용하지 못하는 작은 메모리 조각들이 생기는 현상이다. 이는 메모리의 효율적인 사용을 방해한다.
외부 단편화: 가변 분할 방식에서 발생하며, 메모리의 빈 공간들이 여러 곳에 흩어져 있어 큰 메모리 블록을 할당할 수 없는 상태를 말한다.
내부 단편화: 고정 분할 방식에서 발생하며, 할당된 메모리 블록 내에 사용되지 않는 공간이 남아있는 상태를 말한다.
현대의 운영체제는 위에서 언급한 다양한 메모리 관리 기법들을 조합하여 사용한다. 예를 들어, 페이징과 세그멘테이션을 결합한 페이징 기반 세그멘테이션 기법을 사용하여 메모리 관리의 효율성과 유연성을 높이고 있다.
메모리 관리는 운영체제의 핵심 기능 중 하나로, 시스템의 안정성과 성능에 직접적인 영향을 미친다. 다양한 메모리 관리 기법들을 이해하고, 그 장단점을 파악하는 것은 시스템 프로그래밍과 운영체제 설계에 있어 매우 중요하다.
출처:
Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating System Concepts (10th ed.). Wiley.
Stallings, W. (2018). Operating Systems: Internals and Design Principles (9th ed.). Pearson.