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

</aside>

Deadlock?

<aside> 😅 공부하기 전 필자가 생각하는 Deadlock의 개념은 다음과 같다. 만약 “두개의 Thread가 존재하고 하나의 오브젝트를 사용하려고 할때 이미 점유하고 있는 Thread의 작업이 끝나지 않아 영원히 또 다른 쓰레드가 작업을 시작하지 못하고 멈추는 것” 이라고 생각한다. 과연 맞을까?

</aside>

<aside> 📌 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가 영원히 차단되어 서로를 기다리는 상황”***이라고 설명한다. 내가 생각하는 개념적인건 맞다고 생각한다. 하지만 설명을 잘못한 것 같다. 하여튼 예제 상황으로 이를 한번 돌아 보자. 만약 친구 두 명이 있다. 둘은 서로 예의를 잘 지킨다. 하지만 인사를 할 때 엄격한 친구는 또 다른 친구가 인사를 끝내지 않으면 절대 자신이 먼저 인사를 끝내지 않는다. 그러면 어떻게 될까?

</aside>

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을 기다려서 하지못한다.

<aside> 😅 그럼 DeadLock의 조건이 있을까? 다음 조건이 만족하면 DeadLock(교착 상태)에 빠질 수 있다. 반대로 생각해보면 이 조건들을 충족하지 않는다면 DeadLock에서 벗어 날 수 있다.

  1. 상호배제 자원은 한번에 한 프로세스만 사용할 수 있어야한다.
  2. 점유 대기 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야한다.
  3. 비선점 다른 프로세스의 자원은 강제로 빼앗을 수 없다.
  4. 순환대기 프로세스 집합에서 {A,B…} 에서 A는 B가 점유한 자원 대기 상태, B도 A가 점유한 자원 대기 상태일 경우 서로가 서로의 자원을 요구하는 상태여야한다. </aside>

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

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

</aside>

Untitled