서론: 우주선이 응답하지 않을 때
컴퓨터를 쓰다가 갑자기 화면이 멈추고 마우스조차 움직이지 않는 '프리즈(Freeze)' 현상을 겪어보셨을 겁니다. NASA 관제 센터에서 가장 공포스러운 순간이 바로 탐사 로봇이 이런 상태에 빠져 아무런 명령도 듣지 않을 때입니다.
이 현상의 주된 원인 중 하나가 바로 '데드락(Deadlock)', 우리말로는 '교착 상태'입니다. 지난 시간에 배운 멀티 스레드들이 서로 자원을 차지하겠다고 욕심을 부리다, 결국 아무도 자원을 쓰지 못하고 영원히 대기하는 최악의 상황이죠.
오늘 15편에서는 꽉 막힌 4거리 교차로처럼 오도가도 못하게 된 시스템의 비극과, 이를 해결하기 위한 공학적 고민을 다뤄보겠습니다.
본론 1: 네 대의 차가 멈춘 교차로
데드락을 가장 쉽게 이해하는 방법은 신호등 없는 4거리 교차로를 상상하는 것입니다.
- 4방향에서 차 4대가 동시에 진입했습니다.
- 교통 법규상 "내 오른쪽 차가 지나가면 내가 간다"는 규칙이 있다고 칩시다.
- 북쪽 차는 동쪽 차를 기다리고, 동쪽은 남쪽을, 남쪽은 서쪽을, 서쪽은 다시 북쪽 차를 기다립니다.
결과는? 아무도 움직이지 못합니다. 누구 한 명이 양보하거나 후진하지 않는 이상, 이 상태는 영원히 지속됩니다. 컴퓨터 내부에서도 스레드 A가 자원 1을 쥔 채 자원 2를 달라고 하고, 스레드 B는 자원 2를 쥔 채 자원 1을 달라고 할 때 정확히 똑같은 현상이 발생합니다.
본론 2: 식사하는 철학자 문제 (Dining Philosophers)
컴퓨터 과학의 전설적인 난제, '식사하는 철학자 문제'를 들어보셨나요? 데드락을 설명하는 가장 유명한 모델입니다.
- 원탁에 5명의 철학자가 앉아 있고, 접시 사이사이에 포크가 하나씩(총 5개) 있습니다.
- 스파게티를 먹으려면 반드시 양손에 포크(왼쪽, 오른쪽)를 쥐어야 합니다.
- 만약 5명의 철학자가 동시에 자기 왼쪽 포크를 집어 들면 어떻게 될까요?
- 모든 철학자가 왼쪽 포크는 쥐었지만, 오른쪽 포크는 옆 사람이 가져가 버려서 없습니다.
- 모두가 오른쪽 포크가 생기길 하염없이 기다리다 결국 굶어 죽습니다.
이것이 바로 운영체제에서 프로세스들이 자원을 공유하다가 발생하는 순환 대기(Circular Wait)의 공포입니다.
본론 3: 해결책은 '교통정리'뿐
NASA 엔지니어들은 이 데드락을 피하기 위해 시스템 설계 단계에서부터 엄격한 규칙을 적용합니다.
- 자원 순서 강제: 모든 포크(자원)에 번호를 매기고, 반드시 "낮은 번호부터 집어야 한다"는 규칙을 만듭니다. 이렇게 하면 순환 고리가 끊어져 데드락이 발생하지 않습니다.
- 타임아웃(Timeout): "3초 동안 기다려도 자원을 못 얻으면, 쥐고 있던 자원을 내려놓고 포기한다"는 규칙을 넣습니다. (철학자가 포크를 내려놓게 만듭니다.)
결론: 양보가 시스템을 살린다
데드락은 욕심(경쟁) 때문에 발생합니다. 서로 자원을 독점하려고만 할 때 시스템은 멈춰버립니다. 프로그래밍에서도 적절한 양보(Yield)와 순서(Ordering)가 있어야만 전체 시스템이 원활하게 돌아갑니다.
이것으로 시스템 보안과 운영체제를 다룬 [Part 3]가 마무리되었습니다.
이제 20부작의 마지막 챕터, [Part 4. 컴퓨터 과학의 미래와 철학 (확장편)]으로 넘어갑니다. 16편에서는 "어떤 코드가 좋은 코드인가?"를 수학적으로 증명하는 [알고리즘의 효율성: Big-O 표기법]에 대해 NASA 과학자의 쉬운 비유로 설명해 드리겠습니다.