데드락

Posted 2012. 9. 4. 14:41

정의

두개 이상의 스레드가 하나의 자원을 공유할때

ex) A 에서 B가 가진 자원이 있어야만 동작 가능하며 B의 작업이 끝나기를 기다리고 있는데

B 에서도 A가 가진 자원이 필요해 A가 끝나기를 기다리는 상태일때 두 작업은 교착상태에 빠지게 된다.

 

발생조건

Mutual exclusion : 한번에 오직 1개의 프로세스만 이 자원에 접근 가능

Hold and wait : 최소한 한개의 자원을 가진 프로세스가 다른 프로세스 소유의 자원을 추가로 얻기 위해 기다릴때

No preemption : 해당 작업이 완료되기 전까지는 자원이 반환하지 않는것

Circular wait : 연쇄적으로 자원을 기다리는 형태( 1은 2를 기다리고, 2는 3을 기다리고, 3은 1을 기다리는 상태 )

 

방지 방법

타임 아웃을 줘서 어느 일정시간 동안 락을 기다리다가 반응이 없으면 롤백 시키는 타임아웃 설정

락 타임아웃의 설정 : SET LOCK_TIMEOUT 10000

락 타임아웃 확인 : SELECT @@LOCK_TIMEOUT

트랜잭션 추가

또는 프로시저 우위를 설정해 준다

우선 순위의 레밸은 Low와 Normal로 나타낼수 있고 Priority라는 것을 이용하여 설정 할 수가 있다

SET DEDLOCK_PRIORITY LOW

또는 한 프로시저가 너무 오랫동안 사용하고 있다 의심되는 것을 강제로 종료 시키는 방법

 

'Server' 카테고리의 다른 글

Connection Error] IOCP : GetQueuedCompletionStatus  (0) 2013.10.18
크리티컬섹션, 뮤텍스  (0) 2012.09.04
3way hand shake  (0) 2012.08.13
라우팅  (0) 2012.08.13
OS의 종류와 차이점  (0) 2012.08.13