전공공부/운영체제 (Operating System)

[운영체제] Deadlock (2) - Deadlock Prevention

jooona 2021. 1. 1. 23:56
반응형

지난번 글에서 Deadlock의 정의가 무엇인지, 또 어떤 상태일 때 Deadlock이 성립하는지에 대해 알아보았습니다. 이번 글에서는 Deadlock을 어떻게 처리해 주어야 하는지에 대해서부터 살펴보겠습니다.

 

1. Deadlock 처리 방법

Deadlock 문제를 처리하는 데에는 3가지 방법이 존재합니다.

1. 시스템이 Deadlock에 걸리지 않도록 Deadlock을 예방하거나 피하는 프로토콜들을 사용한다. 

2. 시스템이 Deadlock이 걸리고 나면 이를 탐지하고, 회복시키는 방법을 사용한다.

3. Deadlock에 관한 사항을 무시하고, Deadlock이 일어나지 않기를 바란다.

 

마지막 방법은 굉장히 무책임한 방법으로 보이지만, 사실 Windows나 Linux 등 대부분의 운영체제들은 세 번째 방법을 채택하여 사용하고 있습니다. Deadlock이라는 것 자체가 그렇게 빈번하게는 발생하지 않기 때문에 Deadlock을 예방하거나 회피하는 것에 노력을 기울이는 대신 무시해버리는 방법을 사용하는 것입니다. 이러한 방법에서는 Deadlock을 피하는 것이 응용 프로그래머들의 몫으로 떠넘겨지게 됩니다.

 

Deadlock이 발생하지 않도록 하기 위해 시스템은 Deadlock을 예방(Deadlock Prevention)하거나 회피(Deadlock Avoidence)할 수 있습니다.

 

Deadlock Prevention은 앞의 글에서 공부했던 Deadlock을 성립시키는 4가지 조건 중 적어도 하나를 성립하지 않도록 보장하는 방법이며, Deadlock Avoidance는 프로세스가 자원을 요구할 때 일종의 제한을 두어 Deadlock을 방지하는 방법입니다. 우선 Deadlock Prevention에 대해 먼저 공부해 보도록 하겠습니다.

 

2. Deadlock Prevention (교착상태 예방)

앞에서 살펴본 것처럼 Deadlock이 발생하려면 4가지 필요조건이 모두 성립해야 합니다. 그래서 이 조건들 중 하나라도 성립이 되지 않도록 만들면 Deadlock이 발생하는 것을 예방할 수 있습니다. 각각의 조건들에 대해서는 바로 전의 글인 "[운영체제] Deadlock(1) - Definition"이라는 글에서 확인하시면 될 것 같습니다.

 

1. Mutual Exclusion (상호 배제)

 

간단하게, 자원들을 공유 가능하게 만들어주면 Mutual Exclusion이라는 조건을 만족시키지 않을 수 있습니다. 예를 들면 읽기 전용 파일 (Read-only File)은 여러 프로세스가 동시에 접근할 수 있도록 허용해주는 방법 등입니다. 하지만 Mutex lock과 같이 본질적으로 공유가 불가능한 자원들이 존재하기 때문에 일반적으로 사용하기는 어려운 면이 있습니다.

 

2. Hold and Wait (점유하며 대기)

 

이 조건을 만족시키지 않기 위해, 프로세스가 어떤 자원을 점유하고 있다면, 다른 자원을 요청하지 못하게 만드는 방법을 사용할 수 있습니다. 이를 위해서는 프로세스는 작업을 시작하기 전에 작업에 필요한 모든 자원에 먼저 요청하고 할당을 받는 방법이나, 또는 자신이 가지고 있는 모든 자원을 방출하고 나서야, 새로운 자원을 요청할 수 있게 만드는 방법을 사용해야 합니다. 

 

이 방법들에는 두 가지 단점이 존재합니다. 하나는 자신이 사용할 자원들을 모두 할당받아 놓고 오랫동안 사용하지 않을 수 있기 때문에 자원의 이용도가 낮아질 수 있다는 것입니다. 그리고 다른 하나는 자주 쓰이는 자원들을 여러 개 필요로하는 프로세스라면, 해당 자원들을 모두 모으지 못하면 실행할 수 없기 때문에 기아 문제(starvation)가 발생할 수도 있다는 것입니다.

 

3. No Preemption (비선점)

 

세 번째 조건을 만족시키지 않기 위해, 다음과 같은 프로토콜을 사용할 수 있습니다. 우선 몇 개의 자원을 확보하고 있는 프로세스가 만일 다른 자원을 할당받기 위해 대기를 해야 하는 상황이 발생하면, 자신이 가지고 있는 모든 자원들은 선점될 수 있습니다. 즉, 현재 대기해야 하는 프로세스가 무의미하게 자원들을 확보하고 있는 것을 예방하는 것입니다. 그리고 반대로, 한 프로세스가 필요한 자원이 생겼는데, 해당 자원이 다른 자원을 위해 대기하고 있는 프로세스가 가지고 있는 자원이라면, 그 자원을 뺏어올 수 있습니다. 물론 이 프로토콜은 CPU와 같이 선점 가능한 자원일 때만 사용 가능합니다.

 

4. Circular Wait (순환 대기)

 

Circular Wait를 성립하지 않게 만들기 위해 모든 자원들에게 전체적인 순서를 부여하여, 각 프로세스들이 순서에 따라 오름차순으로만 자원을 요청할 수 있도록 만드는 것입니다. 즉 내가 지금 필요로 하는 자원이 내가 지금 확보하고 있는 자원보다 부여된 순서가 낮다면, 확보하고 있는 자원을 방출해야만 필요로 하는 자원에 요청을 할 수 있는 것입니다.

 

 

 

 

 

이번 글에서는 Deadlock Prevention에 대해 중점적으로 공부해 보았습니다. 다음 글에서는 Deadlock Avoidance에 대해 공부해보도록 하겠습니다. 읽어주셔서 감사합니다.

반응형