메모리 관리 & 가상 메모리

SIHA·2026년 1월 9일

CS복습_OS

목록 보기
6/7

RAM과 주소 공간

RAM (Random Access Memory)
주기억 장치의 주요 구성 요소로, 실행 중인 프로그램과 데이터를 저장해 CPU가 빠르게 접근 가능
데이터를 읽고 쓰는 속도가 빠른 휘발성 메모리
임의 접근 가능 = 어느 위치든 동일한 시간에 접근 가능
RAM 용량이 클수록 한 번에 많은 프로그램을 RAM에 적재하여 동시에 실행할 수 있음

주소 공간
: 메모리의 각 위치를 식별하는 고유한 주소의 범위
메모리의 주소 강간은 물리 주소 또는 논리 주소로 표현됨

물리 주소 (Physical Address): 실제 메모리의 물리적인 위치
논리 주소 (Logical Address): CPU에서 참조하는 가상의 주소
CPU와 운영체제는 논리 주소를 물리 주소로 변환하여 데이터에 접근

프로그램이 다른 물리 주소를 갖게 되더라도 CPU에서는 항상 동일한 논리 주소를 참조할 수 있고,
프로그램에 독립적인 논리 주소 공간을 할당하여 다른 프로그램의 메모리의 침범을 방지할 수 있어 논리 주소가 필요하다.

MMU의 주소 변환

MMU (Memmory Management Unit)

CPU가 메모리에 접근하는 것을 관리하는 하드웨어 부품
2개의 레지스터 정보를 사용하여 메모리 접근을 관리함

  • 베이스 레지스터 (Base register): 현재 프로그램의 메모리 시작 위치를 저장
  • 한계 레지스터 (Limit register): 현재 프로그램의 메모리 크기(범위)를 저장

주소 변환

물리 주소 = 베이스 레지스터 + 논리 주소

접근 검증

변환된 물리 주소가 베이스 레지스터, 베이스 레지스터 + 한계 레지스터 범위 내에 있는지 확인
만약 범위를 벗어나면 침범 탐지(트랩 또는 예외 발생) 후 접근을 차단

프로그램 실행 시 메모리 최적화 기법

동적 로딩 (Dynamic Loading)

전체 프로그램을 한꺼번에 메모리에 적재하지 않고, 프로그램 실행 중 필요한 모듈/데이터를 실시간으로 메모리에 적재하는 기술
개발자가 직접 제어하며, 명시적인 코드 작성이 필요하다.

장점

  • 메모리 사용 감소
  • 시작 속도 향상 (초기 로딩 시간 단축)
  • 유연한 업데이트 가능

단점

  • 로드/언로드 시점 관리 필요(메모리 누수 위험)
  • 코드 복잡도 증가

동적 연결 (Dynamic Linking)

프로그램 실행 시 외부 라이브러리(함수, 코드)를 연결하는 기술
OS가 자동 관리하며, 실행 파일 크기를 줄임
정적 연결(Static Linking)에서는 컴파일 시 라이브러리를 프로그램에 포함하지만, 동적 연결은 실행 중 필요한 시점에 라이브러리를 로드하여 연결한다.

장점

  • 실행 파일 크기 축소
  • 라이브러리 업데이트 시 재 컴파일 불필요
  • 여러 프로그램이 동일한 라이브러리를 공유하여 메모리 사용 효율 증가

메모리 할당 방식

메모리의 낮은 주소 영역 -> 운영체제 커널이 상주
메모리의 높은 주소 영역 -> 사용자 프로그램이 올라가게 됨
사용자 프로그램을 메모리에 할당하는 방식이 나뉨

연속 할당

프로세스가 사용하는 메모리 공간이 연속된 블록으로 할당되는 방식
하나의 프로세스는 메모리의 연속된 범위를 독점적으로 사용CPU가 메모리에 접근하는 것을 관리하는 하드웨어 부품

내부 조각: 프로그램 적재 뒤 남게 되는 메모리 공간
외부 조각: 해당 분할이 비어있는데도 프로그램을 적재하지 못해 낭비되논 메모리 공간

독점 분할 방식

