놀라운 운영체제 #6 – 물리 메모리 관리 上

전하윤·2025년 7월 28일
0

OS(operating system)

목록 보기
6/6
post-thumbnail

운영체제의 메모리 관리는 단순히 “데이터를 저장하는 공간” 그 이상입니다.
프로세스의 실행, 보호, 효율성에 직결되는 핵심 기술입니다.

이 글에서는 메모리 주소 체계와 주소 바인딩 방식을 중심으로
메모리 관리의 개념을 탄탄하게 정리해보겠습니다.


📚 목차

  1. 메모리 관리의 개요
  2. 메모리 주소
  3. 주소 바인딩
  4. 바인딩 시점

메모리 관리의 개요

1-1. 메모리 관리의 이중성

  • 일괄처리 시스템은 한번에 하나의 작업만 처리하므로 메모리 관리가 단순함
  • 시분할 시스템에서는 운영체제를 포함한 모든 응용 프로그램이 메모리에 올라
    와 실행되기 때문에 메모리 관리가 복잡함

이때 프로세스 입장에서는 메모리를 독차지하려 하고, 메모리 관리자 입장에서는 되도록 관리를 효율적으로 하고 싶어합니다.

1-2 메모리 관리 작업

메모리 가져오기(fetch)

  • 실행할 프로세스와 데이터를 언제 메모리로 가져올지 결정하는 정책
  1. 요구 적재: 운영체제나 시스템 프로그램, 사용자 프로그램 등 참조 요청에 따라 실행 할 프로세스를 메모리에 적재하는 기존의 방법
  2. 예상 적재: 지역성을 이용해서 시스템의 요청을 미리 예측하여 메모리에 적재하는 방법

메모리 배치(placement)

  • 가져온 프로세스와 데이터를 메모리의 어떤 위치에 올려놓을지 결정하는 정책

메모리 재배치(replacement)

  • 꽉 찬 메모리에 새로운 프로세스를 가져오기 위해 보류상태로 프로세스를 내보냄
  • 그때 어떤 프로세스를 내보낼지 결정한다.

2. 메모리 주소

2-1 물리 주소와 논리 주소

메모리의 주소를 표현할때 물리주소와 논리주소로 나눠서 구분한다.

물리 주소 공간

  • 하드웨어 입장에서 바라본 주소 공간으로 컴퓨터마다 크기가 다르다.
  • 말 그대로 컴퓨터에 꽂힌 램 메모리의 실제 주소이다.

논리 주소 공간

  • 사용자 입장에서 바라본 주소이다.
  • CPU에 의 생성됨
  • 프로세스 입장에서 상대 주소가 사용할 수 없는 영역의 위치를 알 필요가 없고, 주소가
    항상 0번지부터 시작하기 때문에 편리하다.

사용자 입장에서 바라본 주소? 뭔가 쉽게 와닿는 표현은 아닌거 같다.
좀 더 자세하게 설명 해보겠다.

실제 주소랑 별개로 프로세스 사용할 수 있는 공간부터 0번지로 판단하고 계산한다. 그렇다면 논리주소를 어떻게 실제 물리주소로 변환 하는 걸까?

2-2 논리주소를 물리주소로 변환하는 과정

  1. 프로그램 P1 실행 시작

    • 사용자 프로그램 P1은 자신이 사용할 메모리가 0번지부터 시작한다고 가정하고 작성됨
    • 예: P1 → 40번지 접근 요청
  2. CPU는 이 요청을 '논리 주소 40'으로 처리

    • 실제로는 물리 메모리 위치를 알지 못함
    • CPU → 논리 주소 40을 MMU로 전달
  3. 메모리 관리자는 '재배치 레지스터'를 확인

    • 운영체제는 프로그램 P1을 360번지에 적재했기 때문에,
      재배치 레지스터에는 360이 설정되어 있음
  4. 주소 변환 수행

    • 물리 주소 = 재배치 레지스터 값 + 논리 주소
    • 360 + 40 = 400
    • 메모리 관리자 → 물리 주소 400으로 변환
  5. 메모리 접근

    • CPU는 최종적으로 물리 주소 400의 메모리 공간에 접근함
    • 이 위치는 P1에게는 논리 주소 40처럼 보이지만,
      실제로는 운영체제에 의해 보호된 안전한 공간

왜 이러한 방식을 사용할까?

  • 보안: 각 프로그램은 자신만의 논리 주소 공간을 가지고, 서로의 메모리 침범을 막음
  • 유연성: 프로그램을 메모리 어디에 적재하든 논리 주소는 그대로 사용 가능
  • 프로세스 격리: 서로 다른 프로그램이 같은 논리 주소를 사용해도, 실제 물리 주소는 다르기 때문에 충돌 없음

재배치 레지스터는 어떻게 설정되나?

  • 운영체제가 새로운 프로세스를 메모리에 적재할 때:
    1. 적절한 메모리 공간 확보 (예: 360~999)
    2. 해당 시작 주소(예: 360)를 재배치 레지스터에 기록
    3. 이후 해당 프로세스는 0부터 시작하는 것처럼 실행됨

용어 한번 더 정리

