본문 바로가기
정보처리기사/이론설명

[이론설명 이기적] 운영체제 - 기억 장치 관리

by wildOjisan 2025. 7. 28.

🧠 1. 왜 '배치전략'이 필요한가?

컴퓨터의 주기억장치(RAM)는 한정되어 있어요.
여러 개의 프로그램(또는 프로세스)이 동시에 실행되려면, 메모리 안에서 프로그램들이 서로 안 겹치게 들어가야 해요.

그런데, 프로그램의 크기는 다 다르고, 메모리 안에는 빈 공간도 제각각 있어요.


예를 들어:

[사용중 100KB][빈공간 200KB][사용중 50KB][빈공간 300KB][빈공간 150KB]
 

이 상황에서 "150KB짜리 프로그램"을 어디에 넣을까? 를 고민하는 게 바로 배치전략이에요.

 

🎯 예제 상황

메모리의 빈 공간:

  • A: 200KB
  • B: 300KB
  • C: 150KB

여기에 180KB 크기의 프로그램을 넣어야 한다면?

1. 🔹 최초적합 (First Fit)

  • 처음부터 순서대로 찾음.
  • A(200KB)가 처음으로 조건 만족 → A에 배치

2. 🔹 최적적합 (Best Fit)

  • 조건 만족하는 것 중에 가장 작은 공간에 배치
  • A(200KB), B(300KB) 모두 가능 → A가 더 작음 → A에 배치

3. 🔹 최악적합 (Worst Fit)

  • 가장 큰 공간에 배치
  • B(300KB)가 가장 큼 → B에 배치

 

 

-----------------------------------------------------------------------------------------------------------------------

 

 

 

📌 단편화란?

**단편화(Fragmentation)**란
👉 메모리에 사용하지 못하는 자투리 공간이 생기는 현상이에요.
메모리는 남아있는데 프로그램이 들어가지 못하는 상황이죠.


🎯 왜 생기는가?

  • 프로그램의 크기는 제각각인데
  • 메모리는 일정한 블록 또는 연속된 공간만 받아요.
  • 프로그램을 넣고 빼고 하다 보면, 남은 공간이 쪼개지면서 애매한 공간들이 생겨요.

📚 단편화의 종류 2가지

종류                                       설명                                               예시                                                         대표 원인

 

✅ 내부 단편화 (Internal Fragmentation) 할당받은 공간 안에서 일부만 사용하고 나머지는 낭비 100KB 할당받고 80KB만 씀 고정분할 방식, 페이지 방식
✅ 외부 단편화 (External Fragmentation) 사용하지 않는 작은 빈 공간들이 여기저기 흩어져 있음 10KB, 20KB, 15KB 따로 있음 → 50KB 프로그램은 못 들어감 가변분할, 연속할당 방식

외부 단편화 해결방법:
통합(Compaction): 빈 공간들을 하나로 모음

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

1. 🧠 가상기억장치(Virtual Memory)란?

실제 메모리(RAM)가 부족해도, 마치 큰 메모리를 가진 것처럼 프로그램을 실행하게 해주는 기술

🔧 현실 상황 예시

  • 램이 4GB인데, 8GB짜리 프로그램을 실행하고 싶어!
  • 그냥 실행하면? ❌ 실행 안 됨!
  • 근데 OS가 **하드디스크의 일부(보조기억장치)**를 빌려서
    RAM처럼 **"가짜 메모리"**로 사용하면?

➡ 이게 가상기억장치예요!

📌 실제론 없지만, 있는 것처럼 가상의 메모리 공간을 만들어서 사용하는 것.

 

2. 💡 어떻게 가능한가?

가상메모리는 페이지 단위로 관리돼요.

📦 페이지란?

  • 가상 메모리와 실제 메모리를 **작은 단위(예: 4KB)**로 나눔
  • 가상공간 = 페이지(page)
  • 실제 메모리(RAM) = 페이지 프레임(page frame)

OS는 필요한 페이지만 메모리에 조금씩 불러와서 실행해요.
전부 올릴 필요가 없어요!

 

 

 

 

---------------------------------------------------------------------------------------------------------------------

 

 

 

페이지 교체 알고리즘 - 

가상메모리 시스템에서는 페이지 단위로 데이터를 메모리에 올립니다.
그런데 RAM(주기억장치)은 크기가 한정되어 있으니까,
새로운 페이지를 올릴 공간이 없을 때는…

✅ “기존에 있던 페이지 하나를 내보내고, 새로 필요한 페이지를 넣는다.”

이 때,

"어떤 페이지를 내보낼까?"
를 결정하는 **규칙(= 알고리즘)**이 바로 페이지 교체 알고리즘이에요.

 

1. 🔹 FIFO (First-In First-Out)