메모리를 고정된 크기로 나눠 할당 (각각의 크기는 상이할 수 있음)
내부 조각, 외부 조각 문제가 발생할 수 있음

가변 분할 방식

프로그램에 따라 분할의 크기, 개수가 동적으로 변하는 방식
내부 조각이 발생하지 않지만 외부 조각 문제가 발생할 수 있음

프로그램을 적재할 메모리 공간을 선택하는 알고리즘

  • first-fit: 가장 처음으로 발견된 가용 공간에 메모리를 할당
  • best-fit: 프로세스가 들어갈 수 있는 빈 공간 중, 크기가 가장 작은 공간에 메모리 할당

불연속 할당

페이징 기법

프로세스를 고정된 크기의 페이지로 나누어 메모리에 할당하는 방식
프로세스를 연속된 공간에 배치하지 않고, 물리 메모리의 빈 공간을 효율적으로 활용

페이지: 프로세스의 논리 주소 공간을 일정 크기로 나눈 단위
프레임: 물리 메모리를 일정 크기(페이지와 동일한 크기)로 나눈 단위
페이지 테이블: 프로세스의 페이지와 물리 메모리 프레임 간의 매핑 정보를 저장하고, 각 페이지가 어느 프레임에저장되었는지 정보를 제공한다.

페이지 테이블의 주소 변환 기법

  • CPU가 사용하는 논리적 주소를 페이지 번호와 페이지 오프셋으로 나누어 주소 변환에 사용
  • 페이지 번호를 페이지 테이블 접근의 인덱스로 사용
    -> 해당 페이지의 물리적 메모리상의 기준 주소를 얻음
  • 페이지 오프셋은 하나의 페이지 내에서의 변위를 의미
  • 기준 주소값에 변위를 더함으로써 요청된 논리적 주소에 대응하는 물리적 주소를 얻음

페이지 테이블의 구현

페이지 테이블은 물리적 메모리에 위치
운영체제는 2개의 레지스터를 사용하여 프로세스의 페이지 테이블에 접근

2개의 레지스터

1) 페이지 테이블 베이스 레지스터 (PTBR)
기능: 현재 실행 중인 프로세스의 페이지 테이블 시작 주소를 저장
역할: CPU가 페이지 테이블에 접근할 수 있도록 기준 주소 제공

2) 페이지 테이블 길이 레지스터 (PTLR)
기능: 페이지 테이블의 엔트리 개수(크기)를 저장
역할: 주소 변환 시, 잘못된 페이지 번호에 접근하지 않도록 보호

TLB (Translation Look-aside Buffer)

: 페이지 테이블의 일부를 캐싱하는 고속 메모리
페이지 테이블 접근 시간을 줄이기 위해 자주 참조되는 페이지-프레임 매핑 정보를 저장

  • TLB Hit
    TLB에 페이지 번호와 매핑된 프레임 번호가 이미 저장되어 있으면 빠르게 변환
    페이지 테이블 접근 없이 즉시 물리 주소로 변환 가능
  • TLB Miss
    TLB에 해당 페이지 번호가 없을 경우, 페이지 테이블에 접근하여 변환
    변환된 정보는 TLB에 저장하여 이후 접근을 가속화

세그멘테이션

논리적으로 나뉜 세그먼트(Segment)로 분할하여 메모리에 할당하는 방식
페이징과 달리, 고정 크기가 아닌 가변 크기로 분할되며, 프로그램의 논리적 구조(코드, 데이터, 스택 등)를 반영하는 것이 특징

세그먼트: 프로그램의 논리적인 구성 요소
세그먼트 번호: 세그먼트를 식별하는 번호
오프셋: 해당 세그먼트 내의 위치

세그먼트 테이블의 구조

  • 한계(limit): 세그먼트 크기
  • 기준(base): 세그먼트 시작 주소

장점

  • 프로그램의 코드, 데이터, 스택 등을 논리적 단위로 관리
  • 가변 크기 세그먼트를 사용하여 메모리 낭비를 줄임

