본문 바로가기

Programming/기초

데드락

출처 : http://includestdio.tistory.com/12

출처 : http://webie.tistory.com/99

출처 : http://barunmo.blogspot.kr/2013/06/deadlock.html


프로세서1이 리소스1을 상용중 리소스1은 락이걸린 상태

프로세서2이 리소스2을 상용중 리소스2은 락이걸린 상태

프로세서1이 리소스2을 사용요청함 웨이팅중

프로세서2이 리소스1을 사용요청함 웨이팅중

두개의 프로세서가 각각 대기상태에 놓이게된다 어느 하나가 먼저 풀어줘야 대드락이 풀린다


데드락의 발생 조건

1. 뮤텍스(Mutaual Exclusion, 자원에 대한 동시접금 불가)

한번에 여러 프로세서(혹은 쓰레드)가 한 자원에 접근하지 못하도록 막는다.

내가 쓰고있는 동안은 남이 못쓴다는 애기다.

만약 동시에 자원 접근이 가능하다면 애초에 다른프로세서가 다 쓰길 기다릴 필요가 없겠지?라고 이해하면 된다

2. Hold and Wait(점유하고 기다리기)

자원을 가지고 있는 상태에서 다른 프로세서가 쓰는 자원(변수 같은 것)을 반납하길 기다리는 상태다.

3. No Preemption(자원 뺏어오지 못함)

다른 프로세서가 이미 점유한 자원을 강제로 뺏어오지 못함을 말한다.

4. Circular Wait(순환 형태로 대기함)

프로세서가 뭐가를 하려고 다른 프로세서를 기다리고 있고 그 프로세서는 또 다른걸 기다리고 이렇게 쭉 추적하다보니 마지막에 가선 결국

내가 나오는 상환

결국 내가 일을 하려고 보니까 내가 일을 끝마쳐야만 수행이 가능하다는 모순적인 상환


데드락 해결 방법

데드락의 회피(Avoidance)

교착상태의 원칙적인 발생 가능성(조건)은 그냥 냅두고, 발생을 막는 알고리즘을 적용해서 해결하는 방법.

은행원 알고리즘(프로세스가 자원을 요구하는 시점에 자원을 할당해도 안전한지를 검사하여 데드락을 막는 방법)

자원할당 그래프 알고리즘(아직 이건 모름. 추후 찾아볼 예정)


데드락의 탐지(Detection)와 회복(Recovery)

교착상태가 발생하는 것을 아예 막지조차 않음. 발생하면 그때서야 해결하겠다는 방법.


데드락 무시

거의 무시해도 좋을 확률로 데드락이 발생한다고 판단되면 그냥 무시한다.

왜냐면 데드락 문제는 해결하려면 성능상 손해를 봐야 하기 때문.

안정성과 성능을 고려해서 데드락 문제를 해결할지 말지를 정하자.

데드락은 자주 발생하지 않는 현상이며 위에 언급한 데드락 예방, 회피, 탐지, 회복 등의 방법은 비용이 많이 드는 행위이다

대부분의 운영체제가 이방법이라고 알고 있다.


게임에서 싱글톤을 쓰게된다면 쉽세 대드락에 빠질수 있게된다.

싱글톤이 공유자원이라  이 싱글톤에 값을 쓰거나 읽기 위해 잠금을 사용하는 스레드들이 경쟁하기 때문이다

'Programming > 기초' 카테고리의 다른 글

라이브러리 프레임워크 차이?  (0) 2018.05.26
시스템 메모리 구조  (0) 2018.05.26
메모리 침범 누수  (0) 2018.05.26
메모리 할당을 몼하는 상황  (0) 2018.05.26
QuickSort  (0) 2018.05.26
문자열 비교  (0) 2018.05.26
단순연결리스트  (0) 2018.05.26
문자열 뒤집기  (0) 2018.05.26