서론

우리는 컴퓨터를 키면 제일 먼저 바탕 화면을 만납니다. 이때부터 우리는 운영체제라는 친구가 작동된다고 할 수 있죠. 사람들은 대부분 컴퓨터 내부 구조나 코딩 기술에 집중하곤 하지만 개인적으로 지금 운영체제를 공부하면서 느낀 점은 운영체제가 컴퓨터를 소프트웨어적으로 이해하는데 정말 중요한 기반을 다질 수 있을 것 같다는 느낌이 들었습니다.

운영체제에서 기본적으로 배우는 스레드와 프로세스의 개념, 상호배제와 세마포어, 메모리 관리와 프로세스 스케줄링, 마지막으로 멀티 프로세서에 관련된 내용들은 개발할때 반드시 알아야할 지식이라고 학부생인 저도 느끼고 있기 때문입니다.

오늘은 운영체제에서 다루는 여러 지식 중에서 스레드와 프로세스만큼 중요한 개념인 교착상태에 대해서 다뤄보려고 합니다.

교착상태(deadlock)

교착상태는 다음을 의미합니다.

자원을 가진 프로세스가 다른 프로세스가 소유한 자원을 할당 받기 위해서 기다리고 있지만 해당 자원을 계속 받지 못해서 영원히 기다리고 있는 상태.

쉽게 설명을 하자면 프로세스 A가 자원 B를 가진 상태프로세스 B가 가지고 있는 자원 A를 할당받기 위해서 기다리고 있습니다. 이런 상태라면 시간이 지나서 프로세스 B가 언젠가 자원 A를 모두 사용해서 결국 시스템에 반납하게 되므로 프로세스 A는 평화롭게 자원B를 가지고 작업을 시작할 수 있습니다.

하지만 여기서 프로세스 B가 A를 가진 상태프로세스 A가 가진 자원 B를 얻기 위해서 기다리고 있으면 어떻게 될까요? 여기서부터 문제가 시작됩니다. 각자의 프로세스가 서로가 이미 소유한 자원을 가지기 위해서 무작정 기다리고 있는 상태이지만 결코 서로가 소유한 자원을 놓지 않으려고 하는 이 상태가 바로 교착상태(deadlock)입니다.

교차로 문제(crossroad problem)

Untitled

교차로 문제는 교착 상태를 이해하는데 좋은 예제입니다. 저도 이 문제를 해결하는 것이 과제라서 밤낮을 새고 있습니다. 각 자동차는 직진을 하기 위해서는 교차로에 있는 자원을 점유해야 합니다. 하지만 각 자동차의 상황을 보면 1번 자동차는 2번 자동차가 차지하고 있는 구역이 진입 가능해야 직진할 수 있으며, 2번 자동차는 3번 자동차가 차지하고 있는 구역에 진입 가능해야 직진이 가능한 연쇄적인 자원 할당 요구 모습을 보여주고 있습니다. 이러한 상황을 보면서 교착 상태에 대해서 더 쉽게 이해할 수 있을 것이라고 생각합니다.

교착 상태의 발생 조건

교착 상태는 총 4가지 발생 조건이 모여서 필요충분조건을 만들고 있습니다. 이제는 이 내용에 대해서 한번 설명을 드릴까 합니다.

1. 상호 배제(mutual exclusion)

교착 상태가 발생하려면 공유 자원 사이에 상호 배제가 이루어져야 합니다. 그렇다면 상호 배제가 무엇일까요? 상호 배제는 운영체제가 공유 자원을 다룰 때 지켜야 할 규칙입니다.

다음을 생각해볼까요? 한 프로세스가 어떠한 데이터의 값을 변경해야 합니다. 프로세스가 데이터의 값을 변경하려고 할 때 다른 프로세스가 갑자기 끼어들어서 해당 데이터의 값을 변경하고 종료해버렸습니다. 그러면 원래 프로세스가 읽으려고 했던 데이터의 내용은 다른 프로세스에 의해서 변경된 상태입니다. 즉 무결성이 깨졌다고 할 수 있습니다.

이 예시에서 상호 배제라는 개념에서 알아야 할 중요 개념을 소개할 수 있겠습니다.

즉 상호 배제를 지킨다는 것은 하나의 임계구역에는 한 프로세스만이 접근할 수 있다고 생각하시면 될 것 같습니다.