지금 뭐 개발하고 있는 것이 없어서 뭘 하지 생각하다가,

최근에 Deadlock에 대해 배우면서, “실제로는 이러한 방법 만으로는 부족하고 application 개발자의 추가적인 노력이 필요하다”라고 되어 있는데, 이 부분에 관심을 가지게 되어 추가로 찾아보게 되었습니다.

DeadLock?

일단 Deadlock에 대해 간단히 설명하면 다음 4가지 필요조건이 있는데, 이거는 복잡하니까 그냥 넘어가고

다음 그림과 같이, 여러 자원이 필요한 process들이, 이미 자기 자원을 하나 이상씩 차지하고 있으면서, 다른 자원을 요청하는 상황입니다

결국 프로세스가 끝나야 자원을 놓아주고(release하고) 다른 프로세스가 또 그 자원으로 일을 하는건데, 그걸 못하게 하니까 무한 대기의 지옥이 펼쳐지게 되는 현상입니다.

image.png

어릴 때 컴퓨터 성능 안좋았을 때 창 여러개 띄워 놓으면 갑자기 컴퓨터 먹통 나는 상황이라고 생각하면 됩니다.

걍 저 필요조건 확실히 막으면 되는 거 아니야?

운영 체제나 h/w 상에서 막는 방법이 있긴 하지만, 이 현상을 완전히 막는 방법을 쓴다면 효율성 역시 매우 낮다고 합니다.

그래서 결국 Application 개발자가 어느 정도 주의를 해야 한다고 합니다.

이에 대한 해결책은

  1. 자원(락) 획득 순서 정하기 (Lock Ordering)
  2. 타임아웃(Time-out) 사용하기
  3. 불필요한 락 회피하기
  4. 교착 상태를 최소화하는 자료구조/알고리즘 설계