[iOS CS Study] Deadlock(데드락, 교착상태)란?

Oxong·2021년 7월 14일
0

iOS CS Study

목록 보기
9/18
post-custom-banner

21.07.12

공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다.
참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다.
+ 틀린 부분, 수정해야 할 부분은 언제든지 피드백 주세요. 😊

                                                 by. ryalya




Deadlock이란?


데드락(Deadlock)이란 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태로, 교착 상태라고도 하며 한정된 자원을 여러 곳에서 사용하려고 할 때 발생한다.

(아래 그림의 Thread는 Process로 봐도 무방함)

쉽게 이해해보기 위해 자원이 한정되어있기 때문에 한 사람이 그 자원을 다 사용하고 줄 때 까지 기다려야 하는 상황이 있다고 가정하자.

나는 A를 가지고 있고, 상대방은 B를가지고 있다.

나는 A,B를 모두 사용해서 작업을 할 거지만 B를 사용한 후에 A를 사용하려고 상대방이 B를 줄 때까지 기다리고 있다.

그런데 상대방도 A,B를 모두 사용해서 작업을 하려는데, 상대방은 A를 사용한 후에 B를 사용하려고 기다리고 있는 것이다.

이런 상황에서 서로 먼저 줄 때까지 계속 기다리기만 한다면 서로의 작업은 처리되지 못한 채로 무한 대기에 빠지게 될 것이다.

이것을 데드락(Deadlock, 교착상태)라고 한다.

+) 시스템에서 교착상태는 프로세스가 요구하는 자원이 엉켜서 더 이상 작업을 더 실행할 수 없는 상태를 의미하기도 한다.



Deadlock 발생 상황


멀티 프로그래밍 환경에서 한정된 자원을 사용하려고 서로 경쟁하는 상황.

어떤 프로세스가 자원을 요청 했을 때, 그 자원을 사용할 수 없는 상황이 발생 → 프로세스가 대기 상태로 진입.

대기 상태로 들어간 프로세스들이 실행 상태로 변경 될 수 없을 때 이러한 상황을 교착 상태라 한다.



Deadlock 발생 조건

데드락은 한 시스템 내에서 다음의 네 가지 조건이 동시에 성립 할 때 발생한다.

즉 아래의 네 가지 조건 중 하나라도 성립하지 않거나 않도록 만든다면 교착 상태를 해결할 수 있다.

1. 상호 배제 (Mutual exclusion)

자원은 한 번에 한 프로세스만이 사용할 수 있어야 한다.

즉, 사용중인 자원을 다른 프로세스가 사용하려면 요청한 자원이 다 사용되고 난 후 해제될때까지 기다려야 한다.


2. 점유 대기 (Hold and wait)

최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 한다.


3. 비선점 (No preemption)

다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없다.


4. 순환 대기 (Circular wait)

대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다.

프로세스의 집합 {P0, P1, ,…Pn}에서 P0는 P1이 점유한 자원을 대기하고 P1은 P2가 점유한 자원을 대기하고 P2…Pn-1은 Pn이 점유한 자원을 대기하며 Pn은 P0가 점유한 자원을 요구해야 한다.

이는 프로세스가 여러개 있을때 자원의 점유와 요청의 관계가 순환되는 조건을 말한다.

프로세스 3개를 각각 p1, p2, p3라고 할때 p1이 p2의 자원을 요청하고, p2가 p3의 자원을 요청하고, p3가 p1의 자원을 요청하고 그 자원은 요청한 자원을 얻을 수 있을때까지 반환할 수 없다.

이 조건은 위의 세 조건이 만족이 되면 자연스레 만족된다.



Deadlock 해결

데드락을 해결하는 방법은 3가지가 있다.

1. 교착 상태 예방 및 회피

교착 상태가 되지 않도록 보장하기 위하여 교착 상태를 예방하거나 회피하는 프로토콜을 이용하는 방법

예방법

이 방법은 각각의 조건을 방지(부정)하여 데드락 발생 가능성을 차단하는 것이다.

1. 자원의 상호 배제 조건 방지

: 한 번에 여러 프로세스가 공유 자원을 사용할 수 있게 한다.
그러나 이 경우, 추후 동기화 관련 문제가 발생할 수 있다.

2. 점유 대기 조건 방지

: 프로세스 실행에 필요한 모든 자원을 한꺼번에 요구하고 허용할 때까지 작업을 보류해서, 나중에 또다른 자원을 점유하기 위한 대기 조건을 성립하지 않도록 한다.

3. 비선점 조건 방지

: 이미 다른 프로세스에게 할당된 자원이 선점권이 없다고 가정할 때, 높은 우선순위의 프로세스가 해당 자원을 선점할 수 있도록 한다.

4. 순환 대기 조건 방지

: 자원을 순환 형태로 대기하지 않도록 일정한 한 쪽 방향으로만 자원을 요구할 수 있도록 한다.


