Computer Science/OS

데드락(Deadlock)이란?

슝슝이입니다 2024. 4. 3. 23:09
반응형

1. 데드락이란?

🤔 데드락이 뭐길래?

컴퓨터 과학에서 데드락(Deadlock) 은 둘 이상의 프로세스(또는 스레드)가 서로가 가진 자원을 기다리느라 영원히 실행되지 못하는 상태를 말합니다. 서로 양보하지 않고 기다리기만 하다 보니, 시스템 전체가 멈춰버리는 현상이죠.

 

🍜 라면 비유로 이해해보자

라면을 끓이는 두 사람이 있다고 해볼게요.

  • A는 냄비를 먼저 잡고, 그다음 가스레인지를 쓰려고 해요.
  • B는 가스레인지를 먼저 잡고, 그다음 냄비를 쓰려고 해요.

그런데 A는 "B가 가스레인지를 놓을 때까지" 기다리고,
B는 "A가 냄비를 놓을 때까지" 기다립니다.

둘 다 서로의 행동을 기다리기만 하니, 결국 라면은 못 끓이고 시스템이 멈춰버린 거예요. 이게 바로 데드락입니다.

2. 데드락 예시코드

Java:

public class DeadlockExample {
    private static final Object lock1 = new Object();
    private static final Object lock2 = new Object();

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            synchronized (lock1) {
                System.out.println("Thread 1: Holding lock 1...");

                try { Thread.sleep(10); } catch (InterruptedException e) {}
                System.out.println("Thread 1: Waiting for lock 2...");

                synchronized (lock2) {
                    System.out.println("Thread 1: Holding lock 1 & 2...");
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (lock2) {
                System.out.println("Thread 2: Holding lock 2...");

                try { Thread.sleep(10); } catch (InterruptedException e) {}
                System.out.println("Thread 2: Waiting for lock 1...");

                synchronized (lock1) {
                    System.out.println("Thread 2: Holding lock 1 & 2...");
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

 

Golang:

package main

import (
	"fmt"
	"sync"
)

func main() {
	var lock1, lock2 sync.Mutex

	go func() {
		lock1.Lock()
		fmt.Println("Goroutine 1: Holding lock 1")
		lock2.Lock()
		fmt.Println("Goroutine 1: Holding lock 1 and 2")
		lock2.Unlock()
		lock1.Unlock()
	}()

	go func() {
		lock2.Lock()
		fmt.Println("Goroutine 2: Holding lock 2")
		lock1.Lock()
		fmt.Println("Goroutine 2: Holding lock 2 and 1")
		lock1.Unlock()
		lock2.Unlock()
	}()

	select {}
}

 

이 예시에서는 두 스레드(또는 고루틴)가 서로 다른 순서로 락을 획득하려고 할 때 데드락이 발생할 수 있음을 보여줍니다.

3. 코프먼 조건(Coffman Conditions)

데드락이 발생하기 위한 네 가지 필수 조건입니다:

이 중 하나라도 깨면 데드락은 발생하지 않습니다.

 

✅ 데드락 예방/회피/탐지/회복 전략

4. 추가 팁

  • 자원 할당 그래프: 시스템의 자원 할당 상태를 그래프로 표현하여 데드락의 가능성을 분석할 수 있습니다.
  • 데드락 예방 및 회피: 코프먼 조건
반응형