Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

deadlock

deadlock는 교착상태라고 한다. 프로세스 A가 자원 S1을 가지고 있으면서 자원 S2를 기다리고 있는데, 프로세스 B가 자원 S2를 가지고 있으면서 자원 S1을 기다리는 상태가 대표적인 교착상태의 예이다. 이 경우 두개의 프로세스는 결코 얻을 수 없는 자원을 얻기 위해서 영원히 기다리게 될 것이고, 프로그램은 아무런 일도 못하게 될 것이다.

deadlock 는 DB(:12)를 이용해서 좀더 쉽게 설명될 수 있다.
  1. 프로세스 A가 테이블 T1에 lock을 걸고 테이블 T2의 데이터를 변경하려고 한다.
  2. 프로세스 B가 T2에 lock를 걸고 테이블 T1의 데이터를 변경하려고 한다.
  3. 서로가 교차해서 상대방의 자원을 요청하는데, 모두 lock이 걸려있기 때문에 영원히 대기한다.
프로그램의 제작에 있어서 deadlock는 세마포어(:12), 파일잠금(:12), mutex(:12) 등과 같은 자원접근을 제어해야 하는 경우에 주로 발생한다.

deadlock은 다음과 같은 경우에 발생한다.
  1. mutual exclusion : 자원을 단 하나의 프로세스만이 가질 수 있다. 이 자원을 가질려는 프로세스는 해당 자원이 해제될때까지 기다려야 한다.
  2. hold and wait : 자기가 자원을 가지고 있으면서 다른 자원을 가질려고 한다. 위의 DB 에서의 deadlock이 그 예이다.
  3. no preemption : 다른 프로세스가 강제로 자원을 빼앗을 수 없을 경우.
  4. circular wait : a->b->c->a 의 식으로 환형으로 다음자원을 요청하는 경우.
물론 위의 경우가 포함되도록 프로그래밍 되었다고 해서, 반드시 deadlock이 발생하는 것은 아니다. 위의 상황은 자원접근제어를 할경우 쉽게 만들어질 수 있다. 어디까지나 위의 상황에 있어서 잘못 프로그래밍 했을 때 발생을 한다. 프로그램이 위의 상황을 만들때 deadlock이 발생할 수 있는지 주의해서 프로그래밍을 해야 한다고 보면 된다.