6편. 데드락(Deadlock)이란? – 프로그램이 멈추는 진짜 이유와 해결 전략
📚 목차
1. 데드락(Deadlock)이란? - 프로그램이 정지하는 구조적 원인
2. 데드락이 발생 조건 - 왜 빠져나올 수 없을까?
3. 데드락 해결 전략- 시스템 멈추지 않게 하려면
✔ 마무리 - 데드락, 개발자가 반드시 고려해야 할 시스템 리스크
프로그램이 아무런 오류 메시지도 없이 멈춘 적이 있나요? 마우스를 클릭해도, 키보드를 눌러도 아무 반응이 없다면 이건 단순한 버그가 아닐 수 있습니다.
바로 '데드락(Deadlock)'이라는 시스템 내부의 구조적 문제가 원인일 수 있습니다.
데드락은 단순한 ‘잠깐 멈춤’이 아닙니다.
여러 프로세스가 서로가 가진 자원을 기다리느라 영원히 아무 일도 하지 못하는 상태로, 운영체제나 프로그램의 신뢰성을 무너뜨릴 수 있는 심각한 병목 현상입니다.
이 글에서는 운영체제의 기본 개념 중 하나인 데드락(Deadlock)을 개념부터 실무까지 적용할 수 있도록 정리해 보겠습니다.
1. 데드락이란? – 프로그램이 정지하는 구조적 원인
운영체제에서 말하는 데드락(Deadlock)은, 여러 프로세스가 서로 필요한 자원을 점유한 채 서로가 가진 자원을 끝없이 기다리면서 아무 작업도 진행하지 못하는 상태를 의미합니다.
한마디로, 모두가 멈춘 채 서로만 바라보며 기다리는 상황입니다.
이 상태에 빠지면 해당 프로세스들은 아무것도 할 수 없게 되고, 심하면 시스템 전체가 정지하거나 재부팅해야 할 정도로 심각한 문제로 이어질 수 있습니다.
🔷 실생활에 비유하면 더 쉽게 이해됩니다
🔸 예시 1: 좁은 복도에서 마주친 두 사람
▸ A와 B가 좁은 복도에서 마주쳤습니다.
▸ 둘 다 지나가려면 상대가 먼저 비켜줘야 합니다.
▸ 그런데 둘 다 “상대가 먼저 비켜야지”라고 생각한다면?
▸ 결국, 누구도 먼저 움직이지 않아서 둘 다 멈춰 있게 됩니다.
→ 이것이 바로 데드락의 대표적 형태입니다.
🔸 예시 2: 요리사의 칼과 도마
▸ 요리사 A는 칼을 가지고 있고, 도마가 필요합니다.
▸ 요리사 B는 도마를 가지고 있고, 칼을 기다립니다.
▸ 그런데 둘 다 자신이 가진 도구는 내려놓지 않은 채, 상대가 내려놓기만을 기다리고 있다면?
→ 결국 요리를 시작하지 못하고 무기한 대기하게 됩니다.
→ 이것도 전형적인 데드락 구조입니다.

