운영체제/동기화 및 교착 상태

[운영체제] 데드락(Deadlock) 완벽 가이드: 발생 원인, 예시 코드 및 해결 방법

CodeCaine Explorer 2024. 12. 18. 11:41
728x90
반응형
SMALL

1. 데드락(Deadlock) 개념

데드락은 여러 프로세스(작업)가 자원을 공유할 때 발생하는 문제입니다.
두 개 이상의 프로세스가 서로 필요한 자원을 가지고 기다리면서, 아무 것도 할 수 없는 상태를 말합니다.

📌 비유: 두 사람이 문을 열기 위해 서로 다른 열쇠를 가지고 있는데, 서로의 열쇠를 빌려주지 않으면 둘 다 문을 열 수 없게 되는 상황이 바로 데드락이에요! 🔒


2. 데드락 발생 조건

데드락이 발생하려면 4가지 조건이 모두 만족해야 합니다:

  1. 상호 배제(Mutual Exclusion): 한 번에 한 프로세스만 자원을 사용할 수 있어야 합니다.
  2. 점유 및 대기(Hold and Wait): 자원을 일부 점유하고 있으면서, 추가적인 자원을 기다리고 있어야 합니다.
  3. 비선점(Non-preemption): 다른 프로세스가 점유한 자원을 강제로 빼앗을 수 없습니다.
  4. 순환 대기(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. 작업 1자원 A를 먼저 점유하고, 자원 B를 기다립니다.
  2. 작업 2자원 B를 먼저 점유하고, 자원 A를 기다립니다.
  3. 두 작업은 서로 상대방이 점유한 자원을 기다리게 되어 데드락 상태에 빠지게 됩니다.
  4. 작업 1은 자원 B를 기다리며, 작업 2는 자원 A를 기다리므로 무한 대기 상태가 됩니다.

4. 데드락 해결 방법

데드락을 해결하는 방법은 여러 가지가 있지만, 예방회피 방법이 가장 일반적입니다.

1️⃣ 데드락 예방

  • 상호 배제: 자원을 공유할 때 한 번에 한 프로세스만 자원을 사용할 수 있도록 강제합니다.
  • 점유 및 대기 방지: 프로세스가 자원을 기다릴 때, 다른 자원을 먼저 할당하고 대기하지 않도록 합니다.
  • 비선점 방지: 자원을 강제로 빼앗을 수 있게 해서, 다른 프로세스가 자원을 선점할 수 있도록 합니다.
  • 순환 대기 방지: 프로세스가 자원을 요청하는 순서를 미리 정해두고, 순서대로 자원을 요청하게 합니다.

2️⃣ 데드락 회피

  • 은행가 알고리즘처럼, 시스템이 자원을 할당하기 전에 안전 상태(Safe State)인지를 체크하여 데드락이 발생하지 않도록 합니다.

3️⃣ 데드락 탐지

  • 시스템에서 주기적으로 데드락을 탐지하고, 데드락 상태에 빠지면 프로세스를 종료하거나 자원을 회수하는 방식입니다.

💡 비유: 데드락 해결은 교차로에서 신호등을 설치하거나, 대기 시간을 관리하여 차들이 서로 충돌하지 않게 하는 것과 비슷해요! 🚦


5. 쉽게 외우는 요점

  • 데드락은 여러 프로세스가 서로 자원을 기다리며 멈춰버리는 상황이에요.
  • 해결 방법은 예방(데드락이 발생하지 않도록 시스템을 설계)과 회피(데드락이 발생할 때까지 기다리지 않고 미리 대처)로 나눌 수 있어요!
728x90
반응형
SMALL