운영체제

[가상메모리] 운영체제가 메모리 관리를 하는 방법

2025-06-18 18:26


[가상메모리] 운영체제가 메모리 관리를 하는 방법

시작하기

개발자로서 프로그램을 만들다 보면 이 프로그램에 대한 메모리는 얼마나 사용하는지 궁금할 때가 있다.
다른 프로그램과 동시에 실행이 되어도 충돌 나지 않고 잘 실행되는 이유가 뭘까?
바로 운영체제가 메모리를 잘 관리하고 있기 때문이다.

운영체제의 메모리 관리 방식과 가상 메모리라는 개념이 숨어있다.
가상 메모리가 생겨나게 된 배경부터 주소 바인딩, MMU, 메모리를 효율적으로 관리하는 기술 등에 대해 알아보자.

가상 메모리란?

가상 메모리(Virtual Memory) 는 말 그대로 ‘가상의’ 메모리인데,
실제 메모리(RAM)보다 더 큰 메모리를 쓰는 것처럼 보이게 만든 운영체제가 사용하는 기술이다.

실제로는 하나의 물리적인 메모리 위에서 여러 프로그램이 올라가는데,
운영체제는 각 프로그램에게 마치 자기만의 독립적인 메모리를 가진 것처럼 착각하게 만든다.

🤔 그러면 왜 가상 메모리가 필요한 것일까?

이런 문제를 해결하기 위해 가상 메모리가 생겼다.

가상 메모리는 실제 메모리 구조를 프로세스로부터 숨기고
마치 무한히 메모리를 사용하는 것처럼 추상화시켜서 프로그램의 유연성과 안정성을 높인다

주소 바인딩과 MMU

논리적 주소 VS 물리적 주소

구분설명
논리적 주소 (Logical Address, Virtual Address)프로세스마다 독립적으로 가지는 주소 공간
각 프로세스마다 0번지부터 시작
CPU나 프로세스가 보는 주소
개발자가 보는 주소
물리적 주소 (Physical Address)메모리(RAM)에 실제로 올라가는 위치

운영체제는 이 둘을 연결시켜 주는 역할을 한다.
프로그램은 논리 주소만 사용하고, 물리 주소로의 매핑은 운영체제가 처리해준다.

주소 바인딩 (Address Binding)

논리주소를 물리주소로 바꾸는 과정을 주소 바인딩이라고 한다.
이 주소를 언제 바꾸느냐에 따라 다음 3가지로 나뉜다.

  1. Compile time binding (컴파일 시간 바인딩)

    • 컴파일 시 이미 주소가 결정됨 (주소 고정)
    • 메모리 위치를 바꾸려면 다시 컴파일해야 함
    • 컴파일러는 절대코드(Absolute code) 를 생성함
  2. Load time binding (로딩 시간 바인딩)

    • 프로그램이 메모리에 로드되는 순간 주소가 결정됨
    • 재배치 가능 코드(Relocatable code) 를 생성함
  3. Execution time binding (실행 시간 바인딩)

    • 실행 중에도 물리 주소가 바뀔 수 있음 → 가상 메모리 구현의 핵심
    • MMU 하드웨어 지원 필요
    • 대부분의 시스템에서 사용되는 방식

MMU (Memory Management Unit)

논리 주소를 물리 주소로 변환해주는 하드웨어 장치

사용자 프로그램은 오직 논리 주소만 사용하며,
실제 물리 주소는 MMU와 운영체제가 알아서 처리한다.

메모리를 더 효율적으로 쓰기 위한 방법들

1. 다이나믹 로딩 (Dynamic Loading)

2. 다이나믹 링킹 (Dynamic Linking)

방식설명
정적 링킹 (Static Linking)모든 라이브러리 코드가 실행 파일에 포함됨
동적 링킹 (Dynamic Linking)라이브러리를 실행 중에 메모리에 로드해서 연결함

3. 스와핑 (Swapping)

용어설명
Swap Out메모리 → 디스크
Swap In디스크 → 메모리

CPU 시간을 낭비하지 않고 여러 프로세스를 번갈아가면서 실행 가능

요약




 MMU  가상메모리  메모리관리  운영체제  주소바인딩