Deadlock

정호윤·2024년 2월 23일
0

동기화

목록 보기
4/4

데드락(Deadlock)은 서로가 서로의 작업이 끝나기를 기다리며 무한정 대기하는 상태를 말합니다. 여기서 '서로'는 프로세스나 쓰레드를 의미합니다. 데드락이 발생하기 위해서는 다음 네 가지 조건을 모두 만족해야 합니다.

  1. 상호 배제(Mutual exclusion): 자원은 한 번에 하나의 프로세스만 사용할 수 있다.
  2. 점유와 대기(Hold and wait): 자원을 가진 상태에서 다른 자원을 가지려고 시도한다.
  3. 비선점(Non-preemption): 다른 프로세스의 자원을 강제로 뺏을 수 없다.
  4. 원형 대기(Circular wait): 각 프로세스는 순환적으로 다른 프로세스가 필요로 하는 자원을 보유한다.

데드락

다음은 데드락을 일으키는 자바 코드입니다.

public class DeadlockExample {
	public static void main(String[) args) {
		Object lock1 = new Object();
		Object lock2 = new Object();
        
		Thread thread1 = new Thread(() -> {
			synchronized(lock1) {
				// ...
				synchronized(lock2) {
					// ...
                }
            }
		});
        
        Thread thread2 = new Thread(() -> {
			synchronized(lock2) {
            	// ...
				synchronized(lock1) {
					// ...
                }
            }
		});
        
		thread1.start();
		thread2.start();
    }
}
  1. 상호 배제: synchronized 키워드를 사용함으로써 만족합니다.
  2. 점유와 대기: 각 쓰레드는 상대가 필요로 하는 lock을 가진 상태에서 다른 lock을 요구합니다.
  3. 비선점: 마찬가지로 synchronized 키워드를 사용함으로써 만족합니다.
  4. 원형 대기: 각 쓰레드는 서로 상대가 사용 중인 lock을 요구합니다.

데드락의 해결법

운영체제가 데드락을 해결하는 방법으로는 크게 네 가지가 있습니다. 운영체제는 이러한 방법들을 적절히 사용하여 데드락을 해결합니다.

  1. 예방: 데드락을 일으키는 네 가지 조건들 중 상호 배제를 제외한 조건을 한 가지 이상을 불만족
  2. 회피: 데드락을 일으키지 않을 정도로만 프로세스에 자원 할당
  3. 검출 후 회복: 데드락이 발생하면 프로세스를 하나씩 강제 종료하거나 전부 강제 종료
  4. 무시: 데드락은 드물게 발생하는 일이므로 그냥 무시

출처

0개의 댓글

관련 채용 정보