-
교착 상태란 무엇인가CS지식/운영체제 2021. 6. 9. 22:31
교착 상태는 시스템 내에서 2개 이상의 프로세스가 다른 프로세스의 작업이 끝나기만 기다리며 자신의 작업을 더 이상 진행하지 못하는 상태를 말한다.
교착 상태가 어떻게 보면 프로세스가 작업을 진행하지 못한다는 면에서 Starvation과 비슷해 보일 수 있다.
하지만, Starvation은 운영체제의 정책에 의해 특정 프로세스가 작업을 진행하지 못하는 것이고
교착 상태는 프로세스들이 작업을 진행하다가 자연스럽게 발생하는 현상이다.
그래서 Starvation은 발생하지 않도록 새로운 정책을 추가해서 해결할 수 있지만
교착 상태는 운영체제가 상황을 감시하다가 교착 상태가 발생하면 강압적으로 해결해야한다.
교착 상태가 발생할 수 있는 여러 경우가 있는데 그 중 시스템 자원, 공유 변수, 응용 프로그램을 사용할 때 발생하는 경우를 알아보자.
먼저, 공유할 수 없는 시스템 자원을 사용할 때 발생하는 교착 상태이다.
예를 들어 임계구역으로 보호되는 프린터, 스캐너 등은 공유하여 사용할 수 없는 시스템 자원으로 하나의 프로세스가 할당받으면 다른 프로세스가 접근할 수 없다.
이렇게 프로세스 A가 시스템 자원을 할당받고 또 다른 프로세스 B가 해당 시스템 자원을 할당받아야만 작업을 진행할 수 있다면 교착 상태가 발생하는 것이다.
다음으로 공유 변수를 사용할 때 발생하는 교착 상태이다.
공유 변수를 접근하면서 임계구역 문제를 해결하기 위해 코드를 통해 조작할 수 있다.
예를 들어, 공유 변수에 접근하기 위해서는 lock이 false인 상태여야만하고 공유 변수에 프로세스가 접근했다면 lock을 true로 바꾸어 임계구역이 발생하지 않도록 다른 프로세스의 접근을 막고 작업을 마친 후 다시 lock을 false로 바꾸어 다른 프로세가 접근할 수 있도록 해준다.
// 공유변수 임계구역을 해결하기 위한 코드 // 프로세스 A가 공유변수를 접근한 경우 lock = true; // false인 lock을 확인한 후 접근이 가능하여 lock을 true로 바꿈. while(lock==true); //임계구역 . . . lock = false; // 작업을 마치고 lock을 fasle로 바꾸어 다른 프로세스가 접근할 수 있도록 함.
그러면 어떠한 경우에 교착상태가 발생할까?
임계구역 발생을 막기 위해 2개의 공유변수(A, B)에 위와 같은 코딩이 되어 있다고 생각해보자.
먼저, 프로세스 1이 공유변수 A에 접근하여 해당 lock을 true상태로 바꾸었다.
그리고 프로세스 2가 공유변수 B에 접근하여 해당 lock을 true상태로 바꾸었다.
이후에 프로세스 1은 작업을 하기 위해 공유변수 B에 접근해야하고 프로세스 2는 공유변수 A에 접근해야 했다.
하지만, 프로세스 2가 공유변수 B를 접근 중이여서 프로세스 1은 lock이 false가 될 때까지 기다리고 프로세스 2는 공유변수 A의 lock이 false가 될 때까지 기다리는 상태가 되어 서로가 자신의 공유 변수를 가지고 있으면서 내어놓지 않아 교착 상태가 발생한다.
마지막으로 응용 프로그램을 사용할 때 발생하는 교착상태이다.
데이터베이스와 같은 응용 프로그램을 사용할 때 교착 상태가 발생할 수 있다. 데이터베이스에 저장된 데이터는 일관성을 유지해야하기에 하나의 프로세스가 접근하여 작업을 진행 중이면 lock을 건다.
이렇게 되면, 또 다른 프로세스가 해당 데이터에 접근해야만한다면 대기 상태가 되어 교착 상태가 발생한다.
이러한 교착 상태가 발생하는 데에는 정해진 조건을 만족해야한다.
상호 배제, 비선점, 점유와 대기, 원형 대기 4가지 조건을 모두 만족해야만 교착 상태가 발생하고 이를 교착 상태 필요조건이라 한다.
이 4가지 중 하나라도 만족하지 못한다면 교착 상태를 발생하지 않는다.
다르게 생각하면 이 4가지중 하나라도 만족하지 못하도록 시스템적으로 예방한다면 교착 상태가 일어나지 않을 수 있다는 것이다.
그러면 4 가지 필요조건이 무엇을 말하는지 알아보자.
1) 상호 배제(mutual exclusion)
상호 배제는 하나의 프로세스가 사용 중인 자원은 다른 프로세스가 접근할 수 없는 즉, 공유할 수 없는 자원이어야한다느 것이다. 이러한 자원을 배타적인 자원이라고도 하는데 배타적인 자원을 사용하게 되면 교착 상태가 발생할 수 있다.
2) 비선점(non-preemption)
비선점은 하나의 프로세스가 사용 중인 자원을 다른 프로세스가 중간에 빼앗아올 수 없는 자원이어야한다.
3) 점유와 대기(hold and wait)
점유와 대기는 프로세스가 하나의 자원을 할당받은 상태에서 또 다른 자원을 기다리는 상태를 말한다.
4) 원형 대기(circular wait)
원형 대기는 점유와 대기를 하고 있는 프로세스들 간의 관계가 원 모형으로 이루어져야하는 것을 말한다.
즉, loop를 형성하고 있어야한다는 것이다.
점유와 대기만 한다고 해서 교착 상태가 빠지는 것이 아니라 점유와 대기를 하고 있는 프로세스들끼리 loop를 형성하여 서로 양보하지 않는 상태여야 교착 상태가 발생한다.
'CS지식 > 운영체제' 카테고리의 다른 글
컴파일러와 인터프리터는 무엇인가 (0) 2021.06.15 메모리 주소란 무엇인가 (0) 2021.06.12 프로세스 간 통신(IPC)란 무엇인가 (0) 2021.06.06 CPU 스케줄러란 무엇인가 (0) 2021.06.03 스레드란 무엇인가(공룡책에서 귀여운 곰책으로 변경) (0) 2021.05.31