🔷 운영체제에서 실제로 벌어지는 데드락 상황
실제 시스템에서도 위의 상황은 쉽게 발생할 수 있습니다.
🔸시나리오 – 프린터와 스캐너를 동시에 사용하는 두 프로세스
📍 프로세스 A: 프린터 점유 → 스캐너 요청
📍 프로세스 B: 스캐너 점유 → 프린터 요청
→ 둘 다 기다리며 멈춤 (데드락 발생)
▸ 프로세스 A는 프린터를 점유한 상태에서, 스캐너가 필요합니다.
▸ 프로세스 B는 반대로, 스캐너를 점유한 상태에서, 프린터를 요청합니다.
▸ 둘 다 필요한 자원을 점유하지 못한 상태이지만, 이미 일부 자원을 점유하고 있으므로 자원을 반납하지 않고 대기만 합니다.
→ 이때 운영체제는 어느 쪽도 자원을 회수하지 못하고, 둘 다 영원히 서로의 자원을 기다리는 상태, 즉 데드락에 빠지게 됩니다.
🔷 데드락이 왜 위험한가?
데드락은 단순한 지연 문제가 아닙니다. 다음과 같은 심각한 시스템 장애를 유발할 수 있습니다.
🔸성능 저하
▸ 데드락 상태의 프로세스는 자원을 점유한 채 아무 일도 하지 않기 때문에, 전체 시스템 처리 속도가 급격히 감소합니다.
🔸자원 낭비
▸ 필요한 자원을 확보하지 못한 다른 프로세스들은 작업을 하지 못하고, 시스템 자원은 놀고 있음에도 사용 불가능한 상태가 됩니다.
🔸시스템 정지
▸ 데드락이 확산되면 운영체제가 응답하지 않거나 서비스 전체가 멈추는 일도 발생할 수 있습니다.
2. 데드락 발생 조건 – 왜 빠져나올 수 없을까?
데드락은 단순한 실수나 일시적인 오류로 발생하는 것이 아닙니다.
운영체제에서는 다음의 네 가지 조건이 모두 동시에 만족될 때에만 데드락이 발생합니다.
즉, 이 중 하나라도 충족되지 않으면 데드락은 절대로 발생하지 않습니다.
이 조건들은 각각 개별적으로는 자원 보호나 효율적인 작업을 위해 필요한 구조지만, 함께 작동하면 프로세스 간 교착 상태로 이어질 수 있습니다.
각 조건을 실무 중심의 시나리오와 함께 하나씩 자세히 살펴보겠습니다.
| 조건명 | 설명 |
| 상호 배제 (Mutual Exclusion) | 자원은 한 번에 하나의 프로세스만 사용할 수 있음 (배타적 접근) |
| 점유 대기 (Hold and Wait) | 자원을 가진 상태에서 다른 자원을 추가로 요청하며 대기 |
| 비선점 (No Preemption) | 할당된 자원을 강제로 회수할 수 없음 |
| 순환 대기 (Circular Wait) | 프로세스 간 자원 요청이 원형으로 연결되어 서로를 기다림 |
🔷 1. 상호 배제 (Mutual Exclusion)
- 한 번에 하나의 프로세스만 자원을 사용할 수 있는 조건
운영체제는 시스템 자원의 충돌을 방지하고 데이터의 무결성을 보장하기 위해, 특정 자원에 대해서는 동시에 하나의 프로세스만 접근할 수 있도록 제한합니다.
이러한 제한을 상호 배제(Mutual Exclusion)라고 부릅니다.
대표적인 예로는 프린터, CD-ROM 드라이브, USB 카메라 같은 물리적 자원이 있습니다.
이들은 동시에 여러 작업을 처리할 수 없기 때문에, 반드시 단독으로 사용되도록 보호되어야 합니다.
✔️ 예시 시나리오

