///
Search
☠️

Deadlock

태그
JAVA
OS
CS
백기선님의 10주차 과제를 정리하던 중 기존에 공부했던 내용을 다시 확인했다. 그런데 Deadlock에 관련한 부분은 한문장 정도로 정리되어 있어 따로 빼내어 정리해보려고 한다.

Deadlock?

공부하기 전 필자가 생각하는 Deadlock의 개념은 다음과 같다. 만약 “두개의 Thread가 존재하고 하나의 오브젝트를 사용하려고 할때 이미 점유하고 있는 Thread의 작업이 끝나지 않아 영원히 또 다른 쓰레드가 작업을 시작하지 못하고 멈추는 것” 이라고 생각한다. 과연 맞을까?
Oracle java Tutorials에는 Deadlock을 이렇게 정의하고 있다.
Deadlock describes a situation where two or more threads are blocked forever, waiting for each other. Here's an example.
요약하자면 “둘 이상의 Thread가 영원히 차단되어 서로를 기다리는 상황”이라고 설명한다. 내가 생각하는 개념적인건 맞다고 생각한다. 하지만 설명을 잘못한 것 같다. 하여튼 예제 상황으로 이를 한번 돌아 보자. 만약 친구 두 명이 있다. 둘은 서로 예의를 잘 지킨다. 하지만 인사를 할 때 엄격한 친구는 또 다른 친구가 인사를 끝내지 않으면 절대 자신이 먼저 인사를 끝내지 않는다. 그러면 어떻게 될까?
public class Deadlock { // 자세한 코드는 오라클 튜토리얼에.. 저작권 때문에 public static void main(String[] args) { final Friend alphonse = new Friend("Alphonse"); final Friend gaston = new Friend("Gaston"); new Thread(new Runnable() { public void run() { alphonse.bow(gaston); // gaston의 점유 bowBack을 대기하는 상태 new Thread(new Runnable() { public void run() { gaston.bow(alphonse); // alphonse의 점유 bowBack을 대기하는 상태 } } 간단하게 어떤 스레드가 bow를 하는 동안 다른 스레드도 같이 bow를 시도한다. 하지만 bow를 끝내려면 bowback을 시도해야하지만 서로가 서로의 bowback을 기다려서 하지못한다.
Java
복사
oracle example 출처 : https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/essential/concurrency/examples/Deadlock.java
그럼 DeadLock의 조건이 있을까? 다음 조건이 만족하면 DeadLock(교착 상태)에 빠질 수 있다. 반대로 생각해보면 이 조건들을 충족하지 않는다면 DeadLock에서 벗어 날 수 있다.
1.
상호배제 자원은 한번에 한 프로세스만 사용할 수 있어야한다.
2.
점유 대기 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야한다.
3.
비선점 다른 프로세스의 자원은 강제로 빼앗을 수 없다.
4.
순환대기 프로세스 집합에서 {A,B…} 에서 A는 B가 점유한 자원 대기 상태, B도 A가 점유한 자원 대기 상태일 경우 서로가 서로의 자원을 요구하는 상태여야한다.

운영체제 관점에서 봐보자(2년 정도 지나고 추가 정리)

자 대충 os 관점에서는 상태 전이도를 통해서 Deadlock의 발생 시점을 알 수 있다. asleep일 때 발생하는 것을 알 수 있다. 왜 기아상태와 데드락은 차이가 날까? 기아상태의 경우 우선순위에 의해 결정 난다. 하지만 데드락은 순환에 의하여 발생한다. 그래서 그래프를 통해서 알 수도 있고, 뱅커알고리즘을 통해 safe sequence를 통해서도 알아 낼 수 있다.