Deadlock...

|

다음의 4가지 조건을 모두 만족해야만 deadlock이 발생합니다.

1) mutual exclusion
- 자원이 공유(동시진입)되지 않음
- 동시에 단 한개의 쓰레드(프로세스)만이 자원에 접근 가능함
2) hold and wait
- 한 쓰레드(프로세스)에서 동시에 두개의 자원을 가져야만, 처리가능한 연산
- 두개의 자원을 동시에 필요로 하는 연산처리
3) no preemption
- 일단 한개의 자원을 어떤 쓰레드(프로세스)가 강점하면, 그 누구도 뺏을 방법이 없음
4) circular wait
- 자원에 대해 대기 그래프를 

데드락이 발생하지 않게 하려면?
1~4 중 하나라도 가능하지 않게 하면됨

1) mutual exclusion
- 자원을 공유하게 만든다(완전! 재진입되게 만든다) 
- 실전에서는 아주 어려운 작업임(운영체제 만드는 수준의...)

2) hold and wait
- 동시에 한개 이상의 자원을 요구하지 못하게 한다.
- 데드락이 될지 모르는 모든 요청에 대해 reject한다.
- 모든 자원에 대한 모든 접근은 동시에 이뤄지게 한다.
- 현재 소유한 자원을 free한 이후에 동시에 다수개 자원을 요청하도록 한다.

3) no preemption
- 자원을 preemtable하게 한다
- 실전에서는 아주 어려운 작업임
- 역시 운영체제 제작하는 수준의 코드가 필요...

4) circular wait
- 자원에 대해 순차적으로 요청하게 만든다.

발생하기 전에 미연에 방지하는 것이 역시나, 가장 좋은 해결책이라고 생각됩니다.

데드락이 발생할 가능성은 다양하지만, "락걸고 죽는...."이라는
소위 락메카니즘에 의해 데드락이 발생한 경우가 아닌, 리소스 비반납이라는 
이상한(?) 경우에 해당한다면, bugiii님이 제시하신 언어수준의 scope guard를 사용하는것이 좋겠습니다.
음, 간단히 만드셔도 좋을듯하고, 아니면, smart pointer등을 공부하셔서 직접만드시는것도 방법이겠습니다.
C++의 경우 ZThread라는 프레임웍에서도 (http://zthread.sourceforge.net/) 좋은 메카니즘을 제공합니다.

그러나, 역시 항상 유의하면서 코딩하는게 좋겠지요?

- 필연적으로 락을 걸어야 하는 경우에는, critical section(lock~unlock사이의 코드)에서
는 위험한 코드를 기술하지 않는다.

Critical Section 내에서 피해야 좋은 코드들
- 쓰레드 또는 프로세스가 사망할 가능성이 있는 코드는 피한다.
- 위험한 길은 조심하다가 빠르게 지나가듯이, 빠르게 수행하도록 코드를 잘~ 보정한다.
- 무한히 다른 것(조건, 입력등등)을 기다리는 코드는 피한다.
- 락을 걸때는 아주 간단한 코드에 대해서 걸도록 유의한다.(함수등을 필할 수 있으면 아주 좋다)
- 락내에서 사용된 코드는 아주 간결하게 작성한다.
- 혹시, 쓰레드 또는 프로세스가 정상 또는 비정상 사망할 경우 소유한 자산(자원)은 반드시 반납하게 작성한다.
(C++의 smart pointer등 scope에 의한 guard 메카니즘처럼 프로그램 언어수준에서 자원반납에 대한 확실한 메카니즘을 제공하는 좋은 것들을 사용하는것이 이 경우에는 좋습니다.)





'개발/활용정보' 카테고리의 다른 글

blotware, crapware  (0) 2011.05.27
구글맵 api 를 이용한 map service  (0) 2011.05.20
디자인패턴  (0) 2011.05.06
C, C++ 스마트 포인터  (0) 2011.05.06
SubVersion + Trac + Apache --;  (0) 2011.04.13
And