Deadlock

이한수·2022년 3월 22일
0
post-thumbnail

개인 공부내용 정리 목적입니다.
참고 : 양희재 교수님 (OS)
참고 : https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-10.-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8F%99%EA%B8%B0%ED%99%94-3

DeadLock이란 무엇일까??

프로세스는 실행을 위해 하드웨어 자원을 OS로부터 할당 받는다.

하지만 생각을 해보면 우리는 수많은 프로그램을 실행하고 있고 , 그 말은 여러개의 프로세스가 동시에 돌아가고 있다는 말인데 그럴 경우 자원이 부족한 경우가 생길 수 있다.

이렇게 필요한 자원을 할당 받지 못하고 멈춰있는 상태를 DeadLock(교착상태) 라고 한다.

DeadLock 발생 조건

먼저 DeadLock가 일어나기 위해서는 필요한 조건들이 있다.

이점들이 만족되어도 교착상태가 반드시 발생하는 것은 아니니 알고 있자.

즉 , 이를 만족하더라도 발생 가능성은 매우 낮다.

1)상호 베타(Mutual exclusion)

→ 프로세스가 사용 중인 자원은 다른 프로세스에서 접근할 수 없다.

2)보유 및 대기(Hold on wait)

→ 특정 자원을 가지된 다른 자원을 가지지 못해 대기하는 프로세스로 인해 ,

아직 사용되지도 않을 특정 자원을 가지고 대기하는 일 때문에 다른 프로세스에서도 영향을 받는것을 말한다.

3)비선점(No Preemption)

→ 프로세스가 수행중일 때는 다른 프로세스가 끼어들어 수행될 수 없다.

4)환형 대기(Circular wait)

→ 자원을 요구하고 할당된 프로세스들의 방향이 원형을 이루는 것을 의미한다.

예를 들어 ,

“1”이라는 자원을 “프로세스1” 은 할당받고 , 자원 “2”의 할당을 요청한 상태이고 ,

“프로세스2” 는 “2”는 할당받고 “1”을 요청하고 있는 경우 환형 대기가 된다.

DeadLock 처리

쉽게 발생하지 않는다는 것은 알았다. 그래도 발생할 수는 있는 일이니 대비는 필요하다.

그럼 발생하였을 경우에는 어떻게 처리를 해야할까??

1)교착 상태 방지

이 방식은 바로 위에서 언급한 필요조건 4가지 중에 하나를 만족 시키지 않는 것이다.

왜?? 만족 시켜야만 발생할 가능성이 생기는 것이 교착 상태이므로 , 만족하지 않으면 가능성 사라질테니까 말이다

근데 사실 Os에서 할당하는 것을 어떻게 해야 할까 싶긴 하다.

먼저 상호 베타 조건을 불만족 하려면 프로세스가 사용 중인 자원에 다른 프로세스에서 접근할 수 있어야 하는데 , 보안 적인 측면도 그렇고 현실적으로 불가능한 경우가 많다고 한다.

보유 및 대기? 여러 개의 자원이 필요한 경우 그 해당 자원들에 모두 접근이 가능한 경우에만 요청 하게끔 하는 것이다. 단, 수많은 프로세스가 자원을 요청하고 반납 할 텐데 , 필요한 자원이 모두 나올 때까지 가만히 기다리기만 하는 것은 그만큼 자원 활용률을 저하 시키고 , 먼저 자원이 필요하다고 들어온 프로세스는 그 필요한 자원들이 한번에 접근 가능할 경우가 나오지 않을 경우 , 추후로 들어오는 프로세스들이 먼저 수행되어 “기아 현상”이 발생할 수 있다.

비선점? 선점 방식으로 바꾼다 이것도 무리가 있다. 프린트를 예시로 들자면 작업을 수행하는 도중에 다른 프로세스가 이를 선점하는 것은 불가능하다고 볼 수 있다.

환형대기 ? 이 조건을 불만족 하는 것이 가장 확률이 높다. 예를 들어 모든 자원에 번호를 부여하고 이 번호에 대한 오름차순으로 자원을 요청하는 것이다. 그리고 마지막 프로세스만 내림차순으로 요청을 하게끔 처리하는 방법이 있다.

물론 이것도 자원 활용률을 저하시키긴 한다.

보면 상호베타와 비선점은 거의 불가능하다. 고로 보유 및 대기 혹은 환형 대기 조건을 깨는 방식을 보통 사용한다.

2)교착 상태 회피

교착상태를 자원 요청에 대한 잘못된 승인으로 본다. 따라서 ,

교착상태 회피에서는 안전한 할당(Safe allocation)과 불안정한 할당(Unsafe allocation)
두 가지로 나뉜다.

예를 들어 현재 프로세스에서 현재 당장 필요한 자원양이 있고 ,

프로세스를 작업을 끝 마칠때 까지 필요한 총 자원양이 있을 것이다. 이때 프로세스들이 현재 필요한 자원양들을 배분 해주고 , 각 프로세스들이 후반부로 넘어가 더 추가적인 자원을 요청할 경우 ,

처음에 필요한 자원들은 할당해줄 수 있는 양이라서 해주었지만 , 그 뒤에 추가 자원이 감당이 안되어 해당 프로세스들은 작업을 수행할 수 없게 된다.

물론 이 과정에서 , 사용한 자원들을 반납하고 그 자원을 다른 프로세스에서 추가적으로 할당 받아 사용하고 이런식으로 반납과 요청의 과정이 맞아 떨어질 경우 안전한 할당이라고 한다.

반대로 , 그 경우가 맞아 떨어지는 것을 생각하지 않고 배분하여 프로세스들이 나머지 자원들을 추후에 할당 받지 못하는 경우를 불안전한 할당 이라고 한다.

고로, 교착 상태 회피란 , 불안전한 할당을 하지 않는 것을 의미한다.

3)교착 상태 검출 및 복구

이는 앞서 2가지 방식처럼 사전에 방지한다는 개념보다는 , 발생 가능성을 허용하고 발생 하였을 경우를 대비하는 것이다.

OS가 내부에서 주기적으로 교착 상태의 발생 여부를 검사한다.

검사 주기는 짧으면 그 만큼 오버 헤드가 커지고 , 그렇다고 주기를 길게 하면 교착 상태의 발견 시점이 늧춰져 복구 가능성이 낮아진다.

복구하는 방법은 교착 상태가 발생하는지 주기적으로 검사하듯이 메모리의 상태를 주기적으로 메모리에 저장 해놓고 만약 교착 상태가 발생하면 그 이전 상태로 되돌리는 방법. 그 외에 일부 프로세스를 강제로 종료하거나 자원을 강제로 선점하여 프로세스에게 할당해주는 방법 등이 있다.

하지만 복구를 제대로 하지 못할 수도 있고, 검출을 위해 추가적인 오버 헤드가 발생한다는 단점이 있다.

4)교착 상태 무시

교착 상태 필요 조건을 만족해도 교착 상태의 발생은 매우 드물다.

고로 , 말 그대로 아무런 조치를 취하지 않는 것을 의미한다.

profile
성실하게

0개의 댓글