교착 상태
교착 상태란
교착 상태(deadlock)
두 개 이상 프로세스가 각자 자원을 점유하고, 서로의 자원을 요구할 때에 더 이상 프로세스 진행이 불가해진다.
즉, 서로의 종료만을 기다리며 진행이 멈춰버릴 때 교착 상태가 발생한다.
식사하는 철학자 문제(dining philosophers problem)
교착상태를 잘 설명하는 예시
철학자는 프로세스 또는 쓰레드, 포크는 자원, 생각하는 행위는 자원을 기다리는 것으로 이해할 수 있다.
포크는 한 번에 한 스레드에만 접근할 수 있으니 임계 구역으로 생각할 수 있다.
식사하는 철학자 문제 과정
모든 철학자는 원형 테이블에 앉아 있다.
모든 철학자는 양손에 포크를 들었을 때 식사를 시작할 수 있다.
철학자는 생각을 끝마치면 왼쪽 포크를 먼저 집어들고, 이후 오른쪽 포크를 집어든다.
식사를 마치면 오른쪽 포크를 내려놓고, 이후에 왼쪽 포크를 내려놓는다.
이를 반복한다.
식사하는 철학자 문제 발생 이유
한 두명 철학자가 식사를 하면 문제가 없다.
그러나 모든 철학자가 동시에 포크를 집어 들면 모든 철학자는 식사를 할 수 없다.
즉 모두 생각만 하게되고, 다른 철학자의 식사가 끝나기만을 기다린다.
교착 상태의 발생 예시
뮤텍스 락에서도 교착상태는 발생할 수 있다.
각 프로세스가 lock 1과 2를 잠구고 서로의 lock이 풀리기 만을 기다리면 교착 상태가 발생한다.
교착 상태의 해결
교착 상태 발생 상황을 정확히 표현할 수 있어야 한다.
교착 상태가 일어나는 근본적 원인을 알아야 한다.
자원 할당 그래프(resource-allocation graph)
각 프로세스가 어떤 자원을 사용하고, 어떤 자원을 기다리는지 간단히 표현한 그래프
교착 상태는 자원 할당 그래프를 통해 단순히 표현될 수 있다.
자원 할당 그래프 작성 규칙
1. 프로세스는 원으로, 자원은 사각형으로 표현한다.
2. 사용할 수 있는 자원 개수는 자원 사각형 내 점으로 표현한다.
3. 프로세스가 어떤 자원을 사용 중이라면 자원에서 프로세스를 향해 화살표 표시한다.
프로세스가 자원 사용을 종료하면 화살표는 삭제된다.
4. 프로세스가 어떤 자원을 기다리면 프로세스에서 자원으로 화살표를 표시한다.
자원 할당 그래프 예시
아래 사진은 다음을 의미한다.
SSD는 자원 개수가 3개, CPU는 2개, 프린터는 1개이다.
프로세스 A는 SSD를 사용한다.
프로세스 B와 C는 CPU를 사용하고, 프로세스 F는 CPU 사용을 요청한다.
프로세스 D는 프린터를 사용하고, 프로세스 E는 프린터 사용을 요청한다.
식사하는 철학자 문제는 아래와 같이 표현할 수 있다.
교착상태는 아래와 같이 표현된다.
즉, 교착 상태는 자원 할당 그래프가 원의 형태를 띌 때 발생한다.
교착 상태 발생 조건
교착 상태 발생 조건은 다음 네가지가 있다.
상호 배제
점유와 대기
비선점
원형 대기
조건들이 모두 만족할 때 교착 상태 발생 가능성이 생긴다. 하나라도 만족하지 않으면 교착상태는 발생하지 않는다.
1. 상호 배제(mutual exclusion)
한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상황
자원 할당량을 프로세스가 모두 사용하고, 작업이 끝나지 않으면 교착 상태가 발생할 수 있다.
2. 점유와 대기(hold and wait)
프로세스가 자원을 할당 받은 상태에서 다른 자원의 할당을 기다리는 상태
다른 프로세스의 작업이 끝나지 않으면 자원을 무한히 기다리게 된다.
3. 비선점(nonpreemptive)
비선점 자원: 자원을 이용하는 프로세스가 작업이 끝나야만 이용할 수 있는 자원
어떤 프로세스도 다른 프로세스에 할당된 자원을 뺏지 못하면 교착상태가 발생할 수 있다.
4. 원형 대기(circular wait)
프로세스들이 원형 형태로 자원을 대기하는 상태
자원 할당 그래프가 원 형태로 그려지면 교착상태가 발생할 수 있다.
13-2. 교착 상태 해결 방법
교착 상태 해결 방법
1. 예방
교착 상태 발생 조건에 부합하지 않게 자원을 분배하는 방법
2. 회피
교착 상태가 발생치 않도록 자원을 조금씩 할당하며, 교착 상태 위험이 있으면 자원을 할당하지 않는 방법
3. 검출 후 회복
자원을 제약없이 할당하다가 교착 상태가 검출되면 이를 회복하는 방법
교착 상태 예방
교착 상태 발생 조건 네 가지 중 하나를 충족하지 못하게 하는 방법
1. 자원의 상호 배제 예방
모든 자원을 공유 가능하게 만든다.
이론적으로 교착 상태를 없앨 수 있으나, 현실적으로는 모든 자원의 상호 배제를 없애기 어려워 실제 적용은 힘들다.
2. 점유와 대기 예방
특정 프로세스에 자원을 모두 할당하거나 아예 할당하지 않는 방식으로 자원을 배분한다.
한계\
자원 활용률이 낮아질 우려가 있다. 당장 자원이 필요해도 기다리는 프로세스와 사용하지 않는 자원을 오래동안 할당받는 프로세스가 생긴다.
많은 자원을 사용하는 프로세스가 불리해진다. 동시에 자원을 사용할 타이밍을 확보하기 어렵기 때문이다.
많은 자원을 필요로 하는 프로세스는 무한정 기다리는 기아현상이 발생할 가능성이 크다.
3. 비선점 조건 예방
자원을 이용 중인 프로세스로 부터 해당 자원을 빼앗는다.
선점하여 사용할 수 있는 일부 자원에 효과적이다.
한계\
모든 자원이 선점 가능한 것은 아니다. 한 프로세스 작업이 끝날 때까지 다른 프로세스가 기다려야 하는 자원도 존재한다.
모든 자원을 빼앗을 수 없기 때문에 범용성이 떨어지는 방법이다.
4. 원형 대기 조건 예방
모든 자원에 번호를 붙이고 오름차순으로 자원을 할당하면 원형대기는 발생하지 않는다.
즉, 원형 상황이 되는 것을 방지한다. 현실적이고 실용적인 방법이다.
한계\
컴퓨터 시스템 내 모든 자원에 번호를 붙이기 어렵다.
각 자원에 어떤 번호가 붙는지에 따라 특정 자원 활용률이 떨어질 수 있다.
예방 방식의 특징과 한계
예방 방식은 교착 상태가 발생하지 않음을 보장할 수 있다.
하지만 여러 한계점들과 부작용이 존재한다.
교착 상태 회피
교착 상태 발생이 무분별한 자원 할당으로 인해 발생한다고 간주한다.
따라서 회피는 교착 상태가 발생하지 않을 정도로 조절해서 자원을 할당하는 방식으로 교착 상태를 피한다.
안전 상태와 불안전 상태
1. 안전 상태(safe state)
교착 상태가 발생하지 않게 모든 프로세스가 정상적으로 자원 할당 및 종료 될 수 있는 상태
안전 순서열이 있는 상태는 안전 상태이다. 안전 순서열대로 프로세스에 자원을 배분시 교착 상태는 발생하지 않는다.
안전 순서열(safe sequence): 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
2. 불안전 상태(unsafe state)
교착 상태가 발생할 수도 있는 상황
안전 순서열이 없는 상황
불안전 상태에 시스템이 놓이면 교착 상태가 발생할 위험이 생긴다.
운영체제의 교착 상태 회피
운영 체제는 불안전 상태가 애초에 되지 않게끔 자원을 할당한다.
시스템 상태가 안전 상태에서 안전 상태로 움직이는 경우에만 자원을 할당한다.
즉, 회피 방식은 항시 안전 상태를 유지하도록 자원을 할당하는 방식이다.
이를 위해 각 프로세스의 최대 요구량을 고려해서 자원을 할당한다. 최대 요구량이 현재 할당 가능 자원보다 큰 경우, 아예 자원 할당을 하지 않는다.
교착 상태 검출 후 회복
교착 상태 발생을 확인하고 사후에 조치하는 방식이다.
운영체제는 프로세스들이 자원을 요구할 때마다 모두 할당하며, 교착 상태 발생 여부를 주기적으로 검사한다.
교착 상태가 검출되면 2가지 방식을 통해 회복한다.
교착 상태 회복 방식
1. 선점을 통한 회복
교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식이다.
다른 프로세스로부터 자원을 빼앗고 한 프로세스에 자원을 모두 몰빵해서 프로세스 진행을 완료한다.
2. 프로세스 강제 종료를 통한 회복
가장 단순하고 확실한 방식이다.
(1) 교착 상태에 놓인 프로세스를 모두 종료한다.
장점: 교착 상태를 해결할 수 있는 가장 확실한 방법
단점: 많은 프로세스들의 작업 내역을 잃게 된다.
(2) 한 프로세스씩 종료할 수 있다.
장점: 작업 내역을 잃는 프로세스를 최대한 줄일 수 있다.
단점: 교착 상태가 없어졌는지 확인하는 과정에서 오버헤드를 야기한다.
교착 상태 무시
타조 알고리즘(ostrich algorithm): 드물게 발생하는 잠재적 문제를 무시로 대처하는 방법이다.
문제 발생 빈도나 심각성에 따라 최대 효율을 추구하는 경우는 이 방식이 적합할 때도 많다.
Last updated