[3.3] Deadlock

Always·2025년 3월 4일
1

매일메일

목록 보기
52/69

Deadlock이란?

다음과 같은 상황을 생각해보자
Process 1이 현재 자원 A를 할당받고 있고, 자원 B가 필요하다.
Process 2는 현재 자원 B를 할당받고 있고, 자원 A가 필요하다.
이렇게 되면 두 프로세스는 서로의 작업이 끝나야, 본인의 작업을 할 수 있기에, 계속 상대의 작업이 끝나기만 기다린다.
이렇게 공유자원에 대해서 서로의 작업이 끝나길 기다리면서 작업이 진행되지 않는 현상을 Deadlock이라고 한다.

Deadlock의 조건

데드락은 아래의 4가지 조건을 만족한다.
1. 상호배제: 동시에 같은 자원을 다른 프로세스가 사용할 수 없다는 조건
2. 점유 대기: 프로세스가 현재 자원을 할당받았고, 다음 자원을 할당 받기 위해서 기다려야하는 조건
3. 비선점: 하나의 자원이 사용중에는 뺏길수 없다는 조건
4. 원형 대기: 프로세스들이 원의 형태로 자원을 할당받기 위해서 대기하는 조건

이 4가지를 만족해야 데드락이라고 한다.

Java 에서 DeadLock 해결

자바에서 데드락은 synchronized키워드를 사용할 때 발생할 가능성이 있다.

synchronized(src1){
synchronized(src2){
....
}
}


-----
synchronized(src2){
synchronized(src1){
....
}
}

이렇게 되면, src1을 사용시, src2를 기다리고, src2를 사용시, src1을 기다린다.
따라서 두개의 공유자원을 사용하는 process들이 서로를 기다리는 deadlock에 걸릴 가능성이 높다
이 경우에는 단순하게 서로가 서로를 기다리는 점유 대기 조건을 synchronized키워드를 없애는 것을 통해서 제거하면 됨.

또한 timeout을 설정해서 deadlock발생시 무한이 원형 대기하는 현상을 없애거나, 발생시 인터럽트를 통해서 스레드를 깨우는 방법이 존재한다.

deadlock를 해결하기 위해서, 4가지의 조건중 하나를 제거하면 쉽게 해결할 수 있다.

profile
🐶개발 블로그

0개의 댓글