본문 바로가기

이것저것 스터디📚/CS 스터디

교착상태

교착상태(Dead Lock)

- 교착상태란 두 개 이상의 프로세스가 자원을 점유한 상태에서 서로 점유한 자원을 서로에게 요구하고 있어서 그 프로세스들이 무한정으로 기다리고 있는 상태를 말한다.

 

* 교착상태의 발생 조건 4가지

- 교착 상태가 발생하기 위해서는 4가지의 조건이 있고 이 중의 하나라도 만족하지 않으면 교착상태는 발생하지 않는다.

 

1. 상호 배재(Mutual Exclusion)

- 한 리소스는 한 번에 하나의 프로세스만이 사용할 수 있어야 하고, 사용중인 자원을 다른 프로세스가 사용하려면 요청한 자원이 해제될 때까지 기다려야 한다.

 

2. 점유와 대기(Hold and Wait)

- 자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재해야 한다.

 

3. 비선점(No Preemption)

- 이미 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없고 프로세스가 task를 마친 후 리소스를 자발적으로 반화할 때까지 기다려야 한다.

 

4. 순환 대기(Circular Wait)

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

- 즉, 점유와 대기의 관계의 프로세스들이 서로를 기다려야 한다.

 

교착상태 해결 방법

- 교착상태를 해결하는 방법에는 크게 3가지의 해결법이 존재한다.

 

1. 예방(Prevention)

- 교착상태가 되지 않도록 하는 방법으로, 교착상태의 발생 요건 4가지 중에 하나 이상을 부정하여 교착상태를 예방한다.

 

- 상호 배제(Mutual Exclusion) 부정 : 여러 개의 프로세스가 동시에 공유자원을 사용할 수 있다.

 

- 점유와 대기(Hold and Wait) 부정 : 프로세스가 실행되기 전에 필요한 모든 자원을 할당하여 프로세스 대기를 없애거나, 자원이 점유되지 않은 상태에서만 자원 요청을 받도록 한다.

 

- 비선점(No Preemption) 부정 : 모든 자원에 대한 선점을 허용하고 프로세스가 할당받을 수 없는 자원을 요청하는 경우, 기존에 가지고 있던 자원을 모두 반납하고 새 자원과 이전 자원을 얻기 위해 대기하도록 한다.

 

- 순환 대기(Circular Wait) 부정 : 자원에 고유한 번호를 할당하고 번호 순서대로 자원을 요구하도록 한다. 예를들어 

 

2. 회피(Avoidance)

- 교착 상태 회피는 교착상태가 발생하기 전에 교착 상태를 예상하여 안전한 상태에서만 자원 요청을 허용하는 방법이다.

- 즉, 교착 상태가 발생할 가능성이 있는 자원 할당을 하지 않는 것이다.

- 각 프로세스에게 자원을 할당하여 교착상태가 발생하지 않으면 모든 프로세스가 완료될 수 있는 안전상태, 교착 상태가 발생할 수 있는 상태는 불완전 상태라고 한다.

- 회피의 대표적인 방법으로는 은행원 알고리즘이 사용된다.

 

3. 탐지 및 회복(Detection and Recovery)

- 교착상태가 발생할 수 있도록 두고 교착상태가 발생할 경우 찾아서 해결한다.

 

* 탐지

- 교착상태 발견 알고리즘 등을 사용하여 시스템에 교착상태가 발생했는지 점검하여 교착상태에 있는 프로세스와 자원을 찾는다.

 

* 회복

- 교착상태를 발견했다면 회복 기법을 진행한다.

- 프로세스 종료 방법 : 교착 상태의 프로세스를 모두 중지 / 교착 상태가 제거될 때까지 한 프로세스씩 중지

- 자원 선점 방법 : 교착 상태에 빠진 프로세스가 필요로 하는 자원을 강제로 가져옴/ 자원을 빼앗긴 프로세스는 강제 종료 이후 재시작


* 정리

- 교착 상태란 두 개 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상을 의미한다. 교착상태가 발생하기 위해서는 상호배제(한 리소스는 한 번에 하나의 프로세스만이 사용할 수 있다), 점유와 대기(자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재해야 한다), 비선점(이미 다른 프로세스에게 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없다), 순환대기(대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다.) 총 4가지의 발생 조건이 필요하다.

 

- 교착상태의 해결 방법 : 교착 상태를 해결하기 위해서는 예방, 회피, 탐지 및 회복이라는 크게 3가지의 방법이 있다. 먼저 예방은 교착상태가 발생하지 않도록 교착상태의 발생 요건 4가지 중에 하나 이상을 부정하여 교착상태를 예방한다. 회피는 교착 상태가 발생하기 전에 교착상태를 예상하여 안전한 상태에서만 자원 요청을 허용하는 방법으로 교착 상태가 발생할 것으로 예상되면 자원 할당을 하지 않는다. 마지막으로 탐지 및 회복은 교착상태가 발생할 수 있도록 두고 교착 상태가 발생하면 이를 해결하는 방법으로 탐지(시스템에 교착상태가 발생했는 지 점검)와 회복(프로세스 종료 / 자원 선점 방법)을 통해 교착상태를 해결한다.


학습 단계로 잘못된 정보가 있을 수 있습니다. 잘못된 부분에 대해 알려주시면 정정하도록 하겠습니다

참고 : https://yoongrammer.tistory.com/67

https://velog.io/@ejung803/%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9C%EC%99%80-%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9C-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95

https://yoongrammer.tistory.com/m/67

'이것저것 스터디📚 > CS 스터디' 카테고리의 다른 글

뮤텍스(Mutex)와 세마포어(Semaphore)  (0) 2023.11.13
쿠키와 세션  (0) 2023.10.24
프로세스와 스레드  (1) 2023.10.23
HTTP 대신 HTTPS를 사용해야하는 이유  (0) 2023.10.16
API GATEWAY  (1) 2023.10.16