들어온 순서대로 나간다

  • 큐(Queue) 구조로 이해하면 됨
  • 단순하지만 효율이 낮을 수 있음

FIFO

2. 🔹 LRU (Least Recently Used)

가장 오랫동안 사용되지 않은 페이지 제거

  • 실제로 많은 운영체제에서 LRU 또는 LRU 비슷한 변형을 사용해요
  • 최근에 안 쓰던 놈부터 내보내니 성능이 좋음

LRU

3. 🔹 OPT (Optimal)

앞으로 가장 오랫동안 안 쓸 페이지 제거

  • 프로세스가 앞으로 사용할 페이지를 미리 알아야 함 -> 불가능
  • 비교 연구 목적을 위해 사용됨

 

4. 🔹 LFU (Least Frequently Used)

사용 횟수가 가장 적은 페이지 제거

  • 자주 안 쓰는 페이지는 나가고, 자주 쓰는 놈은 남김
  • 근데 사용 횟수를 저장해야 해서 비용이 큼

LFU

5. 🔹NUR (Not Used Recently)

최근에 사용하지 않은 페이지 교체 (LRU를 근사한 알고리즘)

NUR

 

 

 

 

 

----------------------------------------------------------------------------------------------------------------------

 

 

 

📏 페이지 크기의 영향

페이지 크기가 작을수록, 클수록 어떤 일이 생길까요?

페이지 크기      장점                                                                        단점

 

🔹 작을 때 메모리 낭비(내부 단편화) 줄어듦 페이지 수 많아져 → 관리 오버헤드 증가
🔹 클 때 디스크 I/O 효율 ↑ (한 번에 많이 가져옴) 내부 단편화 증가, 필요 없는 데이터까지 불러옴
 

예시로 쉽게!

  • 페이지 크기 = 1MB인데, 300KB짜리 코드만 필요하면?
    👉 나머지 700KB는 필요 없어도 불러와야 함 → 낭비!
  • 페이지 크기 = 4KB면?
    👉 300KB는 75개 페이지로 쪼개짐 → 관리 부담 커짐

✅ 즉, 페이지 크기는 단편화 ↔ 관리 오버헤드 사이의 트레이드오프(균형)


📍 3. 지역성(Locality)

지역성 = **"프로그램은 일정 시간 동안 특정 부분만 집중적으로 사용한다"**는 성질

지역성 종류                    설명                                                                                           예시

 

🔸 시간 지역성 최근 사용한 데이터를 또 사용할 가능성 ↑ 반복문 안의 변수
🔸 공간 지역성 가까운 주소의 데이터를 함께 사용할 가능성 ↑ 배열 탐색, 함수 실행 순서
 

✅ OS는 이걸 이용해서:

  • 자주 쓰는 데이터는 계속 메모리에 유지
  • 가까운 데이터는 한 번에 같이 로딩

이 덕분에 페이징 방식이 효과적으로 작동함


🔄 4. 워킹셋(Working Set)

워킹셋 = 현재 시간에 “자주 참조되는 페이지들의 집합”

이게 뭔 말이냐면…

✅ 프로그램이 실행될 때, 한 시점에 실제로 필요한 페이지만 모은 집합이에요.

  • 너무 적은 페이지만 메모리에 있으면? → 페이지 부재 자주 발생 (버벅임)
  • 너무 많은 페이지만 메모리에 있으면? → 낭비

➡ 그래서 OS는 프로그램별 워킹셋 크기를 예측해서,

"필요한 만큼만 메모리에 넣자"
페이지 부재 최소화 + 메모리 효율 최대화!

 

 

🧠 스래싱(Thrashing)이란?

너무 자주 페이지 교체가 일어나서, CPU가 실제 일은 못 하고 페이지 갈아끼우기만 하는 현상

즉,
✅ **계속 페이지 부재(Page Fault)**가 발생해서
계속 디스크와 메모리를 왔다 갔다 하느라
실제 프로그램 실행은 거의 안 되는 상황

💬 “메모리는 바쁘게 움직이는데, 프로그램은 멈춘 것처럼 느려짐” → 이게 스래싱!


🪛 스래싱 왜 생기는가?

📉 워킹셋보다 적은 프레임을 할당했을 때

  • 각 프로세스는 실행에 필요한 **워킹셋(자주 쓰는 페이지들)**이 있어요.
  • 근데 메모리에 그걸 다 담을 만큼 **프레임(페이지 공간)**을 안 주면?

→ 필요한 페이지가 없어서 계속 디스크에서 불러옴 →
페이지 부재 발생
기존 페이지는 또 버림 →
→ 다시 그 페이지 필요해짐… → 또 불러옴 → 무한 반복 😱

이게 바로 스래싱의 악순환