- 교착 상태에 대해서 설명해주세요.2025년 04월 01일 14시 19분 55초에 업로드 된 글입니다.작성자: do_hyuk
교착 상태(deadlock) 는 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있어 결과적으로 아무것도 완료되지 못하는 상태를 의미합니다.
가령, A 프로세스가 자원 A를 가지고 자원 B를 필요로 합니다.
그리고, B 프로세스는 자원 B를 가지고 자원 A가 필요할 때 두 개의 프로세스는 교착 상태에 빠져 어느 작업도 진행할 수 없는 상황이 됩니다.
교착 상태가 발생하는 조건을 알고 계신가요? 🤔
4가지 조건(상호 배제, 점유 대기, 비선점, 원형 대기)이 모두 만족하는 경우, 교착 상태에 빠질 수 있습니다.
- 상호 배제(mutual exclusion) 는 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 경우를 의미합니다.
- 점유 대기(hold and wait) 는 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태를 의미합니다.
- 비선점(non-preemption) 은 자원이 강제적으로 해제될 수 없으며 점유하고 있는 프로세스의 작업이 끝난 이후에만 해제되는 것을 의미합니다.
- 원형 대기(circular wait) 은 프로세스들이 원의 형태로 자원을 대기하는 것을 의미합니다.
자바에서 교착 상태는 어떻게 해결할 수 있나요? 😀
// thread 1 synchronized (resource1) { synchronized(resource2) { ... } } // thread 2 synchronized (resource2) { synchronized(resource1) { ... } }
예를 들어, 자바의 syncronized 키워드로 인한 교착 상태가 발생했다고 가정해보겠습니다.
위와 같은 경우에는 외부 synchronized 블록 내부에 synchronized 블록을 포함하지 않도록 개선하여 점유 대기 조건을 제거하여 교착 상태를 해결할 수 있습니다.
이외에도 ReentrantLock을 사용하는 경우에는 tryLock() 메서드를 사용하여 타임아웃을 설정하거나, lockInterruptibly() 메서드를 사용하여 데드락이 발생하는 경우, 인터럽트를 통해 스레드를 깨울 수 있습니다.
정리하자면 교착 상태가 발생하는 4가지 조건 중 하나를 충족하지 못하게 하거나, 대기하는 경우 무한정 기다리지 않는 방식으로 교착 상태를 풀어볼 수 있습니다.
'면접 대비' 카테고리의 다른 글
Redis가 싱글 스레드로 만들어진 이유를 설명해주세요. (1) 2025.03.28 JWT 특징과 주의 사항을 설명해주세요. (0) 2025.03.27 응집도와 결합도에 대해서 설명해주세요. (0) 2025.03.11 CAP 정리에 대해서 알고 계신가요? (0) 2025.03.05 시스템 간 비동기 연동 방식에는 무엇이 있나요? (0) 2025.03.04 댓글