단점

  • 외부 조각 발생 가능
    - 세그먼트 크기가 가변적이므로 메모리 공간에 빈 조각이 생길 수 있음
  • 주소 변환 오버헤드
    - 세그먼트 테이블을 조회하는데 추가 시간이 소요

가상 메모리 (Virtual Memory)

물리적 메모리 (RAM)의 크기와 관계 없이, 실행 중인 프로세스가 사용할 수 있는 주소 공간을 확장하는 메모리 관리 기법
실제로 물리 메모리에 없는 부분은 디스크의 스왑 공간(Swap Space)을 활용하여 실행

요구 페이징 (Demand Paging)

가상 메모리 기법 중 하나로, 프로세스 실행 시 필요한 페이지만 메모리에 로드하여 메모리 사용 효율을 높임

작동 원리

  • 프로세스가 실행되면, 페이지 테이블이 초기화됨
  • 페이지 테이블에는 모든 페이지가 "메모리에 없음"으로 표시
  • CPU가 프로세스의 가상 주소에 접근했을 때, 해당 페이지가 메모리에 없으면 페이지 폴트(Page Fault) 발생
    - 페이지 폴트(Page Fault): 프로세스가 참조하는 페이지가 메모리에 없는 경우 발생
  • 운영체제는 디스크에서 해당 페이지를 메모리로 가져오고 페이지 테이블을 갱신
  • 페이지가 메모리에 올라오면 정상적으로 실행

페이지 교체 알고리즘

가상 메모리 시스템에서 메모리가 부족할 때 어떤 페이지를 교체할지 결정하는 기법
페이지 폴트가 발생했을 때, 물리 메모리가 가득 차 있으면 새로운 페이지를 로드하기 위해 기존의 페이지를 내보내야 할 때 사용됨

FIFO(First-In-First-Out)

가장 먼저 메모리에 들어온 페이지를 가장 먼저 교체
운영체제가 페이지의 도착 순서를 관리하며, 큐(Queue)를 사용해 구현

장점

  • 구현이 간단하고 직관적

단점

  • 페이지가 오래된 순서로 제거되므로, 실제로 자주 사용되는 페이지가 교체될 가능성 있음
  • 벨라디의 역설 (Belady's Anomaly) 발생: 메모리 크기를 늘려도 페이지 폴트가 증가할 수 있음

OPT (Optimal Page Replacement)

가장 오랫동안 사용되지 않을 페이지를 교체
이론적으로 가장 효율적이지만, 미래의 참조를 예측해야 하므로 실제 시스템에서는 구현 불가능

장점

  • 페이지 폴트를 최소화

단점

  • 미래 참조를 알 수 없기 때문에 실제 구현이 어려움

LRU (Least Recently Used)

가장 오래 사용되지 않은 페이지를 교체
운영체제가 페이지의 참조 시간을 기록하여 가장 오래 사용하지 않은 페이지를 선택

장점

  • OPT 알고리즘에 근접한 성능
  • 실제 구현 가능

단점

  • 참조 시간을 기록해야 하므로, 구현이 복잡하고 추가적인 오버헤드 발생
  • 참조 횟수를 고려하지 않음

LFU (Least Frequently Used)

참조 횟수가 가장 적은 페이지를 교체
각 페이지의 참조 횟수를 카운트하여 교체 기준으로 사용

장점

  • 자주 사용되는 페이지를 우선적으로 유지

단점

  • 최근에 자주 사용된 페이지가 아닌 과거의 참조 횟수가 높은 페이지가 유지될 수 있음

Second-Chance (Clock Algorithm)

페이지에 참조 비트 (Reference Bit)를 사용하여 두 번의 기회를 부여
각 페이지가 메모리에 적재되거나 접근될 때 페이지의 참조 비트가 1로 설정됨
포인터가 페이지를 시계 방향으로 순회하며 참조 비트를 확인
참조 비트가 1이면 비트를 0으로 바꾸고 교체를 연기, 0이면 페이지를 교체
페이징 시스템에서 실제로 쓰이는 알고리즘

장점

  • FIFO보다 페이지 폴트를 줄임
  • 구현이 비교적 간단
profile
뭐라도 해보자

0개의 댓글