728x90
반응형
SMALL
1. 데드락(Deadlock) 개념
데드락은 여러 프로세스(작업)가 자원을 공유할 때 발생하는 문제입니다.
두 개 이상의 프로세스가 서로 필요한 자원을 가지고 기다리면서, 아무 것도 할 수 없는 상태를 말합니다.
📌 비유: 두 사람이 문을 열기 위해 서로 다른 열쇠를 가지고 있는데, 서로의 열쇠를 빌려주지 않으면 둘 다 문을 열 수 없게 되는 상황이 바로 데드락이에요! 🔒
2. 데드락 발생 조건
데드락이 발생하려면 4가지 조건이 모두 만족해야 합니다:
- 상호 배제(Mutual Exclusion): 한 번에 한 프로세스만 자원을 사용할 수 있어야 합니다.
- 점유 및 대기(Hold and Wait): 자원을 일부 점유하고 있으면서, 추가적인 자원을 기다리고 있어야 합니다.
- 비선점(Non-preemption): 다른 프로세스가 점유한 자원을 강제로 빼앗을 수 없습니다.
- 순환 대기(Circular Wait): 프로세스들이 서로 자원을 기다리며 순환하는 상태여야 합니다.
이 네 가지 조건이 모두 충족되면 데드락이 발생하게 됩니다.
3. 데드락 예시 코드
여기서는 Python 코드로 두 프로세스가 서로 자원을 기다리며 데드락에 빠지는 상황을 간단히 보여드릴게요! 😊
📌 데드락 발생 예시 코드
import threading
import time
# 자원 A와 B를 정의합니다.
resource_A = threading.Lock()
resource_B = threading.Lock()
# 작업 1: 자원 A를 점유하고 자원 B를 기다립니다.
def task1():
print("Task 1: 자원 A를 점유 중...")
resource_A.acquire() # 자원 A 점유
time.sleep(1) # 잠시 대기 (다른 프로세스가 자원 B를 점유하도록)
print("Task 1: 자원 B를 기다립니다...")
resource_B.acquire() # 자원 B 대기 (이 시점에서 데드락 발생)
print("Task 1: 작업 완료!")
resource_B.release() # 자원 B 반환
resource_A.release() # 자원 A 반환
# 작업 2: 자원 B를 점유하고 자원 A를 기다립니다.
def task2():
print("Task 2: 자원 B를 점유 중...")
resource_B.acquire() # 자원 B 점유
time.sleep(1) # 잠시 대기 (다른 프로세스가 자원 A를 점유하도록)
print("Task 2: 자원 A를 기다립니다...")
resource_A.acquire() # 자원 A 대기 (이 시점에서 데드락 발생)
print("Task 2: 작업 완료!")
resource_A.release() # 자원 A 반환
resource_B.release() # 자원 B 반환
# 두 작업을 동시에 실행 (데드락 발생)
thread1 = threading.Thread(target=task1)
thread2 = threading.Thread(target=task2)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
동작 설명:
- 작업 1은 자원 A를 먼저 점유하고, 자원 B를 기다립니다.
- 작업 2는 자원 B를 먼저 점유하고, 자원 A를 기다립니다.
- 두 작업은 서로 상대방이 점유한 자원을 기다리게 되어 데드락 상태에 빠지게 됩니다.
- 작업 1은 자원 B를 기다리며, 작업 2는 자원 A를 기다리므로 무한 대기 상태가 됩니다.
4. 데드락 해결 방법
데드락을 해결하는 방법은 여러 가지가 있지만, 예방과 회피 방법이 가장 일반적입니다.
1️⃣ 데드락 예방
- 상호 배제: 자원을 공유할 때 한 번에 한 프로세스만 자원을 사용할 수 있도록 강제합니다.
- 점유 및 대기 방지: 프로세스가 자원을 기다릴 때, 다른 자원을 먼저 할당하고 대기하지 않도록 합니다.
- 비선점 방지: 자원을 강제로 빼앗을 수 있게 해서, 다른 프로세스가 자원을 선점할 수 있도록 합니다.
- 순환 대기 방지: 프로세스가 자원을 요청하는 순서를 미리 정해두고, 순서대로 자원을 요청하게 합니다.
2️⃣ 데드락 회피
- 은행가 알고리즘처럼, 시스템이 자원을 할당하기 전에 안전 상태(Safe State)인지를 체크하여 데드락이 발생하지 않도록 합니다.
3️⃣ 데드락 탐지
- 시스템에서 주기적으로 데드락을 탐지하고, 데드락 상태에 빠지면 프로세스를 종료하거나 자원을 회수하는 방식입니다.
💡 비유: 데드락 해결은 교차로에서 신호등을 설치하거나, 대기 시간을 관리하여 차들이 서로 충돌하지 않게 하는 것과 비슷해요! 🚦
5. 쉽게 외우는 요점
- 데드락은 여러 프로세스가 서로 자원을 기다리며 멈춰버리는 상황이에요.
- 해결 방법은 예방(데드락이 발생하지 않도록 시스템을 설계)과 회피(데드락이 발생할 때까지 기다리지 않고 미리 대처)로 나눌 수 있어요!
728x90
반응형
SMALL
'운영체제 > 동기화 및 교착 상태' 카테고리의 다른 글
피자 주문으로 배우는 비동기 프로그래밍! 동기와 비동기의 차이, 이렇게 쉬웠어? - 코드카인 티스토리 (0) | 2024.12.23 |
---|---|
[운영체제] 프로세스 동기화 완벽 정리: Mutex, Semaphore 개념과 자바·파이썬 예제 (0) | 2024.12.18 |