데드락 발생 원인과 해결 방식

1. 개념 한줄 요약

데드락은 여러 프로세스나 스레드가 서로가 가진 자원을 기다리며 무한 대기 상태에 빠지는 현상으로, 시스템 작업이 진행되지 않는 교착 상태를 의미한다.

2. 쉽게 풀어쓴 설명

컴퓨터 프로그램은 여러 작업이 동시에 실행되는 환경에서 다양한 자원을 사용한다. 예를 들어 메모리, 파일, 네트워크 장치, 프린터 같은 자원을 여러 프로그램이 공유한다.

문제는 여러 작업이 동시에 같은 자원을 필요로 할 때 발생한다. 특정 프로그램이 자원을 사용하고 있는 상태에서 다른 프로그램이 그 자원을 기다리게 되면 정상적인 대기 상황이 된다.

하지만 서로 다른 프로그램이 상대방이 가진 자원을 기다리는 상황이 발생하면 문제가 생긴다. 이때 어느 쪽도 작업을 진행할 수 없는 상태가 되는데, 이를 데드락(Deadlock)이라고 한다.

쉽게 말하면 두 사람이 서로 열쇠를 하나씩 가지고 있으면서 상대방 열쇠가 있어야 문을 열 수 있는 상황과 비슷하다. 서로 기다리기만 하고 아무도 움직일 수 없는 상태가 되는 것이다.

3. 구조·원리 설명

✔ 데드락 발생 조건

운영체제 이론에서는 데드락이 발생하기 위해 네 가지 조건이 동시에 충족되어야 한다.

① 상호 배제 (Mutual Exclusion)
하나의 자원은 동시에 하나의 프로세스만 사용할 수 있다.

② 점유와 대기 (Hold and Wait)
프로세스가 자원을 가진 상태에서 다른 자원을 기다린다.

③ 비선점 (No Preemption)
사용 중인 자원을 강제로 빼앗을 수 없다.

④ 순환 대기 (Circular Wait)
여러 프로세스가 서로의 자원을 기다리는 구조가 형성된다.

이 네 가지 조건이 동시에 성립하면 데드락이 발생할 수 있다.

✔ 데드락 발생 과정

데드락 상황은 다음과 같은 흐름으로 발생한다.

① 프로세스 A → 자원 1 점유
② 프로세스 B → 자원 2 점유
③ 프로세스 A → 자원 2 요청
④ 프로세스 B → 자원 1 요청

결과적으로 두 프로세스 모두 무한 대기 상태에 빠진다.

✔ 자원 할당 그래프

운영체제에서는 데드락을 분석하기 위해 자원 할당 그래프(Resource Allocation Graph)를 사용한다.

그래프 구조는 다음과 같다.

✔ 원형 노드 → 프로세스
✔ 사각형 노드 → 자원
✔ 화살표 → 요청 또는 할당 관계

그래프에서 순환 구조가 발생하면 데드락 가능성이 존재한다.

4. 데드락 해결 방식

✔ 예방(Prevention) 방식

데드락 발생 조건 중 하나를 제거하는 방법이다.

예시

✔ 모든 자원을 한 번에 요청
✔ 자원 요청 순서 강제

단점은 시스템 효율이 떨어질 수 있다는 점이다.

✔ 회피(Avoidance) 방식

자원 할당 시 데드락 가능성을 미리 계산해 안전 상태에서만 자원을 할당한다.

대표적인 알고리즘이 바로 은행가 알고리즘(Banker’s Algorithm)이다.

✔ 탐지 및 복구(Detection & Recovery)

데드락이 발생한 뒤 이를 탐지하고 해결하는 방법이다.

예시

✔ 프로세스 종료
✔ 자원 강제 회수
✔ 작업 재시작

✔ 무시(Ignore) 방식

일부 운영체제에서는 데드락 발생 가능성이 낮다고 판단해 특별한 처리 없이 그대로 두기도 한다.

5. 예시로 이해하는 실제 상황

✔ 데이터베이스 시스템

두 트랜잭션이 서로 다른 데이터 레코드를 잠근 상태에서 서로의 자원을 기다리면 데드락이 발생할 수 있다.

✔ 파일 접근 충돌

두 프로그램이 서로 다른 파일을 열어 잠금 상태에서 다른 파일을 요청하면 교착 상태가 발생할 수 있다.

✔ 멀티스레드 프로그램

두 스레드가 서로 다른 뮤텍스를 점유한 상태에서 상대 뮤텍스를 기다리면 데드락이 발생한다.

6. 요약 정리

✔ 데드락은 작업이 서로 기다리며 멈추는 상태다.
✔ 자원 경쟁 환경에서 발생한다.
✔ 네 가지 조건이 동시에 만족될 때 발생한다.
✔ 예방·회피·탐지 방식으로 해결할 수 있다.
✔ 멀티스레드 프로그램에서 자주 발생한다.
✔ 시스템 설계 시 반드시 고려해야 하는 문제다.

데드락 발생 원인과 해결 방식을 이해하면, 멀티프로세스나 멀티스레드 환경에서 왜 작업이 멈추는지 분석할 수 있다. 이는 운영체제 설계와 시스템 프로그래밍에서 매우 중요한 핵심 개념이다.

error: Content is protected !!