ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데드락(Deadlock)이란?
    Computer Science/OS 2024. 4. 3. 23:09
    반응형

    1. 데드락이란?

    데드락이란, 두 개 이상의 프로세스나 스레드가 서로 상대방이 점유한 자원의 해제를 무한히 기다리게 되어, 아무런 진행도 할 수 없는 상태를 말합니다. 이러한 상태가 발생하면, 해당 프로세스들은 영원히 진행되지 못하고 멈춰 있는 상태가 됩니다.

    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)

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

    • 상호 배제(Mutual Exclusion): 한 번에 하나의 프로세스만 자원을 사용할 수 있습니다.
    • 점유 대기(Hold and Wait): 최소한 하나의 자원을 점유한 상태로, 다른 프로세스가 점유한 자원을 추가로 기다립니다.
    • 비선점(No Preemption): 자원이 강제로 빼앗길 수 없으며, 사용중인 프로세스가 스스로 해제할 때까지 기다려야 합니다.
    • 순환 대기(Circular Wait): 프로세스의 집합에서 첫 번째 프로세스가 두 번째 프로세스가 점유한 자원을 기다리고, 두 번째는 세 번째의 자원을, 이런 식으로 순환하여 마지막 프로세스가 다시 첫 번째 프로세스의 자원을 기다리는 상황입니다.

    4. 추가 팁

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