Ch3. 정보처리기사 — 운영체제 완전 정복
운영체제(OS)란?
**운영체제(Operating System, OS)**는 컴퓨터 하드웨어와 사용자(응용 프로그램) 사이에서 중재자 역할을 하는 시스템 소프트웨어입니다. 하드웨어 자원을 효율적으로 관리하고, 사용자가 컴퓨터를 편리하게 사용할 수 있는 환경을 제공합니다.
대표적인 운영체제: Windows, macOS, Linux, Android, iOS
운영체제의 주요 기능
| 기능 | 설명 |
|---|---|
| 프로세스 관리 | 프로세스 생성·삭제·스케줄링, CPU 할당 |
| 메모리 관리 | 주기억장치 할당·회수, 가상 메모리 관리 |
| 파일 시스템 관리 | 파일 생성·삭제·접근 권한, 디렉터리 구조 |
| 입출력(I/O) 관리 | 장치 드라이버, 인터럽트 처리 |
| 보안 및 보호 | 사용자 인증, 자원 접근 제어 |
| 네트워킹 | 네트워크 프로토콜 지원, 통신 서비스 제공 |
운영체제의 유형
- 일괄 처리 시스템(Batch Processing): 작업을 모아서 한꺼번에 처리. 사용자와의 상호작용 없음
- 시분할 시스템(Time-Sharing): CPU 시간을 여러 사용자에게 분할하여 동시 사용 지원
- 실시간 시스템(Real-Time): 정해진 시간 내에 처리 보장 (항공·의료 시스템 등)
- 분산 시스템(Distributed): 여러 컴퓨터가 네트워크로 연결, 자원 공유
- 다중 처리기 시스템(Multiprocessor): 여러 CPU가 메모리를 공유하며 병렬 처리
프로세스 (Process)
프로세스 vs 프로그램
| 구분 | 프로그램(Program) | 프로세스(Process) |
|---|---|---|
| 정의 | 디스크에 저장된 실행 가능한 파일 (정적) | 실행 중인 프로그램 (동적) |
| 상태 | 수동적(Passive) | 능동적(Active) |
| 자원 | 없음 | CPU, 메모리, 파일 등 자원 보유 |
프로세스의 메모리 구조:
┌──────────────┐ 높은 주소
│ 스택(Stack) │ ← 함수 호출, 지역 변수 (LIFO, 높은→낮은 주소로 증가)
├──────────────┤
│ ↓ │
│ ↑ │
│ 힙(Heap) │ ← 동적 메모리 할당 (malloc, new)
├──────────────┤
│ 데이터(Data)│ ← 전역 변수, 정적 변수
├──────────────┤
│ 코드(Code) │ ← 프로그램 명령어 (텍스트 영역)
└──────────────┘ 낮은 주소
PCB (Process Control Block)
PCB는 운영체제가 각 프로세스를 관리하기 위해 유지하는 자료구조입니다.
PCB에 저장되는 정보:
- 프로세스 ID(PID): 고유 식별자
- 프로세스 상태: 현재 상태 (Ready, Running, Waiting 등)
- 프로그램 카운터(PC): 다음에 실행할 명령어 주소
- CPU 레지스터: 문맥 교환 시 저장되는 레지스터 값
- 메모리 관리 정보: 페이지 테이블, 세그먼트 테이블
- 입출력 상태 정보: 열린 파일 목록
- 우선순위: 스케줄링에 사용
프로세스 상태 전이 (Process State Transition)
프로세스는 생명주기 동안 다음 5가지 상태를 전이합니다.
생성(admitted) 디스패치(dispatch)
New ─────────────────→ Ready ─────────────────→ Running
↑ │
│ 타임아웃(timeout) │
│ 선점(preemption) ←───────┘
│
│ 입출력 완료(I/O complete)
Waiting ←── Running (I/O 요청)
│
↓ 종료(exit)
Terminated
| 상태 | 설명 |
|---|---|
| New | 프로세스 생성 중 |
| Ready | CPU 할당 대기 (준비 큐에서 대기) |
| Running | CPU를 점유하여 명령어 실행 중 |
| Waiting (Blocked) | I/O 또는 이벤트 완료 대기 |
| Terminated | 실행 완료 또는 강제 종료 |
주요 전이:
- 디스패치(Dispatch): Ready → Running (스케줄러가 CPU 할당)
- 타임아웃(Timeout): Running → Ready (타임 퀀텀 소진)
- 블록(Block): Running → Waiting (I/O 요청)
- 웨이크업(Wake-up): Waiting → Ready (I/O 완료)
프로세스 vs 스레드
**스레드(Thread)**는 프로세스 내의 실행 단위입니다. 프로세스보다 가벼우며, 같은 프로세스 내 스레드들은 메모리(코드·데이터·힙)를 공유합니다.
| 구분 | 프로세스 | 스레드 |
|---|---|---|
| 자원 공유 | 독립적인 메모리 공간 | 코드·데이터·힙 공유, 스택만 독립 |
| 통신 | IPC 필요 (파이프, 소켓 등) | 공유 메모리로 직접 통신 |
| 생성 비용 | 높음 | 낮음 (가벼움) |
| 문맥 교환 | 느림 | 빠름 |
| 안정성 | 독립적 (한 프로세스 장애가 타 프로세스에 영향 없음) | 한 스레드 장애 시 전체 프로세스 영향 가능 |
멀티스레딩 장점: CPU 활용률 향상, 응답성 개선, 자원 공유 용이 멀티스레딩 단점: 동기화 문제(경쟁 조건, 교착상태), 디버깅 어려움
CPU 스케줄링
CPU 스케줄링은 준비 큐에 있는 프로세스들 중 어느 것을 CPU에 할당할지 결정하는 과정입니다.
스케줄링 성능 척도
| 척도 | 설명 | 방향 |
|---|---|---|
| CPU 이용률 | CPU가 실제로 작업을 수행하는 비율 | ↑ 높을수록 좋음 |
| 처리량(Throughput) | 단위 시간당 완료된 프로세스 수 | ↑ 높을수록 좋음 |
| 응답 시간(Response Time) | 요청 후 첫 번째 응답까지의 시간 | ↓ 낮을수록 좋음 |
| 대기 시간(Waiting Time) | 준비 큐에서 대기한 총 시간 | ↓ 낮을수록 좋음 |
| 반환 시간(Turnaround Time) | 프로세스 제출부터 완료까지의 시간 | ↓ 낮을수록 좋음 |
스케줄링 알고리즘
1. FCFS (First Come First Served) — 비선점
도착한 순서대로 CPU를 할당합니다.
- 장점: 구현이 단순, 공평함
- 단점: 호위 효과(Convoy Effect) — 긴 프로세스 뒤에 짧은 프로세스들이 오래 대기
프로세스: P1(24ms) → P2(3ms) → P3(3ms) 순서로 도착
대기 시간: P1=0, P2=24, P3=27 → 평균 대기 시간 = 17ms
2. SJF (Shortest Job First) — 비선점
실행 시간이 가장 짧은 프로세스를 먼저 실행합니다.
- 장점: 평균 대기 시간이 최소 (최적 알고리즘)
- 단점: 기아(Starvation) 현상 — 긴 프로세스가 무한 대기 가능. 실행 시간 예측 어려움
3. SRTF (Shortest Remaining Time First) — 선점형 SJF
현재 실행 중인 프로세스보다 남은 실행 시간이 짧은 프로세스가 도착하면 선점합니다.
- 장점: 평균 대기 시간 최소화
- 단점: 잦은 문맥 교환 오버헤드, 기아 현상
4. 우선순위 스케줄링 (Priority Scheduling)
각 프로세스에 우선순위를 부여하여 높은 우선순위 프로세스 먼저 실행합니다.
- 선점형·비선점형 모두 가능
- 단점: 기아 현상 → **에이징(Aging)**으로 해결 (오래 대기할수록 우선순위 증가)
5. 라운드 로빈 (Round Robin, RR) — 선점
각 프로세스에 타임 퀀텀(Time Quantum) 만큼 CPU를 할당, 소진 시 다음 프로세스로 교체합니다.
- 장점: 공평함, 응답 시간 예측 가능
- 단점: 타임 퀀텀 설정이 중요 (너무 크면 FCFS와 유사, 너무 작으면 문맥 교환 오버헤드 증가)
- 시분할 시스템에 적합
6. 다단계 큐 (MLQ, Multilevel Queue)
프로세스를 여러 큐로 분류하고, 각 큐마다 다른 스케줄링 알고리즘을 적용합니다.
큐1 (시스템 프로세스) — 최고 우선순위, RR
큐2 (대화형 프로세스) — RR
큐3 (일괄 처리 프로세스) — FCFS — 최저 우선순위
다단계 피드백 큐(MLFQ): 프로세스가 큐 사이를 이동 가능. CPU 사용량이 많으면 낮은 우선순위 큐로 이동.
메모리 관리
메모리 배치 기법
| 기법 | 설명 | 문제점 |
|---|---|---|
| 단순 연속 배치 | 메모리를 하나의 큰 블록으로 관리 | 다중 프로그래밍 불가 |
| 고정 분할 | 메모리를 고정 크기로 분할 | 내부 단편화(Internal Fragmentation) |
| 가변 분할 | 프로세스 크기에 맞게 동적 분할 | 외부 단편화(External Fragmentation) |
단편화 해결: 압축(Compaction, 가변 분할), 페이징/세그멘테이션
메모리 배치 전략:
- 최초 적합(First Fit): 첫 번째로 충분한 공간 사용 — 빠름
- 최적 적합(Best Fit): 가장 작은 여유 공간 사용 — 외부 단편화 최소
- 최악 적합(Worst Fit): 가장 큰 여유 공간 사용 — 큰 여유 공간 남김
페이징 (Paging)
프로세스의 논리 주소 공간을 페이지(Page) 단위로, 물리 메모리를 프레임(Frame) 단위로 분할하여 관리합니다.
- 논리 주소 = 페이지 번호(p) + 변위(d)
- 물리 주소 = 프레임 번호(f) + 변위(d)
- 페이지 테이블: 페이지 번호 → 프레임 번호 매핑
- 장점: 외부 단편화 없음
- 단점: 내부 단편화 발생 (마지막 페이지), 페이지 테이블 유지 오버헤드
세그멘테이션 (Segmentation)
프로그램을 논리적 단위(세그먼트) — 코드, 데이터, 스택 — 로 분할합니다.
- 논리 주소 = 세그먼트 번호(s) + 변위(d)
- 세그먼트 테이블: 세그먼트 번호 → 물리 주소와 크기(limit) 매핑
- 장점: 내부 단편화 없음, 논리적 보호 용이
- 단점: 외부 단편화 발생
가상 메모리 (Virtual Memory)
가상 메모리는 실제 물리 메모리보다 큰 프로그램을 실행할 수 있도록, 보조기억장치(디스크)를 주기억장치처럼 활용하는 기법입니다.
요구 페이징(Demand Paging): 페이지가 실제로 필요할 때만 물리 메모리에 로드합니다.
- 페이지 폴트(Page Fault): 요청한 페이지가 물리 메모리에 없을 때 발생 → 디스크에서 로드
- 스래싱(Thrashing): 페이지 폴트가 너무 자주 발생하여 실제 작업보다 페이지 교체에 더 많은 시간을 소비하는 현상
페이지 교체 알고리즘
물리 메모리가 가득 찼을 때 어떤 페이지를 교체할지 결정합니다.
FIFO (First In First Out)
가장 먼저 메모리에 올라온 페이지를 교체합니다.
- 장점: 구현 단순
- 단점: 벨레이디 이상(Belady’s Anomaly) — 프레임 수를 늘려도 페이지 폴트가 오히려 증가하는 현상
LRU (Least Recently Used) — 가장 많이 사용
가장 오랫동안 사용되지 않은 페이지를 교체합니다.
- 장점: 최적 알고리즘에 근접, 실제로 가장 많이 사용
- 단점: 구현 비용 높음 (참조 시간 기록 필요)
LFU (Least Frequently Used)
참조 횟수가 가장 적은 페이지를 교체합니다.
- 장점: 자주 사용되는 페이지를 보호
- 단점: 초반에 많이 사용된 페이지가 나중에 쓸모없어도 남아있음
OPT (Optimal) — 이론상 최적
앞으로 가장 오랫동안 사용되지 않을 페이지를 교체합니다.
- 장점: 페이지 폴트 최소 (이론적 최적)
- 단점: 미래 예측 불가 → 실제 구현 불가, 비교 기준으로만 사용
| 알고리즘 | 특징 | Belady’s Anomaly |
|---|---|---|
| FIFO | 단순, 가장 오래된 것 교체 | 발생 가능 |
| LRU | 최근 사용 기준, 실용적 | 없음 |
| LFU | 사용 빈도 기준 | 없음 |
| OPT | 미래 기반, 이론적 최적 | 없음 |
교착상태 (Deadlock)
**교착상태(Deadlock)**는 두 개 이상의 프로세스가 서로 상대방이 점유한 자원을 기다리며 무한 대기하는 상태입니다.
교착상태 발생의 4가지 필요 조건
교착상태가 발생하려면 다음 4가지 조건이 모두 동시에 충족되어야 합니다.
| 조건 | 설명 |
|---|---|
| 상호 배제(Mutual Exclusion) | 자원은 한 번에 하나의 프로세스만 사용 가능 |
| 점유와 대기(Hold and Wait) | 자원을 점유한 채로 다른 자원을 기다림 |
| 비선점(No Preemption) | 프로세스가 점유한 자원을 강제로 빼앗을 수 없음 |
| 순환 대기(Circular Wait) | 프로세스들이 순환 형태로 서로의 자원을 기다림 |
암기법: 상점비순 (상호배제·점유대기·비선점·순환대기)
교착상태 해결 방법
1. 예방 (Prevention)
4가지 조건 중 하나를 제거하여 교착상태 자체를 방지합니다.
- 상호 배제 제거: 모든 자원을 공유 가능하게 → 현실적으로 어려움
- 점유와 대기 제거: 필요한 모든 자원을 한꺼번에 요청 → 자원 낭비
- 비선점 제거: 자원을 강제로 회수 가능하게 → 일부 자원에만 적용 가능
- 순환 대기 제거: 자원에 번호를 부여하고 오름차순으로만 요청 → 구현 가능
2. 회피 (Avoidance)
자원 할당 시 교착상태가 발생하지 않는지 미리 검사합니다.
- 은행원 알고리즘(Banker’s Algorithm): 안전 상태(Safe State)를 유지하는 할당만 허용
- 안전 순서(Safe Sequence): 모든 프로세스가 완료될 수 있는 실행 순서가 존재
3. 탐지 (Detection)
교착상태가 발생했는지 주기적으로 검사합니다.
- 자원 할당 그래프(Resource Allocation Graph): 사이클 존재 여부로 교착상태 탐지
- Wait-for 그래프: 프로세스 간 대기 관계 그래프
4. 회복 (Recovery)
교착상태 탐지 후 정상 상태로 복구합니다.
- 프로세스 종료: 교착상태 프로세스를 하나씩 또는 모두 종료
- 자원 선점: 일부 프로세스의 자원을 강제로 회수하여 다른 프로세스에 할당
핵심 개념 카드
프로세스 상태 전이 ★★★★★ : New → Ready → Running → Waiting/Terminated. 디스패치(Ready→Running), 타임아웃(Running→Ready), 블록(Running→Waiting). 암기 포인트: 준비 큐에서 대기→CPU 받으면 실행→I/O 요청하면 대기
CPU 스케줄링 알고리즘 ★★★★★ : FCFS(도착순·호위효과), SJF(최단작업·기아), RR(타임퀀텀·공평), MLQ(다단계큐). 암기 포인트: 비선점=FCFS/SJF/우선순위, 선점=SRTF/RR
페이지 교체 알고리즘 ★★★★★ : FIFO(오래된 것·벨레이디이상), LRU(최근미사용·실용적), LFU(빈도최소), OPT(이론적최적). 암기 포인트: 실무에서 LRU를 가장 많이 사용
교착상태 4조건 ★★★★★ : 상호배제·점유대기·비선점·순환대기 — 4가지 모두 충족 시 교착상태. 암기 포인트: 상점비순. 예방=조건제거, 회피=은행원알고리즘
페이징 vs 세그멘테이션 ★★★☆☆ : 페이징=고정크기(내부단편화), 세그멘테이션=논리단위(외부단편화). 암기 포인트: 페이징은 크기 고정→내부단편화, 세그멘테이션은 논리 분할→외부단편화
실전 퀴즈
Q1. 다음 중 CPU 스케줄링 알고리즘 중 선점 방식이 아닌 것은? ① Round Robin ② SRTF ③ SJF ④ 다단계 피드백 큐
정답: ③ SJF(Shortest Job First)는 비선점 방식입니다. 선점형 SJF는 SRTF(Shortest Remaining Time First)라고 합니다. RR과 MLFQ는 대표적인 선점 방식 알고리즘입니다.
Q2. 교착상태 발생의 4가지 필요 조건을 모두 쓰시오.
정답: ① 상호 배제(Mutual Exclusion) ② 점유와 대기(Hold and Wait) ③ 비선점(No Preemption) ④ 순환 대기(Circular Wait). 교착상태는 이 4가지 조건이 동시에 충족될 때만 발생하므로, 하나라도 제거하면 교착상태를 예방할 수 있습니다.
Q3. 페이지 교체 알고리즘 중 프레임 수를 늘렸음에도 페이지 폴트 수가 오히려 증가하는 이상 현상을 무엇이라 하는가?
정답: 벨레이디 이상(Belady’s Anomaly). FIFO 알고리즘에서 발생하는 현상으로, LRU·OPT 알고리즘에서는 발생하지 않습니다. 스택 알고리즘(Stack Algorithm) 속성을 가진 알고리즘은 이 이상 현상이 발생하지 않습니다.
Q4. 다음 중 프로세스와 스레드에 대한 설명으로 옳지 않은 것은? ① 같은 프로세스의 스레드들은 코드·데이터·힙 영역을 공유한다. ② 프로세스 간 통신보다 스레드 간 통신이 더 효율적이다. ③ 한 스레드의 오류가 다른 스레드에 영향을 줄 수 없다. ④ 스레드는 프로세스보다 생성 비용이 낮다.
정답: ③ 같은 프로세스 내 스레드들은 메모리를 공유하기 때문에, 한 스레드에서 오류(예: 잘못된 메모리 접근)가 발생하면 전체 프로세스가 영향을 받을 수 있습니다. 이는 프로세스 간 격리와의 차이점입니다.
Q5. 가상 메모리에서 프로세스가 실제로 사용하는 메모리 페이지보다 물리 프레임이 부족하여, 페이지 교체에 대부분의 시간을 소비하는 현상은?
정답: 스래싱(Thrashing). 프로세스에 할당된 프레임 수가 너무 적을 때 발생합니다. 해결책으로는 워킹 셋(Working Set) 모델 — 프로세스가 일정 시간 동안 참조하는 페이지 집합 — 을 활용하여 충분한 프레임을 보장하거나, 다중 프로그래밍 정도(MPD)를 줄이는 방법이 있습니다.
OIYO 편집부
Content Editor지식 인큐베이터이자 전문 콘텐츠 크리에이터. 경영, 경제, 법률 및 실생활에 유용한 실무/자격증 중심의 깊이 있는 정보를 연구하고 공유합니다.