하지만 예방법(조건을 방지해서 데드락을 예방하는 방법)은 시스템의 처리량이나 효율성을 떨어트리는 단점이 발생할 수 있다.


회피법

데드락 회피법은 예방법보다는 조금 덜 제한적인 방법으로 예방법의 단점을 일부 해결할 수 있다.

회피법은 교착 상태가 발생하면 피해나가는 방법이다.

시스템의 프로세스들이 요청하는 모든 자원을, 데드락을 발생시키지 않으면서도 차례로 모두에게 할당해 줄 수 있다면 안정 상태(safe state)에 있다고 할 수 있다.

또한, 이처럼 특정한 순서로 프로세스들에게 자원을 할당, 실행 및 종료 등의 작업을 할 때 데드락이 발생하지 않는 순서를 찾을 수 있다면, 그것을 안전 순서(safe sequence)라고 한다.

반면 불안정 상태는 안정 상태가 아닌 상황으로 데드락 발생 가능성이 있는 상황이며, 교착 상태(데드락)는 불안정 상태일 때 발생할 수 있다.

불안정 상태는 교착 상태보다 좀 더 큰 집합이다.(즉, 교착 상태가 불안정 상태의 부분집합)

이처럼 회피 알고리즘은 자원을 할당한 후에도 시스템이 항상 Safe state에 있을 수 있도록 할당을 허용하자는 것이 기본 특징이다.

이러한 특징을 살린 알고리즘으로 유명한 것이 은행원 알고리즘이다.


은행원 알고리즘(Banker’s Algorithm)

E,J,Dijkstra가 제안한 기법으로, 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는 데서 유래한 기법이다.

프로세스가 자원을 요구할 때 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지를 사전에 검사하여 교착 상태를 회피하는 기법

안정 상태에 있으면 자원을 할당하고, 그렇지 않으면 다른 프로세스들이 자원을 해지할 때까지 대기해야 한다.



2. 교착 상태 탐지 및 회복

시스템이 데드락 예방법이나 회피법을 사용하지 않았을 때, 데드락이 발생할 수 있다.

이 방법은 일단 데드락을 허용하고, 회복하기 위해 데드락을 탐지하고, 회복하는 알고리즘을 사용한다.

탐지 기법

Allocation, Request, Available 등으로 시스템에 데드락이 발생했는지 여부를 탐색한다.

즉, 은행원 알고리즘에서 했던 방식과 유사하게 현재 시스템의 자원 할당 상태를 가지고 파악해야 한다.

이 외에도 자원 할당 그래프를 통해 탐지하는 방법이 있다.


자원 할당 그래프 (++ 내용 추가 필요)


회복 기법

데드락을 탐지 기법을 통해 발견했다면, 순환 대기에서 벗어나 데드락으로부터 회복하기 위한 방법을 사용한다.

이 회복기법에는 교착 상태를 일으킨 프로세스를 종료하거나, 할당된 자원을 해제하는 방법이 있다.

  • 프로세스를 1개 이상 중단시키기
    교착 상태에 빠진 모든 프로세스를 중단시키는 방법
    → 계속 연산중이던 프로세스들도 모두 일시에 중단되어 부분 결과가 폐기될 수 있는 부작용이 발생할 수 있음

  • 프로세스를 하나씩 중단 시킬 때마다 탐지 알고리즘으로 데드락을 탐지하면서 회복시키는 방법
    → 매번 탐지 알고리즘을 호출 및 수행해야 하므로 부담이 될 수 있음

  • 자원 선점하기
    → 프로세스에 할당된 자원을 선점해서, 교착 상태를 해결할 때까지 그 자원을 다른 프로세스에 할당해서 해당 프로세스를 일시정지 시키는 방법
    → 우선 순위가 낮은 프로세스, 수행된 횟수가 적은 프로세스 등을 위주로 프로세스의 자원을 선점하는 방법



3. 교착 상태 무시

교착 상태가 정말 드물게 발생하는 경우, 교착 상태 예방 또는 탐지와 관련되어 지속된 오버헤드 및 성능 저하를 발생 시키는 것보다 교착 상태가 발생하도록 하고 필요에 따라 재부팅하는 것이 더 나을 수 있다.
(Unix 및 window를 포함한 대부분의 운영체제가 사용하는 방법)

즉, 해결할 때 드는 오버헤드로 인한 성능저하가 방치할 때의 성능저하보다 큰 경우 그냥 무시하는 것을 말한다.



Reference

[운영체제] 데드락, 교착상태 해결 (Dead lock)
[운영체제/리눅스] 교착상태(DEADLOCK)의 원인과 쓰레드를 통한 교착상태 발생 예제와 회피방법(PTHREAD_MUTEX_TIMED_LOCK)
[운영체제] 데드락(Deadlock, 교착 상태)이란?

++ 참고해서 추가해야하는 내용
Deadlock 예제

post-custom-banner

0개의 댓글