이 그림은 상호 배제(Mutual Exclusion) 개념을 시각적으로 보여줍니다.
▸ Process A가 프린터를 점유하고 작업 중입니다.
▸ 동시에 Process B가 같은 프린터를 요청하지만, 상호 배제 조건에 의해 접근이 차단되어 대기 상태에 머물게 됩니다.
→ 이런 구조는 자원 보호에는 유리하지만, 데드락의 첫 번째 조건이 되기도 합니다.
✔️ 실무 적용 팁
🔸읽기 전용은 Read Lock 사용
🔸병렬 작업으로 출력 대기시간 줄이기 (예: PDF 출력 후 프린트 선택)
🔸락 범위 명확화: 코드 설계 시 락 영역을 미리 정의
# 리눅스에서 자원 점유 확인
$ lsof | grep /dev/video0
▸ 읽기 전용 작업이라면, 자원을 완전히 독점하지 않고도 병렬 작업이 가능하도록 Read Lock을 사용하는 방법이 있습니다.
예: 로그 파일을 여러 프로세스가 읽기만 할 경우
▸ 자원 충돌을 줄이기 위해, 가능한 한 병렬 분산 구조로 작업을 나누는 설계가 바람직합니다.
예: 프린터 대신 PDF 파일로 출력 후 사용자 선택에 따라 실제 인쇄를 수행하도록 설계
▸ 스레드나 프로세스 간 자원 충돌이 예상된다면, 락의 사용 여부와 범위를 코드 설계 초기 단계에서 명확히 정의하는 것이 중요합니다.
🔷 2. 점유 대기 (Hold and Wait)
– 이미 자원을 점유한 프로세스가 추가 자원을 요청하며 대기하는 조건
점유 대기(Hold and Wait)란, 하나의 프로세스가 이미 어떤 자원을 점유하고 있는 상태에서, 추가 자원을 요청하며 대기하는 상황을 말합니다.
이 조건은 현대 운영체제에서 매우 흔하게 발생합니다. 대부분의 응용 프로그램은 실행 도중 필요한 자원을 하나씩 순차적으로 확보하기 때문입니다.
문제는, 이 과정에서 두 개 이상의 프로세스가 서로 상대방이 가진 자원을 기다리는 상황이 형성되면, 아무도 자원을 해제하지 않게 되고 결국 데드락으로 발전할 수 있다는 점입니다.
✔️ 예시 시나리오
백업 작업을 수행하는 스크립트 A가 외장 하드디스크(/dev/sdb1)를 점유한 상태에서, 추가 백업 대상인 NAS(Network Attached Storage)를 마운트 하려고 시도합니다.
하지만 해당 NAS는 이미 다른 스크립트 B가 점유하고 있는 상황입니다. 반대로, 스크립트 B는 NAS를 점유한 채 외장 하드디스크를 필요로 합니다.
→ 두 스크립트는 서로가 가진 자원을 요청하며 대기하게 되고, 이 상태에서는 어느 쪽도 먼저 작업을 진행할 수 없게 되어 무한 대기 상태, 즉 데드락에 빠지게 됩니다.

이 그림은 데드락 발생 조건 중 하나인 “점유 대기(Hold and Wait)” 상황을 보여줍니다.
▸ Process 1은 자원 A를 점유한 채 자원 B를 요청하고,
▸ Process 2는 자원 B를 점유한 채 자원 A를 요청합니다.
→ 두 프로세스 모두 자원을 반납하지 않고, 서로 상대방의 자원을 기다리기만 하기 때문에 시스템은 정지 상태에 빠지게 됩니다.
✔️ 실무 적용 팁 - 점유 대기 피하는 전략
🔸필요한 자원은 한 번에 요청
🔸일부 확보 실패 시 반납 후 재요청
🔸자원 요청 순서 고정
🔸타임아웃 후 요청 취소 또는 롤백
🔸1. 필요한 자원은 한 번에 요청하세요.
가장 확실한 방법은 작업에 필요한 모든 자원을 처음부터 동시에 요청하는 방식입니다.
이렇게 하면 중간에 자원이 부족해 대기 상태에 빠지는 일이 없어져, 데드락 발생 가능성을 원천 차단할 수 있습니다.
🔸2. 자원이 부족하면 기존 자원을 반납하세요.
만약 요청한 자원 중 일부만 확보되었고, 나머지가 부족하다면 현재 점유한 자원을 반납한 후 다시 요청하는 방식이 좋습니다.
이 방식은 시스템의 유연성을 높이고, 자원이 특정 프로세스에 고정되어 다른 작업이 막히는 현상(자원 고립)을 예방합니다.
🔸3. 자원 요청 순서를 고정하세요.
모든 프로세스가 자원을 요청할 때 일정한 순서를 지키도록 설계하는 것도 효과적인 방법입니다.
예를 들어, 자원을 A → B → C 순서로만 요청하도록 한다면, 순환 대기 조건이 발생하지 않기 때문에 데드락을 방지할 수 있습니다.
🔸4. 일정 시간 대기 후 요청을 취소하세요.
자원을 요청한 뒤 응답이 없으면 일정 시간 후 요청을 취소하거나 오류를 반환하도록 구현하는 것도 유용합니다.
이런 타임아웃(timeout) 전략은 무한 대기 상태를 막고, 사용자 입장에서 시스템이 멈춘 것처럼 보이는 상황을 피할 수 있게 해 줍니다.
이처럼 점유 대기를 완전히 막기는 어렵지만, 위와 같은 전략을 조합하여 설계하면 데드락 발생 가능성을 최소화할 수 있습니다.
특히 멀티스레드 환경이나 자원이 제한된 시스템에서는 미리 예측하고 설계하는 방식이 매우 중요합니다.
🔷 3. 비선점 (No Preemption)
- 이미 할당된 자원은 운영체제가 강제로 회수할 수 없는 조건
비선점(No Preemption)**이란, 어떤 자원이 한 번 특정 프로세스에 할당되면,
다른 프로세스가 그 자원을 필요로 하더라도 운영체제가 이를 강제로 회수하지 않는 구조를 의미합니다.
이러한 자원은 프로세스가 자발적으로 반납할 때까지 계속 점유된 상태로 유지되며,
그동안 다른 프로세스는 해당 자원을 사용할 수 없어 무기한 대기 상태에 놓일 수 있습니다.
운영체제가 자원을 강제로 회수하지 않는 이유는 명확합니다.
프로세스가 자원을 사용하는 도중 중단되면, 그 자원을 통해 수행 중이던 작업이나 데이터가 손상되거나 일관성이 깨질 위험이 있기 때문입니다.
✔️ 예시 시나리오
▸ 사용자가 Zoom으로 화상회의를 진행 중이라면, 웹캠은 Zoom 프로세스에 점유된 상태입니다.
▸ 이때 OBS나 Microsoft Teams 같은 다른 프로그램이 웹캠을 사용하려 하면 "카메라가 사용 중입니다"라는 메시지가 나타납니다.
▸ Windows도 이 자원을 강제로 해제하지 않으며, 현재 사용 중인 앱이 정상적으로 자원을 반납할 때까지 기다립니다.