용어설명
논리 주소(Logical Address)프로그램(P1)이 CPU에 요청하는 주소 (ex. 40)
물리 주소(Physical Address)실제 메모리 상의 주소 (ex. 400)
재배치 레지스터(Relocation Register)논리 주소에 더해질 시작 주소가 기록 된 곳 (ex. 360)
메모리 관리자(Memory Management Unit)주소 변환을 수행하는 하드웨어/소프트웨어 컴포넌트

2-3 주소 바인딩

프로세스는 메모리에 직접 접근하지 않는다. 프로세스는 논리주소를 CPU에 전달하면, 논리 주소를 MMU(메모리 관리 장치)를 통해 변환되어서 물리주소로 변경하고, 그 물리 주소를 통해 실제 메모리에 접근을 한다.

MMU의 다양한 관리 기법

기능설명
고정 분할메모리를 일정 크기로 나누고 프로그램을 넣는 방식
동적 분할프로그램 크기에 맞게 메모리 공간을 동적으로 배정
페이징(Paging)고정된 크기의 페이지 단위로 메모리를 나눠 관리
세그먼테이션논리적 의미를 갖는 단위(코드/데이터/스택 등)로 분할
페이지화된 세그먼테이션위 두 기법의 결합 (실무에서 가장 많이 쓰임)

그렇다면 바인딩이란?

  • 바인딩(binding): 논리 주소와 물리 주소를 매핑시키는 작업
  • 매핑(mapping): CPU의 논리 주소를 실제 메모리의 물리 주소로 연결하는 것

※ 바인딩은 본래 "주소를 연결하는 행위"이지만, 운영체제에서는 이 연결을 "언제 수행하는지"에 따라 분류하는 것이 핵심입니다. 그렇기 때문에 바인딩과 매핑이 용어가 비슷해서 헷갈릴 수 있으나, 바인딩은 "언제 주소를 결정할지", 매핑은 "그 주소를 실제로 어떻게 바꿀지" 이렇게 생각하는게 편하다고 합니다.

바인딩은 총 3가지 시점 중 하나에서 발생할 수 있음:

2-4 바인딩 시점

프로그램이 실행되기 위해서는 작성된 코드가 메모리에 올라가야 하며, 이 과정에서 논리 주소를 물리 주소에 연결하는 작업이 필요합니다. 이 연결 작업을 "주소 바인딩(Address Binding)"이라고 하며, 그 바인딩이 언제 수행되느냐에 따라 크게 세 가지 방식으로 나뉩니다.

컴파일 타임 바인딩 (Compile Time Binding)

컴파일 시간 바인딩은 컴파일 시점에 프로그램의 메모리 적재 위치가 결정되는 방식입니다.
즉, 프로그램이 실행되기도 전에 어느 메모리 주소에 로드될지 컴파일러가 이미 알고 있어야 합니다.

이 방식은 논리 주소와 물리 주소가 사실상 동일하게 처리되며, 별도의 주소 변환 장치(MMU)는 필요하지 않습니다. 하지만 위치가 고정되기 때문에 프로그램의 재배치가 불가능하고, 전체 프로그램을 메모리에 한 번에 로드해야 하기 때문에 유연성이 매우 떨어집니다.

이 방식은 일반적인 운영체제보다는 임베디드 시스템이나 마이크로컨트롤러처럼 메모리 구조가 단순하고 고정된 환경에 적합합니다.

적재 시간 바인딩 (Load Time Binding)

적재 시간 바인딩은 프로그램이 메모리에 로드되는 시점에 실제 물리 주소가 결정되는 방식입니다.

컴파일러는 물리 주소를 모르기 때문에 상대 주소(relocatable address)를 생성하며, 실행 시 운영체제가 해당 프로그램을 메모리의 어느 위치에 올릴지를 결정하고, 그 시작 주소를 재배치 레지스터에 저장합니다.

이 방식은 실행 중에는 메모리 위치가 바뀌지 않지만, 로드 시점에는 다양한 위치에 프로그램을 재배치할 수 있어 컴파일 시간 바인딩보다는 유연합니다. 이때부터 MMU가 필요하게 됩니다.


실행 시간 바인딩 (Run Time Binding)

실행 시간 바인딩은 프로그램이 실제로 CPU에 의해 실행되는 도중에 "주소 변환이 일어나는 방식입니다. 즉 명령어가 실행될 때마다 변환된다.

프로그램은 항상 상대 주소를 사용하고, CPU가 명령어를 실행할 때마다 MMU가 그 논리 주소를 물리 주소로 실시간 변환합니다.
이 방식은 현대의 대부분 운영체제에서 사용되는 방식으로, 메모리 보호, 프로세스 간 격리, 가상 메모리 등과 같은 고급 기능 구현에 필수적입니다.

또한 실행 중에도 메모리 위치를 자유롭게 바꿀 수 있어, 프로세스 스케줄링, 페이징, 스와핑 등의 기법과 잘 어울립니다.

시점에 따른 바인딩 방식 비교

바인딩 시점주소 결정 시점위치 변경 가능성MMU 필요 여부유연성
Compile Time컴파일 시낮음
Load Time적재 시중간
Run Time실행 중높음

[Reference]

profile
개발에 대한 고민과 성장의 기록을 일기장처럼 성찰하며 남기는 공간

0개의 댓글