⭐⭐⭐ 반드시 / ⭐⭐ 중요 / ⭐ 참고 ⚠️ = 기출 함정 포인트
Chapter 01. 개요
운영체제란 ⭐⭐
- 사용자와 하드웨어 사이에서 컴퓨터 자원(CPU, 메모리, 입출력장치, 파일)을 효율적으로 관리하고, 사용자가 컴퓨터를 편리하게 쓰도록 환경을 제공하는 시스템 소프트웨어
- 컴퓨터 시스템의 4가지 구성 요소 : 하드웨어 → 운영체제 → 응용프로그램 → 사용자
- 커널(Kernel) : 운영체제의 핵심. 메모리에 상주하며 프로세스·메모리·파일·입출력 관리 등 핵심 기능 수행
- 셸(Shell) : 사용자의 명령어를 해석해서 커널에 전달하는 명령어 해석기
- 시스템 호출(System Call) : 응용프로그램이 커널의 기능을 사용하기 위해 요청하는 인터페이스
- 부팅(Booting) : 운영체제를 메인 메모리에 적재하는 과정
목적과 성능 평가 기준 ⭐⭐⭐
- 목적 : 편리성, 효율성, 제어 서비스 향상
- 성능 평가 기준 4가지 ⚠️ 자주 출제
| 기준 | 의미 | 좋아지는 방향 |
|---|---|---|
| 처리 능력 (Throughput) | 일정 시간 내 처리하는 작업량 | ↑ |
| 반환 시간 (Turnaround Time) | 작업 의뢰 ~ 결과를 받을 때까지 걸린 시간 | ↓ |
| 사용 가능도 (Availability) | 필요할 때 즉시 사용 가능한 정도 | ↑ |
| 신뢰도 (Reliability) | 작업 결과가 얼마나 정확한가 | ↑ |
운영체제의 기능
- 자원 관리 : 프로세스(CPU) 관리, 메모리 관리, 입출력장치 관리, 파일 관리
- 시스템 관리 : 사용자 인터페이스 제공, 보호·보안, 네트워킹, 오류 처리
운영체제 운용 기법 ⭐⭐
발달 순서 : 일괄처리 → 다중프로그래밍 / 시분할 / 실시간 / 다중처리 → 분산처리
| 방식 | 설명 |
|---|---|
| 일괄처리 (Batch) | 작업을 모아서 한꺼번에 처리. 사용자와 상호작용 X |
| 다중프로그래밍 | CPU 1개로 여러 프로그램을 메모리에 올려두고, 한 작업이 입출력으로 대기하면 다른 작업 실행 → 동시에 실행되는 것처럼 보임. CPU 이용률 ↑ |
| 시분할 (Time Sharing) | CPU 시간을 잘게 쪼개(Time Slice) 여러 사용자에게 번갈아 할당. 대화식 처리, 응답시간 ↓ (Round Robin 방식) |
| 실시간 (Real Time) | 데이터 발생 즉시 처리. 정해진 시간 안에 반드시 결과를 내야 함 (항공, 은행, 좌석 예약) |
| 다중처리 (Multi Processing) | CPU 여러 개가 하나의 메모리를 공유하며 동시에 처리. 신뢰성·처리량 ↑ |
| 분산처리 (Distributed) | 여러 컴퓨터를 네트워크로 연결. 각 시스템이 독자적인 OS와 메모리를 가지고 독립적으로 운영되며 필요할 때 통신 |
⚠️ 다중프로그래밍 = CPU 1개 / 다중처리 = CPU 여러 개. 헷갈리게 내는 문제 많음.
Chapter 02. 프로세스와 스레드
프로세스 ⭐⭐⭐
- 실행 중인 프로그램. 디스크의 프로그램이 메모리에 적재되어 실행되는 것
- 프로세스 하나는 반드시 PCB(Process Control Block) 하나와 연결됨
- 종류 : 커널 프로세스, 사용자 프로세스
프로세스 메모리 구조
| 영역 | 내용 |
|---|---|
| 코드 (Text) | 실행할 프로그램 명령어 |
| 데이터 (Data) | 전역 변수, 정적(static) 변수 |
| 힙 (Heap) | 실행 중 동적 할당되는 메모리 (malloc, new). 낮은 주소 → 높은 주소로 증가 |
| 스택 (Stack) | 함수 호출 시 지역 변수, 매개변수, 복귀 주소. 높은 주소 → 낮은 주소로 증가 |
프로세스 상태 전이 ⭐⭐⭐
1 | |
| 상태 | 설명 |
|---|---|
| 생성 (New) | 메모리에 작업 공간이 만들어지고 PCB가 생성된 상태 |
| 준비 (Ready) | CPU 할당을 기다리는 상태 (준비 큐에서 대기) |
| 실행 (Running) | CPU를 점유하여 명령어를 실행 중인 상태 |
| 대기 (Blocked / Wait) | 입출력 등 어떤 이벤트가 끝나기를 기다리는 상태 |
| 완료 (Terminated) | 실행이 끝나 CPU와 자원을 반납한 상태. PCB도 삭제 |
| 전이 | 방향 | 원인 |
|---|---|---|
| 디스패치 (Dispatch) | 준비 → 실행 | 스케줄러가 CPU를 할당 |
| 할당 시간 초과 (Timer Run Out) | 실행 → 준비 | 할당된 시간을 다 씀 (타이머 인터럽트) |
| 블록 (Block) | 실행 → 대기 | 입출력 요청 |
| 웨이크업 (Wake Up) | 대기 → 준비 | 입출력 완료 |
⚠️ 대기 → 실행으로 바로 가는 전이는 없음. 입출력이 끝나면 반드시 준비 상태를 거침. ⚠️ 준비 → 대기도 없음.
PCB (Process Control Block) ⭐⭐⭐
- 운영체제가 프로세스를 관리하기 위해 그 프로세스의 정보를 저장한 자료구조
- 프로세스 생성 시 만들어지고, 종료되면 삭제됨
- 저장 정보 : 프로세스 식별자(PID), 프로세스 상태, 프로그램 카운터(PC), 레지스터 값, CPU 스케줄링 정보(우선순위), 메모리 관리 정보, 입출력 상태 정보, 계정 정보, 부모·자식 프로세스 포인터
문맥 교환 (Context Switching) ⭐⭐
- CPU를 다른 프로세스로 넘길 때, 현재 프로세스의 상태(레지스터 등)를 PCB에 저장하고 다음 프로세스의 상태를 PCB에서 복원하는 과정
- 인터럽트, 할당 시간 초과, 입출력 요청 등으로 실행 중인 프로세스가 바뀔 때 발생
- 문맥 교환 중에는 실제 작업을 못 하므로 오버헤드. 자주 일어나면 성능 ↓ → 이를 줄이려고 스레드 사용
스레드 (Thread) ⭐⭐⭐
- 프로세스는 자원(소유) 과 제어(실행 흐름) 로 나눌 수 있는데, 이 중 제어 흐름만 분리한 실행 단위가 스레드
- “경량 프로세스(Light Weight Process)”라고도 부름
| 스레드끼리 공유 | 스레드마다 따로 가짐 |
|---|---|
| 코드, 데이터, 힙, 열린 파일 | 스택, 레지스터, 프로그램 카운터 |
- 장점 : 자원 공유로 메모리 절약(경제성), 문맥 교환 빠름, 응답성 향상, 멀티프로세서 활용
- 단점 : 한 스레드의 오류가 프로세스 전체에 영향, 공유 자원 동기화 필요
사용자 수준 vs 커널 수준 스레드 ⭐
| 구분 | 사용자 수준 스레드 | 커널 수준 스레드 |
|---|---|---|
| 관리 주체 | 사용자 라이브러리 | 운영체제 커널 |
| 속도 | 빠름 (커널 개입 X) | 상대적으로 느림 |
| 한 스레드 블록 시 | 프로세스 전체가 블록 | 다른 스레드는 계속 실행 |
Chapter 03. 병행 프로세스
병행 프로세스 ⭐⭐
- CPU 하나는 한 번에 하나만 실행하지만, 빠르게 전환하여 동시에 실행되는 것처럼 보이는 여러 프로세스
- 공유 자원을 동시에 건드리면 결과가 꼬일 수 있음 → 동기화 필요
임계 자원 / 임계 영역 ⭐⭐⭐
- 임계 자원 : 여러 프로세스가 공유하지만 동시에 사용하면 안 되는 자원
- 임계 영역 (Critical Section) : 임계 자원에 접근하는 코드 부분. 한 번에 하나의 프로세스만 들어가야 함
- 상호 배제 (Mutual Exclusion) : 한 프로세스가 임계 영역에 있으면 다른 프로세스는 못 들어가게 하는 것
임계 영역 문제 해결 조건 3가지 ⭐
| 조건 | 의미 |
|---|---|
| 상호 배제 | 한 번에 하나만 임계 영역에 진입 |
| 진행 (Progress) | 임계 영역이 비어 있으면 들어가려는 프로세스를 무한정 막으면 안 됨 |
| 한정 대기 (Bounded Waiting) | 진입을 요청한 프로세스는 유한한 시간 안에 들어갈 수 있어야 함 |
상호 배제 구현 기법 ⭐⭐
- 소프트웨어 : 데커(Dekker) 알고리즘, 피터슨(Peterson) 알고리즘, 램포트의 빵집(Bakery) 알고리즘
- 하드웨어 : Test-and-Set, Swap 명령어, 인터럽트 비활성화
- 운영체제 동기화 도구 : 세마포어, 모니터
세마포어 (Semaphore) ⭐⭐⭐
- 다익스트라(Dijkstra) 가 제안. 정수 변수 S와 두 연산으로 상호 배제를 구현
| 연산 | 동작 |
|---|---|
| P 연산 (wait) | S > 0이면 S를 1 감소시키고 진입, S = 0이면 대기 → 임계 영역 들어갈 때 |
| V 연산 (signal) | S를 1 증가시키고, 대기 중인 프로세스가 있으면 깨움 → 임계 영역 나올 때 |
- 이진 세마포어 : S가 0 또는 1 (뮤텍스처럼 사용)
- 계수 세마포어 : S가 0 이상 정수 (자원이 여러 개일 때)
- P, V 연산은 중간에 끊기면 안 되는 원자적(Atomic) 연산
모니터 (Monitor) ⭐
- 공유 자원과 그 자원에 접근하는 프로시저를 하나로 묶은 고급 동기화 구조
- 모니터 안에는 한 번에 하나의 프로세스만 들어갈 수 있음 (자동 상호 배제)
- 정보 은폐 : 외부에서는 모니터의 프로시저를 통해서만 자원 접근 가능
- 조건 변수와 wait, signal 연산 사용
대표적인 동기화 문제 ⭐
- 생산자-소비자 문제 (유한 버퍼 문제)
- 판독기-기록기 문제 (Readers-Writers)
- 식사하는 철학자 문제 (교착상태 예시로도 자주 쓰임)
Chapter 04. 교착상태
교착상태 (Deadlock) ⭐⭐⭐
- 둘 이상의 프로세스가 서로 상대방이 가진 자원을 기다리며, 결코 일어나지 않을 사건을 무한정 기다리는 상태
발생 필요조건 4가지 ⭐⭐⭐
4가지가 동시에 모두 만족해야 발생 → 하나만 깨도 예방 가능
| 조건 | 의미 |
|---|---|
| 상호 배제 (Mutual Exclusion) | 한 자원은 한 번에 하나의 프로세스만 사용 가능 |
| 점유와 대기 (Hold and Wait) | 이미 자원을 가진 채로 다른 프로세스의 자원을 기다림 |
| 비선점 (No Preemption) | 자원을 가진 프로세스가 스스로 반납하기 전까지 강제로 빼앗을 수 없음 (선점 = 강제로 빼앗음) |
| 순환 대기 (Circular Wait) | P1 → P2 → … → P1 처럼 대기 관계가 원형(사이클)을 이룸 |
교착상태 해결 방법 4가지 ⭐⭐⭐
① 예방 (Prevention)
필요조건 중 하나를 아예 성립하지 않게 만드는 방법. 자원 낭비가 큼.
| 부정할 조건 | 방법 |
|---|---|
| 상호 배제 부정 | 자원을 공유 가능하게 함 (현실적으로 어려움) |
| 점유와 대기 부정 | 필요한 자원을 실행 전에 한꺼번에 요청·할당. 못 받으면 하나도 안 가짐 |
| 비선점 부정 | 추가 자원을 못 얻으면 가진 자원을 모두 반납 |
| 순환 대기 부정 | 자원마다 번호를 붙이고 번호 순서대로만 요청하게 함 |
② 회피 (Avoidance)
교착상태 가능성을 미리 계산해서 피하는 방법
- 은행원 알고리즘 (Banker’s Algorithm) : 다익스트라가 제안. 자원을 할당했을 때 시스템이 안전 상태(Safe State) 로 남는 경우에만 할당
- 안전 상태 : 모든 프로세스가 어떤 순서로든 끝까지 실행될 수 있는 상태 (안전 순서열이 존재)
- 불안전 상태 : 교착상태가 발생할 수 있는 상태 ⚠️ 불안전 상태 = 교착상태는 아님
③ 탐지 (Detection)
- 교착상태가 생기는 것을 허용하고, 주기적으로 검사해서 찾아냄
- 자원 할당 그래프를 사용. 그래프에 사이클이 있는지 확인
④ 회복 (Recovery)
- 교착상태에 빠진 프로세스를 종료하거나, 자원을 선점해서 다른 프로세스에 할당
교착상태 vs 기아 상태 ⭐⭐
| 구분 | 교착상태 (Deadlock) | 기아 상태 (Starvation) |
|---|---|---|
| 의미 | 서로 기다리느라 아무도 진행 못 함 | 특정 프로세스만 우선순위에 밀려 계속 자원을 못 받음 |
| 해결 | 예방, 회피, 탐지, 회복 | 에이징 (Aging) : 오래 기다린 프로세스의 우선순위를 높여줌 |
Chapter 05. 단일 프로세서 스케줄링
스케줄러 종류 ⭐⭐
| 스케줄러 | 다른 이름 | 역할 |
|---|---|---|
| 장기 스케줄러 | 작업 스케줄러 (Job) | 어떤 작업을 메모리에 올릴지 결정 → 다중 프로그래밍 정도 결정 |
| 중기 스케줄러 | 스와핑 | 메모리가 부족하면 프로세스를 디스크로 내보냄(Swap Out) / 다시 올림(Swap In) |
| 단기 스케줄러 | 프로세스(CPU) 스케줄러 | 준비 큐의 프로세스 중 누구에게 CPU를 할당할지 결정. 가장 자주 실행됨 |
스케줄링 평가 기준 ⭐⭐
- CPU 이용률 ↑, 처리량 ↑, 반환 시간 ↓, 대기 시간 ↓, 응답 시간 ↓
- 반환 시간 = 종료 시간 − 도착 시간 (= 대기 시간 + 실행 시간)
- 대기 시간 = 반환 시간 − 실행 시간
선점 vs 비선점 ⭐⭐⭐
| 비선점 (Non-Preemptive) | 선점 (Preemptive) |
|---|---|
| 한번 CPU를 잡으면 끝날 때까지 실행 | 실행 중에도 CPU를 빼앗을 수 있음 |
| FCFS, SJF, HRN, 우선순위, 기한부 | RR, SRT, 선점 우선순위, 다단계 큐, 다단계 피드백 큐 |
| 문맥 교환 적음, 응답시간 예측 쉬움 | 대화형·실시간 시스템에 적합, 문맥 교환 오버헤드 |
⚠️ 우선순위 스케줄링은 선점·비선점 둘 다 가능
스케줄링 알고리즘 ⭐⭐⭐
FCFS (First Come First Served)
- 준비 큐에 도착한 순서대로 CPU 할당. 가장 단순함
- 긴 작업이 앞에 있으면 뒤의 짧은 작업들이 오래 기다리는 호위 효과(Convoy Effect) 발생
SJF (Shortest Job First)
- 대기 중인 작업 중 실행 시간이 가장 짧은 것을 먼저 실행 (비선점)
- 평균 대기 시간이 최소 (비선점 중에서)
- 긴 작업은 계속 밀리는 기아 상태 발생 가능
- 실행 시간을 미리 정확히 알기 어려움
SRT (Shortest Remaining Time)
- SJF의 선점 버전
- 새 작업이 도착할 때마다 현재 작업의 남은 시간과 비교해서 더 짧으면 CPU를 빼앗음
- 평균 대기 시간은 더 짧지만 문맥 교환 오버헤드 발생
HRN (Highest Response ratio Next) ⭐⭐⭐
- SJF의 약점(긴 작업의 기아 상태)을 보완. 비선점
- 대기 시간이 길어질수록 우선순위가 올라감
1 | |
- 값이 클수록 우선순위가 높음 ⚠️ 작은 게 아니라 큰 것부터!
예시
| 작업 | 대기 시간 | 서비스 시간 | 우선순위 계산 |
|---|---|---|---|
| A | 5 | 5 | (5+5)/5 = 2 |
| B | 10 | 6 | (10+6)/6 ≈ 2.67 |
| C | 15 | 7 | (15+7)/7 ≈ 3.14 |
→ 실행 순서 : C → B → A
우선순위 (Priority) 스케줄링
- 우선순위가 높은 프로세스부터 CPU 할당
- 낮은 우선순위 프로세스의 기아 상태 → 에이징으로 해결
기한부 (Deadline) 스케줄링
- 작업마다 정해진 시간(기한) 안에 끝내도록 계획. 비선점
RR (Round Robin) ⭐⭐⭐
- FCFS 순서로 돌되, 각 프로세스에 같은 크기의 시간 할당량(Time Quantum) 만 주고, 시간이 다 되면 준비 큐 맨 뒤로 보냄 (선점)
- 시분할 시스템에 적합
- 시간 할당량이 너무 크면 → FCFS와 같아짐
- 시간 할당량이 너무 작으면 → 문맥 교환이 잦아져 오버헤드 증가
다단계 큐 (MLQ, Multi-Level Queue) ⭐⭐
- 준비 큐를 우선순위별로 여러 개로 나눔 (시스템 → 대화형 → 편집 → 일괄처리)
- 프로세스는 처음 배정된 큐에 고정. 다른 큐로 이동 불가
- 각 큐는 독자적인 스케줄링 알고리즘 사용 가능
- 상위 큐가 비어야 하위 큐 실행 → 하위 큐 기아 상태 가능
다단계 피드백 큐 (MLFQ / MFQ) ⭐⭐⭐
- 다단계 큐를 보완. 프로세스가 큐 사이를 이동할 수 있음
- 새 프로세스는 최상위 큐로 들어가고, 시간 할당량 안에 못 끝내면 한 단계 아래 큐로 내려감
- 하위 큐일수록 우선순위 ↓, 시간 할당량 ↑
- 마지막 큐는 보통 FCFS 또는 RR
- 짧은 작업·입출력 위주 작업은 빨리 끝나고, CPU를 오래 쓰는 작업은 아래로 내려감
- 에이징으로 기아 상태 방지 가능
| 구분 | 다단계 큐 | 다단계 피드백 큐 |
|---|---|---|
| 큐 간 이동 | 불가 | 가능 |
| 기아 상태 | 발생 가능 | 에이징으로 해결 |
Chapter 06. 메모리 관리
기억장치 관리 전략 ⭐⭐⭐
| 전략 | 질문 | 내용 |
|---|---|---|
| 반입 (Fetch) | 언제 가져올까? | 요구 반입 / 예상 반입 |
| 배치 (Placement) | 어디에 둘까? | 최초 적합 / 최적 적합 / 최악 적합 |
| 교체 (Replacement) | 무엇을 내보낼까? | FIFO, LRU, LFU, OPT, NUR 등 (Chapter 07) |
반입 전략
- 요구 반입 (Demand Fetch) : 실행 중인 프로그램이 요구할 때 메모리로 가져옴
- 예상 반입 (Anticipatory Fetch) : 앞으로 요구될 가능성이 큰 것을 미리 예상해서 가져옴
배치 전략 ⭐⭐⭐
| 전략 | 방법 |
|---|---|
| 최초 적합 (First Fit) | 들어갈 수 있는 빈 공간 중 첫 번째 공간에 할당. 가장 빠름 |
| 최적 적합 (Best Fit) | 들어갈 수 있는 빈 공간 중 가장 작은 공간에 할당 (남는 공간 최소) |
| 최악 적합 (Worst Fit) | 들어갈 수 있는 빈 공간 중 가장 큰 공간에 할당 |
⚠️ 최초 적합은 “가장 큰 첫 번째”가 아니라 “크기가 충분한 첫 번째” 공간
예시 : 빈 공간이 순서대로 15K, 4K, 30K, 13K, 8K 이고, 12K 작업이 들어올 때
| 전략 | 선택되는 공간 | 남는 공간 |
|---|---|---|
| 최초 적합 | 15K (12K 이상인 첫 번째) | 3K |
| 최적 적합 | 13K (12K 이상 중 가장 작음) | 1K |
| 최악 적합 | 30K (가장 큼) | 18K |
메모리 할당 방식 ⭐⭐
- 연속 할당 : 프로그램 전체를 메모리의 연속된 공간에 할당
- 고정 분할 (정적 분할) : 메모리를 미리 고정된 크기로 나눠둠 → 내부 단편화 발생
- 가변 분할 (동적 분할) : 작업 크기에 맞게 나눔 → 외부 단편화 발생
- 분산 할당 : 프로그램을 여러 조각으로 나눠 흩어서 할당 → 페이징, 세그먼테이션 (Chapter 07)
- 오버레이 (Overlay) : 프로그램을 여러 조각으로 나눠 필요한 조각만 차례로 메모리에 올림
- 스와핑 (Swapping) : 프로그램 전체를 메모리와 디스크 사이에서 통째로 교체
단편화 (Fragmentation) ⭐⭐⭐
| 구분 | 내부 단편화 | 외부 단편화 |
|---|---|---|
| 의미 | 분할 영역이 작업보다 커서 할당하고 남은 공간 | 분할 영역이 작업보다 작아서 아예 할당 못 하고 비어 있는 공간 |
| 발생 | 고정 분할, 페이징 | 가변 분할, 세그먼테이션 |
예시 : 10K 영역에 8K 작업 할당 → 2K가 내부 단편화 / 5K 영역에 8K 작업 → 못 들어가서 5K 전체가 외부 단편화
단편화 해결 방법
- 통합 (Coalescing) : 인접한 빈 공간들을 하나로 합침
- 압축 (Compaction) : 흩어진 빈 공간들을 모두 한쪽으로 모아 하나의 큰 공간으로 만듦 (시간 오래 걸림)
- 가비지 컬렉션 : 더 이상 쓰지 않는 공간을 회수
Chapter 07. 가상메모리
가상 메모리 ⭐⭐⭐
- 보조기억장치(디스크)의 일부를 주기억장치처럼 사용하는 기법
- 실제 메모리보다 큰 프로그램도 실행 가능, 다중 프로그래밍 정도 ↑
- 프로그램이 쓰는 가상 주소(논리 주소) 와 실제 메모리의 물리 주소를 분리하고, 실행 중에 변환 → 동적 주소 변환 (DAT, Dynamic Address Translation)
- 주소 변환은 하드웨어인 MMU (Memory Management Unit) 가 담당
- TLB : 페이지 테이블 일부를 저장하는 고속 캐시. 주소 변환 속도 ↑
페이징 vs 세그먼테이션 ⭐⭐⭐
가상 메모리의 이동 단위를 블록이라고 함
| 구분 | 페이징 (Paging) | 세그먼테이션 (Segmentation) |
|---|---|---|
| 블록 크기 | 고정 길이 (페이지) | 가변 길이 (세그먼트) |
| 나누는 기준 | 물리적 크기 | 논리적 단위 (함수, 배열 등) |
| 단편화 | 내부 단편화 | 외부 단편화 |
| 주소 구성 | 페이지 번호 + 오프셋 | 세그먼트 번호 + 오프셋 |
| 사용 테이블 | 페이지 맵 테이블 | 세그먼트 맵 테이블 |
페이지 크기에 따른 영향 ⭐⭐
| 페이지 크기가 작으면 | 페이지 크기가 크면 |
|---|---|
| 페이지 테이블 커짐 | 페이지 테이블 작아짐 |
| 내부 단편화 감소 | 내부 단편화 증가 |
| 필요한 내용만 올라와 지역성 활용 ↑ | 불필요한 내용도 같이 올라옴 |
| 입출력 횟수 증가 | 입출력 횟수 감소 |
페이지 부재와 교체 ⭐⭐⭐
- 페이지 부재 (Page Fault) : 필요한 페이지가 메모리에 없는 상황
- 요구 페이징 (Demand Paging) : 페이지가 실제로 필요할 때만 메모리에 가져옴
- 메모리가 꽉 찬 상태에서 페이지 부재가 나면, 기존 페이지 하나를 골라 내보내야 함 → 페이지 교체 알고리즘
| 알고리즘 | 교체 대상 | 특징 |
|---|---|---|
| OPT (최적) | 앞으로 가장 오랫동안 사용하지 않을 페이지 | 페이지 부재 최소. 미래를 알아야 해서 실제 구현 불가 (비교 기준용). 벨레이디가 제안 |
| FIFO | 메모리에 가장 먼저 들어온 페이지 | 구현 간단. 프레임을 늘렸는데 오히려 부재가 늘어나는 벨레이디의 모순 발생 |
| LRU | 가장 오랫동안 사용하지 않은 페이지 | 과거 사용 기록을 봄. 카운터·스택 필요 |
| LFU | 사용 횟수가 가장 적은 페이지 | |
| NUR | 최근에 사용하지 않은 페이지 | 참조 비트와 변형 비트 사용. 둘 다 0인 페이지부터 교체 |
| SCR (2차 기회) | FIFO에서 참조 비트가 1이면 한 번 더 기회를 줌 | FIFO의 단점 보완 |
⚠️ LRU = 가장 오래 안 쓴 것 (시간 기준) / LFU = 가장 적게 쓴 것 (횟수 기준)
예시 : 프레임 3개, 참조 순서 7, 0, 1, 2, 0, 3, 0, 4
FIFO
| 참조 | 7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 |
|---|---|---|---|---|---|---|---|---|
| 프레임1 | 7 | 7 | 7 | 2 | 2 | 2 | 2 | 4 |
| 프레임2 | 0 | 0 | 0 | 0 | 3 | 3 | 3 | |
| 프레임3 | 1 | 1 | 1 | 1 | 0 | 0 | ||
| 부재 | O | O | O | O | O | O | O |
→ FIFO 7회 / 같은 조건에서 LRU 6회, OPT 6회
지역성 (Locality) ⭐⭐⭐
- 프로세스는 메모리를 균일하게 참조하지 않고, 특정 부분을 집중적으로 참조하는 성질 (데닝이 제시)
- 시간 지역성 : 최근 참조한 곳을 곧 다시 참조 → 반복문(Loop), 스택, 카운터, 서브루틴
- 공간 지역성 : 참조한 곳 근처를 곧 참조 → 배열 순회, 순차적 코드 실행
워킹 셋 (Working Set) ⭐⭐
- 프로세스가 일정 시간 동안 자주 참조하는 페이지들의 집합
- 워킹 셋을 메모리에 유지하면 페이지 부재와 교체가 줄어듦 (지역성 기반)
스래싱 (Thrashing) ⭐⭐⭐
- 페이지 교체가 너무 자주 일어나서, 실제 실행보다 교체에 시간을 더 많이 쓰는 현상
- 다중 프로그래밍 정도가 너무 높으면 발생 → CPU 이용률이 급격히 떨어짐
- 해결 : 다중 프로그래밍 정도를 낮춤, 워킹 셋 유지, 페이지 부재 빈도(PFF) 조절
페이지 부재 빈도 (PFF, Page Fault Frequency) ⭐
- 페이지 부재 비율을 보고 프레임 수를 조절
- 부재율이 높으면 프레임을 더 주고, 낮으면 프레임을 회수
Chapter 08. 디스크 스케줄링
디스크 접근 시간 ⭐⭐
1 | |
- 탐색 시간 (Seek Time) : 헤드를 원하는 트랙(실린더) 까지 이동시키는 시간 → 가장 오래 걸림
- 회전 지연 시간 (Rotational Latency) : 원하는 섹터가 헤드 아래로 올 때까지 회전하는 시간
- 전송 시간 (Transfer Time) : 데이터를 실제로 읽고 쓰는 시간
탐색 시간 최적화 기법 ⭐⭐⭐
| 기법 | 방법 | 특징 |
|---|---|---|
| FCFS | 먼저 도착한 요청부터 처리 | 공평하지만 헤드 이동 많음 |
| SSTF | 현재 헤드에서 탐색 거리가 가장 짧은 요청부터 | 처리량 ↑, 안쪽·바깥쪽 끝 요청은 기아 상태 가능 |
| SCAN | 한 방향으로 끝까지 가면서 처리 후 방향을 바꿔 돌아옴 (엘리베이터 알고리즘) | 대부분 시스템의 기본. 가운데 트랙이 유리 |
| C-SCAN | 한 방향으로만 처리. 끝에 도달하면 처리 없이 반대쪽 끝으로 점프 후 다시 같은 방향으로 처리 | SCAN의 불공평한 대기 시간을 균등하게 |
| LOOK | SCAN과 같지만 디스크 끝까지 가지 않고 그 방향의 마지막 요청까지만 간 뒤 방향 전환 | SCAN보다 불필요한 이동 ↓ |
| C-LOOK | C-SCAN + LOOK. 마지막 요청까지만 가고 반대쪽의 첫 요청 위치로 점프 | |
| N-step SCAN | SCAN 진행 중 새로 들어온 요청은 다음 방향 때 처리 | 헤드가 한곳에 묶이는 현상 방지 |
예시 : 헤드 위치 53, 요청 큐 98, 183, 37, 122, 14, 124, 65, 67
- FCFS : 53 → 98 → 183 → 37 → 122 → 14 → 124 → 65 → 67 = 총 이동 거리 640
- SSTF : 53 → 65 → 67 → 37 → 14 → 98 → 122 → 124 → 183 = 총 이동 거리 236
⚠️ SSTF는 매번 현재 위치에서 가장 가까운 곳을 다시 계산해야 함
회전 지연 시간 최적화 기법 ⭐⭐
| 기법 | 방법 |
|---|---|
| SLTF (Shortest Latency Time First) | 같은 실린더 안의 요청 중 회전 지연 시간이 가장 짧은 섹터부터 처리. 섹터 큐잉이라고도 함 |
| 에센바흐 (Eschenbach) 기법 | 탐색 시간뿐 아니라 회전 지연 시간까지 최적화하기 위해 만든 최초의 기법. 헤드는 C-SCAN처럼 움직이고, 한 실린더에서 한 바퀴 회전하는 동안 그 실린더의 요청을 처리 |
Chapter 09. 파일 관리
파일의 구성 ⭐
- 필드 (Field) → 모여서 레코드 (Record) → 모여서 파일 (File)
파일 구조 (파일 편성 방식) ⭐⭐⭐
| 구조 | 설명 | 특징 |
|---|---|---|
| 순차 파일 (Sequential) | 레코드를 입력 순서 또는 키 순서대로 연속 저장 | 저장 효율 좋음. 순차 처리 빠름. 검색·삽입·삭제 느림 (처음부터 찾아야 함) |
| 색인 순차 파일 (Indexed Sequential) | 레코드를 키 순서대로 저장 + 색인(인덱스) 을 따로 둠 | 순차 접근과 직접 접근 모두 가능. 색인 공간 필요. 기본 영역·색인 영역·오버플로 영역으로 구성 |
| 직접 파일 (Direct / Random) | 키 값을 해싱 함수로 계산해서 물리적 주소를 구하고 직접 접근 | 검색 가장 빠름. 충돌(Collision) 처리 필요, 공간 효율 낮음 |
| 파일 (Heap / Pile) | 레코드를 도착 순서대로 그냥 쌓음 | 구조 없음. 검색 시 전체 탐색 |
디렉터리 구조 ⭐⭐⭐
| 구조 | 설명 |
|---|---|
| 1단계 | 모든 파일이 하나의 디렉터리에 있음. 파일 이름이 겹치면 안 됨 |
| 2단계 | 마스터 파일 디렉터리(MFD) 아래에 사용자마다 사용자 파일 디렉터리(UFD) 를 둠 |
| 트리 구조 | 하나의 루트 디렉터리 아래 서브 디렉터리를 계층적으로 둠. 대부분의 OS가 사용 (UNIX, Windows) |
| 비순환 그래프 | 트리 구조 + 파일·디렉터리 공유 가능 (링크). 사이클은 허용 X |
| 일반 그래프 | 사이클까지 허용. 탐색이 복잡하고 가비지 컬렉션 필요 |
디스크 공간 할당 방법 ⭐⭐⭐
파일에 디스크 블록을 어떻게 배정할까?
| 방법 | 설명 | 장점 | 단점 |
|---|---|---|---|
| 연속 할당 | 파일을 디스크의 연속된 블록에 할당 | 순차·직접 접근 빠름 | 외부 단편화, 파일 크기 늘리기 어려움 |
| 연결 할당 | 블록들을 포인터로 연결 (리스트) | 외부 단편화 없음, 크기 변경 쉬움 | 직접 접근 불가, 포인터 공간 필요, 포인터 손상 시 위험 |
| 인덱스 할당 | 파일마다 인덱스 블록을 두고, 각 블록의 주소를 테이블처럼 저장 | 직접 접근 가능, 외부 단편화 없음 | 인덱스 블록 공간 필요 |
빈 공간 관리 방법 ⭐⭐
디스크의 빈 블록을 어떻게 기록해둘까?
| 방법 | 설명 |
|---|---|
| 비트 벡터 (비트맵) | 블록마다 1비트 사용 (0 = 빈 블록, 1 = 사용 중. 시스템에 따라 반대) |
| 연결 리스트 | 빈 블록들을 포인터로 연결 |
| 그룹핑 | 첫 빈 블록에 다른 빈 블록 n개의 주소를 저장 |
| 카운팅 | 연속된 빈 블록의 시작 주소와 개수만 저장 |
⚠️ “디스크 할당(연속·연결·인덱스)”과 “빈 공간 관리(비트벡터·연결리스트)”는 다른 개념. 연결 리스트가 양쪽에 다 나와서 헷갈리게 냄.
UNIX ⭐⭐⭐
특징
- 대화식 시스템 (Interactive)
- 다중 사용자 (Multi-User), 다중 작업 (Multi-Tasking) 시스템
- 대부분 C 언어로 작성되어 이식성과 확장성이 높음
- 계층적 트리 구조의 파일 시스템
- 장치·프로세스를 파일처럼 다룸
- 네트워킹 기능이 뛰어남
구성
| 구성 요소 | 역할 |
|---|---|
| 커널 (Kernel) | UNIX의 핵심. 부팅 시 메모리에 상주하며 프로세스·메모리·파일·입출력 관리. 하드웨어를 직접 제어 |
| 셸 (Shell) | 사용자 명령어를 해석해 커널에 전달하는 명령어 해석기. 종류 : Bourne Shell, C Shell, Korn Shell, Bash 등 |
| 유틸리티 | 에디터, 컴파일러, 정렬 프로그램 등 |
파일 시스템 구조 (디스크 블록) ⭐⭐
| 블록 | 내용 |
|---|---|
| 부트 블록 | 부팅에 필요한 코드 |
| 슈퍼 블록 | 파일 시스템 전체 정보 (크기, 블록 수, 빈 블록 목록 등) |
| I-노드 블록 | 각 파일의 정보를 담은 I-노드들 |
| 데이터 블록 | 실제 파일 데이터 |
I-노드 (I-node) ⭐⭐⭐
- 파일마다 하나씩 있는, 파일 정보를 담은 자료구조
- 포함 정보 : 파일 소유자(UID), 그룹, 파일 크기, 파일 유형, 접근 권한, 생성·접근·수정 시간, 링크 수, 데이터 블록 주소
- ⚠️ 파일 이름은 I-노드에 없음. 파일 이름은 디렉터리에 저장됨
자주 나오는 명령어 ⭐
| 명령어 | 기능 |
|---|---|
fork |
새로운 프로세스(자식) 생성 |
exec |
새로운 프로그램을 실행 (현재 프로세스를 대체) |
wait / exit |
자식 종료 대기 / 프로세스 종료 |
ls / cat / pwd |
파일 목록 / 파일 내용 출력 / 현재 디렉터리 |
cp / mv / rm |
복사 / 이동·이름 변경 / 삭제 |
chmod / chown |
접근 권한 변경 / 소유자 변경 |
mount |
파일 시스템을 디렉터리에 연결 |