이 그림은 비선점(No Preemption) 조건을 보여줍니다.
▸ Process A가 자원 X를 점유한 상태에서 Process B가 자원 X를 요청하고 있습니다.
▸ 운영체제는 자원을 강제로 빼앗을 수 없기 때문에, Process B는 무기한 대기 상태로 들어갑니다.
▸ 이러한 구조가 반복되면 시스템 내에서 병목 현상이 발생할 수 있습니다.
✔️ 실무 적용 팁
🔸타임아웃 설정으로 대기 제한
🔸자원은 짧게 점유하고 빠르게 반납
🔸사용 전 자원 점유 여부 확인
🔸도구 활용: Windows의 Process Explorer, Ubuntu의 lsof, fuser
🔸타임아웃 설정
일정 시간 이상 자원 요청이 처리되지 않으면 자동으로 취소하거나 재시도하는 로직을 추가합니다.
예시: 웹캠 접근 실패 시, “다시 시도” 또는 “카메라 선택 변경” 안내를 사용자에게 제공
🔸자원 점유 시간 최소화
자원이 필요한 시점에만 요청하고, 사용이 끝나는 즉시 빠르게 반납하는 구조로 설계합니다.
예시: 로그 파일을 기록할 때 전체 작업 내내 열어두지 않고, 기록할 때만 열고 바로 닫음
🔸자원 사용 여부 확인 후 요청
자원을 요청하기 전에 사용 가능 여부를 미리 확인하고, 불가능하면 우회 경로를 제공하도록 설계합니다.
예시: /dev/video0 장치가 사용 중이면, 사용자에게 "현재 카메라 사용 중입니다. 사용 가능한 다른 장치를 선택하세요." 메시지를 표시
🔸자원 사용 모니터링 도구 활용
Ubuntu에서는 lsof, fuser, lsof | grep video0 명령으로 디바이스 점유 현황을 확인할 수 있습니다.
Windows에서는 작업 관리자나 Process Explorer를 통해 자원 점유 중인 프로세스를 확인할 수 있습니다.
비선점은 데드락을 유발하는 중요한 조건 중 하나이지만, 동시에 운영체제의 안정성을 지키는 필수 조건이기도 합니다.
따라서 자원 관리 전략을 설계할 때, 자원의 특성(선점 가능 여부)에 따라 정교한 요청 방식과 타임아웃 처리를 함께 고려해야 합니다.
🔷 4. 순환 대기 (Circular Wait)
- 프로세스들이 자원을 서로 요청하며, 원형 고리를 형성하는 상태
순환 대기는 데드락 발생 조건 중에서 가장 직접적인 신호라고 볼 수 있습니다.
여러 프로세스가 자원을 점유한 채, 다른 프로세스가 보유한 자원을 순서대로 기다리는 구조가 형성되면, 이 고리는 스스로 끊어지지 않으며 영원히 대기하는 교착 상태로 진입하게 됩니다.
예를 들어, 다음과 같은 상황을 생각해 봅시다:
▸ Process A는 자원 1을 점유하고 있고, 자원 2를 기다립니다.
▸ Process B는 자원 2를 점유하고 있고, 자원 3을 기다립니다.
▸ Process C는 자원 3을 점유하고 있고, 자원 1을 기다립니다.
이렇게 되면, 세 개의 프로세스가 서로가 가진 자원을 기다리는 원형 고리를 형성하게 되고, 이 고리는 외부 개입 없이는 절대 해소되지 않습니다.
✔️ 실무 시나리오
▸Thread 1은 파일 시스템 락을 점유하고 있으며, 외부 서버와의 연결을 위한 네트워크 락을 요청합니다.
▸Thread 2는 이미 네트워크 락을 점유하고 있고, 현재 데이터를 DB에 저장하기 위해 데이터베이스 락을 요청합니다.
▸Thread 3은 데이터베이스 락을 점유한 채로, 처리 완료 후 파일 저장을 위해 파일 시스템 락을 요청합니다.
이 세 개의 스레드는 서로가 가진 락을 기다리며 아래와 같은 순환 구조를 만듭니다:
Thread 1 → 네트워크 → Thread 2 → 데이터베이스 → Thread 3 → 파일 → Thread 1
이처럼 락 요청이 원형 고리로 연결되면, 어떤 스레드도 진행할 수 없으며 시스템이 응답하지 않게 됩니다.
일반 사용자 입장에서는 “응답 없음(Not Responding)” 창만 보일 뿐이며, 내부적으로는 교착 상태에 빠진 것입니다.

