운영체제

데드락

xodnek 2021. 8. 11. 15:16

데드락이 무엇인가요??

데드락은 자원이 한정되어 있어서 상대방이 자원을 다 쓰고 돌려줄 때까지 기다리고 그걸 받아서 쓴다고 할 때,

그걸 서로가 기다려서 영원히 무한 기다림에 빠지는 것입니다.

 

즉 A, B가 있는데, A는 자원1, 자원2 순서대로하고 B는 자원2, 자원1 순서대로 하려고합니다.

A는 자원1을 소지하고 있는 상태에서 자원2를 요청하고 B는 자원2을 소지하고 있는 상태에서 자원1을 필요로하는 상황에서 무한 기다림인 교착상태에 걸리게 됩니다.

우리가 일상생활에서 볼 수 있듯이 자동차가 여러 대가 방향이 꽉 막혀버린 상황에서 서로 양보하지 않고 무한정 대기하는 것입니다.

P0이 A자원에 세마포어를 가진 상태에서 인터럽트가 걸립니다. context switching이 일어나고 P1은 B자원에 세마포어를 걸어 가지고 있습니다. A자원을 가지려고 봤더니 P0이 들고 있어서 기다려야 되는 상황입니다.

P0은 wait(A)까지 수행되고 인터럽트가 걸려서 B세마포어를 확보하는데 P1이 가지고 있으니 기다려야 합니다.

P0과 P1은 서로가 가지고 있는 자원만을 기다리게 되면서 DeadLock에 빠지게 되는 것입니다.

 

즉, 데드락은 하나 또는 둘 이상의 프로세스가 더 이상 계속할 수 없는 어떤 특정 사건을 기다리고 있는 상태입니다.

대표적인 교착상태는 철학자 문제와 풀링 문제 등이 존재합니다.

 

데드락이 발생하는 조건을 아시나요??

상호배제, 비선점, 점유와 대기, 환형 대기가 존재합니다.

위의 4가지 조건을 만족시켜주면 데드락이 발생하게 됩니다.

 

상호배제는 한 번에 하나의 프로세스만이 공유 자원에 접금할 수 있다는 뜻입니다. 동기화의 가장 기본이자 뮤텍스도 mutual exclusion을 줄여 쓴 말입니다.

상호 배제 조건이 깨지면 race condition이 발생합니다.

 

비선점은 다른 프로세스의 자원을 강제로 가져올 수 없습니다. 교통 체증 문제를 보게되면, 몇 차만 후진해서 양보해주면 데드락이 발생하지 않는데, 내 것은 양보하기 싫은 것입니다. 그래서 오도 갈수 없는 상태가 된 것입니다.

 

점유와 대기는 자원을 가지고 있는 상태에서 다른 프로세스가 사용하고 있는 자원의 반납을 기다리는 것입니다. 간단하게 욕심쟁이인 것입니다.

 

환형 대기는 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있는 것입니다. 일직선으로 A B C D가 있다면 D가 C에게 / C가 B에게 / B가 A에게 요청을 하게 되면... 교착 상태는 서로에게 요구해서 서로가 기달려야 하는데, 일직선이면 서로가 아니기 때문에 발생할 일이 없습니다.

서로 맞물리는 형태가 되려면 환형형태가 되어야 하기 때문에 교착상태가 발생하면 다 환형형태 밖에 없습니다.

 

데드락 해결 방법에 대해 아시나요??

예방, 회피, 회복, 무시가 있습니다.

 

교착상태 발생 조건은 데드락 발생 조건의 모두 만족해야합니다. 교착 상태를 해결하기 위해 조건을 예방하는 것입니다.

 

회피는 교착 상태의 발생조건을 없애기보다는 발생하지 않도록 알고리즘을 적용하는 방법입니다. 자원할당 그래프 알고리즘과 은행원 알고리즘이 존재합니다.

 

회복은 교착상태가 발생하는 것을 아예 막지 않고, 교착 상태가 발생하면 발생 이후에 문제를 해결하는 방법입니다.

 

무시는 교착상태를 해결할때에도 문맥교환에 의한 오버헤드로 성능 저하가 생깁니다. 교착 상태에 의한 성능 저하보다 이를 해결할 때의 성능저하가 큰 경우 그냥 무시하는 것입니다.

 

자원할당 그래프를 아시나요??

방향성 그래프인데 데드락을 쉽게 이해할 수 있습니다.

P는 프로세스 / R은 자원입니다(점의 수는 Resource count) Edge는 request, assignment입니다.(프로세스에서 자원으로 가는 선은 request / 자원에서 프로세스로 가는 선은 assignment)입니다.

데드락의 구분은 그래프의 사이클이 없으면 데드락이 아니며, 사이클이 있으면 다시 조사를 해야합니다.

사이클이 있는 경우 자원에 점이 하나라면, 즉 유일하면 데드락이 발생합니다. 하지만, 자원의 여러 개라면 데드락이 발생하지 않을 수도 있습니다.

i.e 자원의 수에 해당하는 사이클이 만들어지면, 자원을 반납할 수 없어 교착상태에 걸리게됩니다.

 

데드락 해결 방법에서 예방방법에 대해 설명해주세요.

데드락이 걸리기 위해선 반드시 4가지 조건 상호배제, 비선점, 점유와 대기, 환형대기 모두가 걸려야합니다.

그래서 4개 중에서 하나만 막아보자라는 것입니다.

 

상호배제는 모든 리소스가 공유가능하다고 하면 상호배제를 막을 수 있습니다.

점유대기는 쓰레드가 어떤 자원을 요청할 때, 다른 자원을 놓지 않고 가지고 있습니다. 그래서 자원을 요청할 때는 반드시 자신이 가지고 있는 자원을 해제 하면됩니다.

 

비선점은 선점이 가능하도록 만들면 됩니다. 즉 친구가 자원을 가지고 있는데 제가 뺏어버리는 것입니다. 그럼 친구는 어떻게 되나요?? 문제가 생겨버리겠죠..

원형대기는 막아주면됩니다. 자원 타입에 번호를 정해주는 것입니다. 1번은 파일 2번은 메모리 3번은 디스크로 설정하면 자신이 가지고 있는 번호보다 높은 번호만 요청할 수 있게하면 원형대기를 예방할 수 있습니다. 하지만 기아의 문제를 발생할 수 있습니다.

'운영체제' 카테고리의 다른 글

메모리 할당(1)  (0) 2021.08.13
주메모리의 관리  (0) 2021.08.13
철학자들의 저녁식사 문제  (0) 2021.08.11
모니터  (0) 2021.08.10
뮤텍스와 세마포어  (0) 2021.08.10