{{위키데이터 속성 추적}}
{{출처 필요|날짜=2013-4-5}}
{{다른 뜻 넘어옴|데드락}}
[[파일:Process deadlock.svg|섬네일]]
'''교착 상태'''(膠着狀態) 또는 '''데드락'''({{llang|en|deadlock}})은 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태이다. 예를 들어 하나의 [[사다리]]가 있고, 두 명의 사람이 각각 사다리의 위쪽과 아래쪽에 있다고 가정한다. 이때 아래에 있는 사람은 위로 올라 가려고 하고, 위에 있는 사람은 아래로 내려오려고 한다면, 두 사람은 서로 상대방이 사다리에서 비켜줄 때까지 하염없이 기다리고 있을 것이고 결과적으로 아무도 사다리를 내려오거나 올라가지 못하게 되듯이, [[전산학]]에서 교착 상태란 [[다중 프로그래밍]] 환경에서 흔히 발생할 수 있는 문제이다. 이 문제를 해결하는 일반적인 방법은 아직 없는 상태이다.

== 교착 상태의 조건 ==
[[1971년]]에 [[E. G. 코프만]] 교수는 교착상태가 일어나려면 다음과 같은 네 가지 [[필요 조건]]을 충족시켜야 함을 보였다.

# [[상호배제]](Mutual exclusion) : 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.
# [[점유대기]](Hold and wait) : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
# [[비선점 스케줄링|비선점]](No preemption) : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
# [[순환대기]](Circular wait) : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.

이 조건 중에서 한 가지라도 만족하지 않으면 교착 상태는 발생하지 않는다. 이중 순환대기 조건은 점유대기 조건과 비선점 조건을 만족해야 성립하는 조건이므로, 위 4가지 조건은 서로 완전히 독립적인 것은 아니다.

== 교착 상태의 관리 ==
현재의 대부분의 운영 체제들은 교착 상태를 막는 것은 불가능하다.<ref name=os_galvin>{{서적 인용 | last=Silberschatz| first=Abraham
 | url= http://books.google.co.in/books?id=WjvX0HmVTlMC&dq=deadlock+operating+systems&source=gbs_navlinks_s|publisher=Wiley-India | year=2006 | 제목=Operating System Principles| edition=7 | page=237| accessdate=29 January 2012}}</ref> 교착 상태가 발생하면 여러 운영 체제들은 제각기 다른 비표준 방식들로 이러한 교착 상태에 대응한다. 대부분의 접근들은 4가지 코프먼 조건들 가운데 하나(특히 4번째 것)를 막음으로써 동작한다.<ref name=pric_os>{{서적 인용 | last=Stuart | first=Brian L.
  | url= http://books.google.co.in/books?id=B5NC5-UfMMwC&lpg=PA112&dq=coffman%20conditions&pg=PA112#v=onepage&q=coffman%20conditions&f=false | publisher= Cengage Learning | year= 2008 | 제목=Principles of operating systems | edition=1st | page=446| accessdate=28 January 2012}}</ref> 주요 접근 방식은 다음과 같다.

=== 교착 상태의 예방 ===
* 상호배제 조건의 제거
:교착 상태는 두 개 이상의 프로세스가 공유가능한 자원을 사용할 때 발생하는 것이므로 공유 불가능한, 즉 상호 배제 조건을 제거하면 교착 상태를 해결할 수 있다.
* 점유와 대기 조건의 제거
:한 프로세스에 수행되기 전에 모든 자원을 할당시키고 나서 점유하지 않을 때에는 다른 프로세스가 자원을 요구하도록 하는 방법이다. 자원 과다 사용으로 인한 효율성, 프로세스가 요구하는 자원을 파악하는 데에 대한 비용, 자원에 대한 내용을 저장 및 복원하기 위한 비용, [[기아 상태]], 무한대기 등의 문제점이 있다.
* 비선점 조건의 제거
:비선점 프로세스에 대해 선점 가능한 프로토콜을 만들어 준다.
* 환형 대기 조건의 제거
:자원 유형에 따라 순서를 매긴다.

이 교착 상태의 해결 방법들은 자원 사용의 효율성이 떨어지고 비용이 많이 드는 문제점이 있다.

=== 교착 상태의 회피 ===
자원이 어떻게 요청될지에 대한 추가정보를 제공하도록 요구하는 것으로 시스템에 circular wait가 발생하지 않도록 자원 할당 상태를 검사한다.

교착 상태 회피하기 위한 알고리즘으로 크게 두가지가 있다.

# [[자원 할당 그래프 알고리즘]] (Resource Allocation Graph Algorithm)
# [[은행원 알고리즘]] (Banker's algorithm)

=== 교착 상태의 무시 ===
예방 혹은 회피기법을 프로그래밍해서 넣으면 성능에 큰 영향을 미칠 수 있게 된다.
그렇기 때문에 데드락의 발생 확률이 비교적 낮은 경우 별다른 조치를 취하지 않는다.

=== 교착 상태의 발견 ===
감시/발견을 하는 detection 알고리즘으로 Deadlock 발생을 체크하는 방식. 이 역시 성능에 큰 영향을 미칠 수 있다.

== 같이 보기 ==
* [[아포리아]]
* [[순환 참조]]
* [[식사하는 철학자들 문제]]
* [[파일 잠금]]
* [[프리징 (컴퓨팅)]]
* [[무한 루프]]
* [[선형화가능성]]
* [[경쟁 상태]]
* [[잠자는 이발사 문제]]
* [[스테일메이트]]

== 참조 ==
<references />

== 외부 링크 ==
* "[http://www.onjava.com/pub/a/onjava/2004/10/20/threads2.html Advanced Synchronization in Java Threads]" by Scott Oaks and Henry Wong
* [[c2:DeadLock|DeadLock]] at the Portland Pattern Repository
* [http://www.etymonline.com/index.php?term=deadlock Etymology of "Deadlock"]

[[분류:운영체제 기술]]
[[분류:소프트웨어 버그]]
[[분류:분산 컴퓨팅]]
[[분류:에츠허르 데이크스트라]]
[[분류:분산 컴퓨팅 문제]]