반응형
교착 상태(Deadlock)의 개념과 발생 배경
교착 상태(Deadlock)란 두 개 이상의 프로세스가 서로가 점유한 자원을 기다리며 무한히 대기하는 상태를 의미합니다.
이 상태에서는 어떤 프로세스도 진행될 수 없으며, 외부 개입 없이는 절대 해결되지 않습니다.
예를 들어 다음과 같은 상황을 생각해볼 수 있습니다:
- 프로세스 A는 자원 R1을 점유하고 R2를 요청
- 프로세스 B는 자원 R2를 점유하고 R1을 요청
→ 둘 다 상대 자원이 해제되기를 기다리므로 무한 대기 상태에 빠집니다
교착 상태가 실무에서 위험한 이유
- 시스템 자원 낭비: 프로세스들이 끝나지 않고 자원을 점유
- 성능 저하: CPU, 메모리, I/O 대기열이 가득 차는 현상 유발
- 장애 전이: 한 서비스의 교착 상태가 전체 시스템 오류로 이어질 수 있음
- 디버깅 어려움: 재현이 어렵고, 원인 추적이 복잡
교착 상태 발생의 4가지 필요 조건 (Coffman 조건)
교착 상태는 다음 4가지 조건이 모두 동시에 충족될 때 발생할 수 있습니다.
조건 | 설명 |
상호 배제(Mutual Exclusion) | 자원을 하나의 프로세스만 사용할 수 있음 |
점유와 대기(Hold and Wait) | 자원을 점유한 채 다른 자원을 기다림 |
비선점(No Preemption) | 자원을 강제로 회수할 수 없음 |
순환 대기(Circular Wait) | 프로세스 간 자원 요청이 원형 구조를 이룸 (A→B→C→A) |
→ 이 중 하나라도 차단하면 교착 상태는 발생하지 않습니다.
교착 상태 예시 시나리오
// 프로세스 1
lock(mutexA); // RA 점유
sleep(1); // 타이밍 차이 유발
lock(mutexB); // RB 요청
// 프로세스 2
lock(mutexB); // RB 점유
sleep(1);
lock(mutexA); // RA 요청 → 교착 상태
→ 두 프로세스가 서로의 락을 기다리며 무한정 대기
- 프로세스 1: mutexA를 점유 → mutexB를 요청하며 대기
- 프로세스 2: mutexB를 점유 → mutexA를 요청하며 대기
두 프로세스가 서로 상대방이 가지고 있는 리소스를 기다리는 순환 대기(circular wait) 상태가 되어, 교착 상태 발생
교착 상태 해결 및 회피 전략
1. 예방(Prevention): 조건 자체를 없애기
- 상호 배제 제거: 대부분 불가능 (프린터 등은 독점 필요)
- 점유와 대기 방지: 필요한 모든 자원을 한 번에 할당
- 비선점 허용: 요청 실패 시 기존 자원을 해제
- 순환 대기 차단: 자원 번호 순으로만 요청 허용
2. 회피(Avoidance): 교착 상태가 발생하지 않도록 자원 요청을 판단
- 대표 알고리즘: Banker’s Algorithm
→ 요청 시 시뮬레이션을 통해 안전한 상태인지 판단 후 할당
3. 탐지(Detection) 및 복구(Recovery)
- 탐지: 자원 할당 그래프(Resource Allocation Graph, RAG)를 통해 순환 구조 확인
- 복구:
- 교착된 프로세스 중단
- 자원 선점 후 다시 실행
- 프로세스 롤백 (데이터 손실 가능)
4. 무시(Ignore)
- UNIX/Linux는 대부분 이 방식을 채택 (낮은 빈도, 처리 비용 고려)
- 현실에서는 주기적인 재부팅이나 시간 초과로 대응
실무에서 교착 상태가 발생하는 사례
- 데이터베이스 트랜잭션 락 충돌
- SELECT 후 UPDATE 쿼리에서 순서가 엇갈리면 교착 상태 발생 가능
- 멀티스레드 락 획득 순서 문제
- 스레드 A가 mutex1, mutex2 순으로 락을 획득하고,
스레드 B가 mutex2, mutex1 순으로 획득하려 할 때
- 스레드 A가 mutex1, mutex2 순으로 락을 획득하고,
- 파일 시스템 접근
- 여러 프로세스가 동일한 파일 또는 디렉토리를 접근할 때 충돌
- 네트워크 서버의 스레드 간 자원 공유
교착 상태 회피를 위한 실무 전략 요약
전략 | 설명 | 실무 적용 예시 |
자원 요청 순서 고정 | 락 획득 순서 통일 | DB, 스레드 락 |
타임아웃 | 일정 시간 후 재시도 또는 실패 처리 | REST API 요청 재시도 |
Lock ordering | 락 획득 순서를 문서화하고 코드로 강제 | Java 동기화 블록 설계 |
Deadlock detection 도구 사용 | JVM thread dump, gdb, lsof, ps 등으로 추적 | 운영 시스템 유지보수 시 활용 |
면접 대비 자주 묻는 질문과 답변 예시
Q1. 교착 상태가 발생하는 조건은 무엇인가요?
A. 상호 배제, 점유와 대기, 비선점, 순환 대기의 4가지 조건이 모두 충족될 때 발생합니다.
Q2. 교착 상태를 예방하려면 어떤 전략을 쓸 수 있나요?
A. 자원을 한 번에 할당하거나, 락 순서를 고정하는 방식 등으로 4가지 조건 중 하나 이상을 차단합니다.
Q3. 실무에서 교착 상태를 탐지하려면 어떻게 해야 하나요?
A. 자원 할당 그래프 분석 또는 thread dump 분석, 모니터링 툴 활용 등이 있습니다.
Q4. Banker’s 알고리즘은 어디에 쓰이나요?
A. 교착 상태를 회피하기 위한 알고리즘으로, 자원 요청 시 시스템이 안전 상태를 유지하는지 시뮬레이션합니다.
정리
- 교착 상태는 프로세스들이 서로 자원을 점유하고 무한 대기하는 상태로, 시스템 자원을 정지시키는 심각한 문제입니다.
- 발생 조건은 네 가지이며, 이를 예방, 회피, 탐지 및 복구 전략으로 해결할 수 있습니다.
- 실무에서는 락 순서 통일, 타임아웃 설정, 우선순위 적용 등을 통해 교착 상태를 방지하는 것이 일반적입니다.
- 면접에서는 교착 상태 조건을 명확히 설명하고, 이를 방지하거나 해결했던 경험을 구체적으로 말할 수 있어야 합니다.
반응형
'CS 공부일지 > 운영체제 공부일지' 카테고리의 다른 글
선점형 CPU 스케줄링 완전 정리: 라운드 로빈, SRTF, 다단계 (0) | 2025.05.06 |
---|---|
비선점형 CPU 스케줄링 완전 정리: FCFS, SJF, Priority (0) | 2025.05.05 |
동기화 기법 완전 이해: Mutex, Semaphore, Monitor (0) | 2025.05.04 |
경쟁 상태 방지법: 임계 영역과 동기화 전략 (0) | 2025.05.03 |
IPC란 무엇인가? 프로세스 간 통신 방식 (0) | 2025.05.03 |