정보처리기사 실기에서 운영체제는 매회 빠짐없이 나오는 영역입니다. 특히 CPU 스케줄링 계산 문제와 교착상태 조건은 반드시 숙지해야 해요. 처음에는 용어가 낯설게 느껴지지만, 핵심 개념 몇 가지를 제대로 잡으면 생각보다 어렵지 않습니다.
1. 프로세스와 스레드
프로세스(Process)란?
프로세스는 실행 중인 프로그램을 의미합니다. 프로그램은 디스크에 저장된 코드일 뿐이지만, 메모리에 올라와서 CPU에 의해 실행되면 프로세스가 됩니다. 프로세스는 자신만의 메모리 공간(코드, 데이터, 힙, 스택)을 가집니다.
프로세스 상태 전이
| 상태 | 설명 | 전이 조건 |
|---|---|---|
| 생성(New) | 프로세스가 생성되어 준비 큐 진입을 기다리는 상태 | 생성 → 준비: 승인(Admitted) |
| 준비(Ready) | CPU를 할당받기 위해 대기 중인 상태 | 준비 → 실행: 디스패치(Dispatch) |
| 실행(Running) | CPU를 할당받아 명령어를 실행 중인 상태 | 실행 → 준비: 타임아웃(Time-out) |
| 대기(Waiting) | I/O 작업 등을 기다리며 CPU를 반납한 상태 | 실행 → 대기: I/O 요청 / 대기 → 준비: I/O 완료 |
| 종료(Terminated) | 실행 완료 또는 강제 종료된 상태 | 실행 → 종료: Exit |
✔ "CPU를 할당받기 위해 기다리는 상태" → 준비(Ready) 상태
✔ "I/O 완료 후 어느 상태로 가는가?" → 준비(Ready) 상태 (실행으로 바로 가지 않음)
✔ 디스패치: 준비 → 실행 전이, 타임아웃/선점: 실행 → 준비 전이
프로세스 vs 스레드
| 구분 | 프로세스 | 스레드 |
|---|---|---|
| 정의 | 독립적 실행 단위. 자체 메모리 공간 보유 | 프로세스 내 실행 단위. 메모리 공유 |
| 메모리 | 각 프로세스는 독립적인 주소 공간 사용 | 코드, 데이터, 힙 영역을 같은 프로세스 내 스레드끼리 공유 |
| 통신 | IPC(파이프, 소켓 등) 사용, 비교적 복잡 | 공유 메모리로 통신, 간단하지만 동기화 문제 발생 가능 |
| 전환 비용 | 컨텍스트 스위칭 비용 큼 | 컨텍스트 스위칭 비용 작음 |
| 영향 | 한 프로세스 오류가 다른 프로세스에 영향 없음 | 한 스레드 오류가 같은 프로세스 내 전체 스레드에 영향 |
2. CPU 스케줄링 알고리즘
CPU 스케줄링은 여러 프로세스 중 어떤 것에 CPU를 줄지 결정하는 정책입니다. 실기 시험에서는 각 알고리즘의 특징뿐 아니라 평균 대기 시간을 직접 계산하는 문제도 나옵니다.
스케줄링 알고리즘 비교
| 알고리즘 | 방식 | 특징 | 선점 여부 |
|---|---|---|---|
| FCFS | 먼저 도착한 순서대로 처리 | 구현 간단. 뒤에 짧은 작업이 와도 앞 작업 끝날 때까지 대기 (호위 효과) | 비선점 |
| SJF | 실행 시간이 짧은 작업 우선 | 평균 대기 시간 최소화. 실행 시간 예측 어려움. 기아(Starvation) 발생 가능 | 비선점 |
| SRTF | 남은 시간이 가장 짧은 작업 선점 | SJF의 선점 버전. 평균 대기 시간 최소. 잦은 선점으로 오버헤드 증가 | 선점 |
| 우선순위 | 우선순위 높은 작업 우선 | 기아 발생 가능 → 에이징(Aging)으로 해결 | 선점/비선점 |
| Round Robin | 시간 할당량(퀀텀)만큼 돌아가며 처리 | 타임 셰어링 시스템에 적합. 퀀텀 크면 FCFS에 가까워짐 | 선점 |
| 다단계 큐 | 여러 준비 큐를 우선순위별로 운영 | 큐 간 이동 불가. 각 큐마다 다른 알고리즘 적용 가능 | 선점 |
| 다단계 피드백 큐 | 다단계 큐에서 큐 간 이동 허용 | 에이징 가능. 가장 현실적인 스케줄링 방식 | 선점 |
FCFS 계산 예시
프로세스 P1(실행 시간 10ms), P2(3ms), P3(5ms)가 순서대로 도착했을 때 FCFS 평균 대기 시간을 구해봅시다.
✔ 간트 차트(Gantt Chart)를 직접 그려서 각 프로세스의 대기 시간 계산
✔ 대기 시간 = 완료 시간 - 도착 시간 - 실행 시간
✔ 반환 시간(Turnaround Time) = 완료 시간 - 도착 시간
✔ Round Robin은 타임 퀀텀 값에 따라 결과가 달라지니 퀀텀을 반드시 확인
3. 교착상태(Deadlock)
교착상태는 두 개 이상의 프로세스가 서로 상대방이 점유한 자원을 기다리며 무한정 대기하는 상태입니다. 실기에서 교착상태 4가지 조건은 반드시 암기해야 합니다.
교착상태 발생 조건 (코프만 조건)
| 조건 | 설명 |
|---|---|
| 상호 배제(Mutual Exclusion) | 한 번에 한 프로세스만 자원 사용 가능. 다른 프로세스는 대기해야 함 |
| 점유와 대기(Hold and Wait) | 자원을 점유한 프로세스가 추가 자원을 요청하며 대기 |
| 비선점(No Preemption) | 다른 프로세스가 점유한 자원을 강제로 빼앗을 수 없음 |
| 순환 대기(Circular Wait) | 프로세스들이 원형으로 서로의 자원을 기다리는 상태 형성 |
교착상태 해결 방법
| 방법 | 설명 | 특징 |
|---|---|---|
| 예방(Prevention) | 4가지 조건 중 하나를 원천적으로 제거 | 자원 낭비 심함. 실용성 낮음 |
| 회피(Avoidance) | 안전 상태(Safe State)를 유지하며 자원 할당. 은행가 알고리즘 | 자원 요청마다 안전 여부 계산 필요 |
| 탐지(Detection) | 교착상태 발생을 허용하고, 탐지 알고리즘으로 주기적 검사 | 자원 그래프 사이클 확인 |
| 회복(Recovery) | 교착상태 탐지 후 프로세스 종료 또는 자원 선점으로 해결 | 탐지와 함께 사용 |
✔ 4가지 조건 이름 정확히 암기: 상호배제, 점유와 대기, 비선점, 순환 대기
✔ 은행가 알고리즘 → 교착상태 회피에 사용
✔ "교착상태가 발생해도 허용" → 탐지(Detection) 방식
✔ 4조건 중 하나만 제거해도 교착상태는 발생하지 않음
4. 메모리 관리
메모리 할당 방식
| 방식 | 설명 | 문제점 |
|---|---|---|
| 연속 메모리 할당 | 프로세스를 연속된 메모리 공간에 배치. 단일 분할, 다중 고정 분할, 다중 가변 분할 | 단편화(Fragmentation) 발생 |
| 페이징(Paging) | 물리 메모리를 고정 크기 프레임으로, 논리 메모리를 같은 크기 페이지로 나눔 | 내부 단편화 발생. 외부 단편화 없음 |
| 세그멘테이션(Segmentation) | 논리 주소 공간을 코드, 데이터, 스택 등 의미 있는 단위(세그먼트)로 나눔 | 외부 단편화 발생. 내부 단편화 없음 |
단편화 비교
| 구분 | 내부 단편화 | 외부 단편화 |
|---|---|---|
| 발생 원인 | 할당된 메모리 내부에 사용하지 않는 공간 발생 | 할당된 메모리 외부에 자투리 공간이 흩어져 발생 |
| 발생 조건 | 고정 크기로 나눌 때 | 가변 크기로 나눌 때 |
| 해결책 | 세그멘테이션 사용 | 압축(Compaction), 페이징 사용 |
가상 메모리
물리 메모리보다 큰 프로그램을 실행할 수 있게 해주는 기법입니다. 필요한 페이지만 물리 메모리에 올리고 나머지는 디스크의 스왑 영역에 저장합니다. 가상 메모리의 핵심은 요구 페이징(Demand Paging)입니다.
프로세스가 참조하려는 페이지가 물리 메모리에 없는 상황. 발생하면 운영체제가 디스크에서 해당 페이지를 메모리로 가져옵니다. 페이지 폴트가 너무 자주 발생하면 스래싱(Thrashing)이 발생해 성능이 급격히 저하됩니다.
5. 페이지 교체 알고리즘
물리 메모리가 꽉 찼을 때 어떤 페이지를 내보낼지 결정하는 알고리즘입니다. 시험에서 직접 계산 문제로 나오는 경우가 있어서 각 알고리즘의 동작 방식을 확실히 이해해야 합니다.
| 알고리즘 | 교체 기준 | 특징 |
|---|---|---|
| OPT (최적) | 앞으로 가장 오랫동안 사용되지 않을 페이지 | 페이지 폴트 최소. 미래 참조 알 수 없어 실제 구현 불가. 비교 기준으로 사용 |
| FIFO | 가장 오래전에 들어온 페이지 | 구현 간단. Belady's Anomaly 발생 가능 (프레임 늘려도 폴트 증가) |
| LRU | 가장 오랫동안 사용하지 않은 페이지 | 참조 지역성 원리 활용. 구현 복잡하나 실용적. Belady's Anomaly 없음 |
| LFU | 참조 횟수가 가장 적은 페이지 | 초기에 많이 사용되고 이후 안 쓰이는 페이지가 남아있을 수 있음 |
| NUR (Clock) | 최근에 사용하지 않은 페이지 (참조 비트 활용) | LRU 근사 알고리즘. 구현 간단하고 실용적 |
✔ 프레임 수와 참조 문자열이 주어지면 → 각 알고리즘별로 페이지 폴트 횟수 계산
✔ 계산 방법: 프레임에 페이지가 없으면 폴트 발생, 있으면 히트
✔ FIFO는 큐(선입선출)처럼 처리, LRU는 가장 최근 사용 시점 기록
✔ "Belady's Anomaly가 발생하는 알고리즘은?" → FIFO
6. 프로세스 간 통신(IPC)
서로 다른 프로세스 사이에 데이터를 주고받는 방법입니다. 시험에서 각 방식의 특징을 구분하는 문제가 나옵니다.
| 방식 | 설명 | 특징 |
|---|---|---|
| 파이프(Pipe) | 단방향 통신. 부모-자식 프로세스 간 사용 | 단순하나 양방향 통신엔 2개 파이프 필요 |
| 명명 파이프(Named Pipe) | 이름을 가진 파이프. 관계없는 프로세스 간 통신 가능 | 파이프보다 유연 |
| 공유 메모리 | 여러 프로세스가 동일 메모리 영역을 공유 | 빠른 통신. 동기화 문제 주의 필요 |
| 메시지 큐 | 커널이 관리하는 메시지 박스에 데이터 전송 | 비동기 통신 가능 |
| 소켓(Socket) | 네트워크를 통한 프로세스 간 통신 | 다른 컴퓨터의 프로세스와도 통신 가능 |
| 세마포어(Semaphore) | 공유 자원 접근을 제어하는 정수 변수 | 동기화 및 상호 배제에 사용 |
세마포어는 카운팅 방식으로 여러 개의 자원 관리가 가능하고, 다른 프로세스가 signal(해제)할 수 있습니다. 뮤텍스(Mutex)는 잠금/해제가 반드시 같은 스레드/프로세스에서 이루어져야 하며 소유권 개념이 있습니다. 단순 상호 배제에는 뮤텍스, 자원 개수 카운팅이 필요하면 세마포어를 사용합니다.
마무리
운영체제는 범위가 넓어 보이지만 시험에서는 프로세스 상태 전이, CPU 스케줄링 계산, 교착상태 4조건, 페이지 교체 알고리즘에서 대부분의 점수가 나옵니다. 특히 계산 문제는 간트 차트를 직접 그려가며 여러 번 연습하는 게 가장 효과적입니다. 이해 없이 외우려 하면 변형 문제에서 막히니 원리를 파악하는 방식으로 공부하세요.