위 그림은 순환 대기(Circular Wait) 조건을 나타낸 것입니다.
▸ Process A는 자원 1을 보유하고 자원 2를 요청
▸ Process B는 자원 2를 보유하고 자원 3을 요청
▸Process C는 자원 3을 보유하고 자원 1을 요청
→ 세 프로세스 모두 서로의 자원을 기다리며 멈춤
✔️ 실무 적용 팁
🔸자원 요청 순서에 고유 번호 부여 후 정렬
🔸락 획득 순서 통일
🔸tryLock(), timeout 등으로 충돌 시 재시도
🔸Deadlock Watchdog로 감시
🔸자원 요청 순서를 정해두세요.
모든 자원에 고유한 번호를 부여하고, 작은 번호 → 큰 번호 순서로만 요청하게 합니다.
예: 자원 A(1) → 자원 B(2) → 자원 C(3) 순서로만 요청 가능하도록 설계
🔸락 획득 정책 통일하기
멀티스레드 환경에서는 개발자마다 자원 요청 순서가 다르면 데드락이 발생하기 쉽습니다.
공통된 락 획득 순서를 문서화하거나, 락 유틸리티 클래스를 사용해 일관성 유지
🔸충돌 감지 및 재시도 로직 도입
자원 획득 시 충돌이 발생하면 일정 시간 후 재시도하도록 하여, 순환 고리를 일시적으로 끊을 수 있음
예: Java의 tryLock() 또는 Python의 acquire(timeout=…) 사용
🔸Deadlock Watchdog 구성하기 (고급)
프로세스 간의 자원 요청 그래프를 분석하는 데몬을 주기적으로 실행하여 순환 대기 구조가 감지되면 알림 또는 자동 재시작 수행
순환 대기는 하나의 자원 요청 순서 실수로도 쉽게 발생할 수 있습니다.
따라서 자원이 둘 이상 필요한 구조에서는 항상 “요청 순서가 일관되는지”를 먼저 점검하는 것이 가장 효과적인 예방책입니다.
3. 데드락 해결 전략 – 시스템을 멈추지 않게 하려면
데드락은 단순한 버그가 아니라, 운영체제 자원 관리의 구조적인 문제입니다.
특히 멀티프로세스 환경이나 대규모 시스템에서는 데드락이 발생하면 성능 저하, 서비스 중단, 시스템 정지 등 심각한 결과로 이어질 수 있습니다.
운영체제는 이러한 위험을 피하기 위해 다음과 같은 3가지 핵심 전략을 사용합니다.
🔷 1. 데드락 예방(Prevention)
데드락을 아예 만들지 않도록, 데드락 발생 조건 중 하나 이상을 사전에 차단하는 방식입니다.
즉, 시스템이 데드락 상태로 진입할 수 없도록 구조적으로 설계합니다.
✔️ 어떻게 예방할까?
| 조건명 | 예시 |
| 상호 배제 | 공유 가능한 자원으로 변경 (가능한 경우) |
| 점유 대기 | 자원을 한 번에 모두 요청하도록 설계 |
| 비선점 | 자원을 선점 가능하게 설계 (강제 회수 허용) |
| 순환 대기 | 자원 요청 순서를 고정 |
✔️ 실무 적용 팁
🔸자원을 항상 고정된 순서로 요청하도록 코드를 작성합니다.
→ 예: DB 락 → 파일 → 로그 락 순서로만 자원 요청
🔸자원을 한 번에 모두 요청하도록 만들면 점유 대기를 피할 수 있습니다.
🔸lock이나 mutex 사용 시에는 점유 시간 최소화가 핵심입니다.
→ 임계 구역(critical section)은 가능한 한 짧게 유지
🔷 2. 데드락 회피(Avoidance)
프로세스가 자원을 요청할 때마다 시스템이 판단합니다.
"이 요청을 받아주면 데드락에 빠질 가능성이 있는가?"
→ 가능성이 있다면 자원 할당을 거절하고, 기다리게 하는 방식
대표적인 회피 기법은 은행원 알고리즘(Banker's Algorithm)입니다.
은행도 대출을 해줄 때, 모든 고객이 한꺼번에 인출해도 최소한 한 명 이상은 해결 가능해야만 대출을 해줍니다.
운영체제도 같은 방식으로 자원을 미리 시뮬레이션해서 안전 상태(Safe State)인지 판단합니다.
✔️ 실무 적용 팁
🔸자원 요청 전에 요구량 정보(Max)를 미리 정의해두어야 함
🔸회피 전략은 계산이 복잡하므로, 일반적인 데스크탑보다는 산업용 시스템이나 연구용 OS, RTOS에서 주로 사용됨
🔸자원 상태 테이블을 정기적으로 유지 관리해야 함
🔷 3. 데드락 탐지 및 복구(Detection & Recovery)
데드락을 일부 허용한 후, 시스템이 정기적으로 검사해서 데드락이 발생했는지 확인합니다.
발생한 경우에는 프로세스를 강제 종료하거나 자원을 회수해서 시스템을 다시 정상 상태로 복구합니다.
운영체제는 프로세스 간 자원 요청 관계를 자원 할당 그래프(Resource Allocation Graph)로 표현하고, 순환(Cycle)이 있는지 검사합니다.
→ 순환이 발견되면 데드락으로 판단
🔸복구 방법:
- 교착 상태에 있는 프로세스 강제 종료
- 자원을 선점하여 다른 프로세스에 재할당
- 우선순위 기준으로 일부 프로세스를 롤백
✔️실무 적용 시나리오
🔸Ubuntu 환경
운영체제의 커널 수준에서 데드락이 발생할 경우, 관련 정보는 시스템 로그 파일이나 커널 메시지를 통해 확인할 수 있습니다.
특히 dmesg 명령어를 사용하면 커널에서 출력한 메시지를 실시간으로 조회할 수 있으며, 다음과 같은 문구가 나타나면 데드락 가능성을 의심해 볼 수 있습니다.
dmesg | grep "blocked"
예를 들어, task xyz blocked for more than 120 seconds라는 메시지는 특정 프로세스가 자원을 점유한 채 장시간 대기하고 있어, 커널이 데드락 가능성을 감지했음을 의미합니다.
이 경우, /var/log/syslog 파일에서도 유사한 로그가 기록되어 있으므로 추가 확인이 가능합니다.
🔸Windows 환경
Windows에서는 데드락이나 서비스 중단과 관련된 문제가 발생하면 이벤트 뷰어(Event Viewer)를 통해 시스템 로그에 기록됩니다.
일반적으로 다음과 같은 메시지를 통해 데드락 상황을 파악할 수 있습니다
Service Hang Detected
Deadlock Detected in Process
또한 고급 분석이 필요할 경우, Process Monitor(ProcMon) 또는 Windows Debugger(WinDbg)를 활용하여 자원 점유 상태와 스레드 간 대기 관계를 시각적으로 분석할 수 있습니다.
✔️ 실무 적용 팁
🔸데이터베이스 시스템에서는 트랜잭션 데드락이 자주 발생 → 주기적인 데드락 탐지 및 롤백 전략이 기본 내장
🔸Linux 기반 서버에서는 cron 등을 통해 주기적으로 deadlock check 스크립트를 실행하기도 함
🔸사용자 프로그램에는 timeout, retry, rollback 로직을 명확히 구현해야 안정성이 높아짐
✔ 마무리 - 데드락, 개발자가 반드시 고려해야 할 시스템 리스크
데드락은 단순한 오류가 아니라, 운영체제 내부의 구조적 병목입니다.
특히 멀티스레드 기반의 복잡한 애플리케이션이나 분산 시스템에서 자원 충돌이 일상적으로 발생하는 환경이라면, 데드락은 언제든 실무 이슈로 떠오를 수 있습니다.
데드락은 다음 조건이 모두 충족될 때 발생합니다:
🔸상호 배제
🔸점유 대기
🔸비선점
🔸순환 대기
이 중 하나만 제거해도 데드락은 발생하지 않습니다.
따라서 조건을 정확히 이해하고 설계 시점에서부터 방지 전략을 고려하는 것이 중요합니다.
실무 개발자 체크리스트
🔸 자원 요청 순서가 고정되어 있는가?
🔸 자원 점유 시간은 최소화되었는가?
🔸 타임아웃, 재시도, 롤백 로직이 구현되어 있는가?
🔸 락 획득 정책은 일관되게 관리되고 있는가?
🔸 자원 충돌 시 우회 경로나 사용자 대응 메시지가 존재하는가?
🔸 자원 사용 상태를 실시간으로 모니터링하고 있는가?
개발자의 코드 한 줄이 시스템 전체를 멈추게 할 수도 있습니다.
데드락은 코드 레벨에서 쉽게 발견되지 않으며, 실제 운영 중에만 나타나는 은밀하고 위험한 장애입니다.
그렇기 때문에, 초기 설계 단계에서부터 자원 요청 순서, 락 정책, 예외 처리 구조를 꼼꼼히 설계해야 합니다.
※ 게시된 글 및 이미지 중 일부는 AI 도구의 도움을 받아 생성되거나 다듬어졌습니다.
'1.시스템&인프라 > 개발 입문자를 위한 운영체제' 카테고리의 다른 글
| 8편. CPU 스케줄링 알고리즘 완전 정복 – 공정성, 속도, 우선순위의 비밀 (0) | 2025.11.17 |
|---|---|
| 7편. 멀티태스킹 완전 이해 – 운영체제는 어떻게 동시에 앱을 실행할까? (0) | 2025.11.17 |
| 5편. 프로세스 동기화 완전 정복 – 경쟁 조건과 뮤텍스, 세마포어, 모니터 (0) | 2025.11.14 |
| 4편. 스레드란 무엇인가? – 하나의 프로세스에서 동시에 여러 일을 처리하는 원리 (0) | 2025.11.14 |
| 3편. CPU는 어떻게 일할까? – 시간 분할과 문맥 교환의 원리 (0) | 2025.11.14 |