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 편집부
편집부OIYO 편집부는 경제·법률·생활·자기이해 주제를 1차 자료와 공개 통계로 검증해 정리합니다. 모든 글은 출처 표기와 정기 점검을 거쳐 실용성과 정확성을 함께 유지합니다.