서론
우리는 컴퓨터를 키면 제일 먼저 바탕 화면을 만납니다. 이때부터 우리는 운영체제라는 친구가 작동된다고 할 수 있죠. 사람들은 대부분 컴퓨터 내부 구조나 코딩 기술에 집중하곤 하지만 개인적으로 지금 운영체제를 공부하면서 느낀 점은 운영체제가 컴퓨터를 소프트웨어적으로 이해하는데 정말 중요한 기반을 다질 수 있을 것 같다는 느낌이 들었습니다.
운영체제에서 기본적으로 배우는 스레드와 프로세스의 개념, 상호배제와 세마포어, 메모리 관리와 프로세스 스케줄링, 마지막으로 멀티 프로세서에 관련된 내용들은 개발할때 반드시 알아야할 지식이라고 학부생인 저도 느끼고 있기 때문입니다.
오늘은 운영체제에서 다루는 여러 지식 중에서 스레드와 프로세스만큼 중요한 개념인 교착상태에 대해서 다뤄보려고 합니다.
교착상태(deadlock)
교착상태는 다음을 의미합니다.
자원을 가진 프로세스가 다른 프로세스가 소유한 자원을 할당 받기 위해서 기다리고 있지만 해당 자원을 계속 받지 못해서 영원히 기다리고 있는 상태.
쉽게 설명을 하자면 프로세스 A가 자원 B를 가진 상태로 프로세스 B가 가지고 있는 자원 A를 할당받기 위해서 기다리고 있습니다. 이런 상태라면 시간이 지나서 프로세스 B가 언젠가 자원 A를 모두 사용해서 결국 시스템에 반납하게 되므로 프로세스 A는 평화롭게 자원B를 가지고 작업을 시작할 수 있습니다.
하지만 여기서 프로세스 B가 A를 가진 상태로 프로세스 A가 가진 자원 B를 얻기 위해서 기다리고 있으면 어떻게 될까요? 여기서부터 문제가 시작됩니다. 각자의 프로세스가 서로가 이미 소유한 자원을 가지기 위해서 무작정 기다리고 있는 상태이지만 결코 서로가 소유한 자원을 놓지 않으려고 하는 이 상태가 바로 교착상태(deadlock)입니다.
교차로 문제(crossroad problem)
교차로 문제는 교착 상태를 이해하는데 좋은 예제입니다. 저도 이 문제를 해결하는 것이 과제라서 밤낮을 새고 있습니다. 각 자동차는 직진을 하기 위해서는 교차로에 있는 자원을 점유해야 합니다. 하지만 각 자동차의 상황을 보면 1번 자동차는 2번 자동차가 차지하고 있는 구역이 진입 가능해야 직진할 수 있으며, 2번 자동차는 3번 자동차가 차지하고 있는 구역에 진입 가능해야 직진이 가능한 연쇄적인 자원 할당 요구 모습을 보여주고 있습니다. 이러한 상황을 보면서 교착 상태에 대해서 더 쉽게 이해할 수 있을 것이라고 생각합니다.
교착 상태의 발생 조건
교착 상태는 총 4가지 발생 조건이 모여서 필요충분조건을 만들고 있습니다. 이제는 이 내용에 대해서 한번 설명을 드릴까 합니다.
1. 상호 배제(mutual exclusion)
교착 상태가 발생하려면 공유 자원 사이에 상호 배제가 이루어져야 합니다. 그렇다면 상호 배제가 무엇일까요? 상호 배제는 운영체제가 공유 자원을 다룰 때 지켜야 할 규칙입니다.
다음을 생각해볼까요? 한 프로세스가 어떠한 데이터의 값을 변경해야 합니다. 프로세스가 데이터의 값을 변경하려고 할 때 다른 프로세스가 갑자기 끼어들어서 해당 데이터의 값을 변경하고 종료해버렸습니다. 그러면 원래 프로세스가 읽으려고 했던 데이터의 내용은 다른 프로세스에 의해서 변경된 상태입니다. 즉 무결성이 깨졌다고 할 수 있습니다.
이 예시에서 상호 배제라는 개념에서 알아야 할 중요 개념을 소개할 수 있겠습니다.
•
임계 구역(critical section)
데이터 무결성을 지켜야 하는 코드가 포함된 부분. 즉 이 구역에는 하나의 프로세스만 입장이 허가된다. 한 임계 구역에 여러 프로세스가 진입하면 상호 배제가 지켜지지 않았다고 할 수 있습니다.
즉 상호 배제를 지킨다는 것은 하나의 임계구역에는 한 프로세스만이 접근할 수 있다고 생각하시면 될 것 같습니다.
2. 점유와 대기(hold & wait)
교착 상태가 발생하기 위한 두 번째 조건은 점유와 대기입니다. 이 조건은 간단하게 설명할 수 있는데, 이미 자원을 가진 프로세스가 다른 자원을 얻기 위해서 대기를 하는 상황을 말합니다.
3. 비 선점(nopreemption)
교착 상태가 발생하기 위한 세 번째 조건은 비 선점입니다. 선점은 하나의 프로세스가 자원을 사용하고 있는데, 운영체제가 개입해서 프로세스가 사용하고 있는 자원을 강제로 뺏어서 다른 프로세스에 할당하는 것을 말합니다.
4. 환형 대기(circular wait)
교착 상태가 발생하기 위한 마지막 조건은 환형 대기입니다. 이 조건은 프로세스 집합에서 각 프로세스가 상대방이 가지고 있는 자원을 원하는데 그 부분이 마치 원형을 이루는 것과 같은 상태를 말합니다. 이 개념은 그림으로 보면 훨씬 이해가 쉬울것 같네요
결론
이러한 4개의 조건에 대해서 더 생각할 부분이 있습니다.
사실 4번 환형대기 같은 경우에는 1번, 2번, 3번 조건을 모두 만족할 때 생기는 조건입니다. 즉 1번 2번 3번중 어느 하나라도 만족하지 않으면 4번은 생겨나지 않습니다. 하지만 1번 2번 3번이 만족되어도 교착상태가 반드시 일어난다고는 할 수 없습니다. 4번 조건이 있어야 비로소 교착상태가 발생하게 되는것이죠. 즉 1번, 2번, 3번 조건은 사실 교착상태가 일어나기 위한 필요 조건이고, 4번 조건이 교착상태가 일어나기위한 충분조건이라고 할 수 있습니다.
이런 개념은 놓치기 쉬운데, 구분해서 알아둔다면 운영체제의 기본 개념인 상호배제에 대해서 도움이 될 수 있을 것이라고 생각합니다. 감사합니다.!!