교착상태(Deadlock)::운영체제

2020. 6. 26. 21:16computer science/operating system

교착상태(Deadlock)란?

 

 첫 번째 스레드는 두 번째 스레드가 들고 있는 객체의 lock이 풀리기를 기다리고 있고, 두 번째 스레드 역시 첫 번째 스레드가 들고 있는 객체의 lock이 풀리기를 기다리는 상황을 말합니다.

 

 두 스레드가 서로 lock이 풀리기를 기다리고 있기 때문에 무한 대기 상태에 빠지게 됩니다.

 이러한 상황을 스레드가 교착상태에 빠졌다고 합니다.

 

 

교착상태의 4가지 조건

 

1) 상호 배제(Mutual Exclusion, Mutex)

 공유 자원에 대한 접근 권한이 제한되기 때문에 한 번에 한 프로세스만 공유 자원을 사용할 수 있습니다.

 

2) 점유 대기(Hold and wait)

 공유 자원에 대한 접근 권한을 갖고 있는 프로세스가 그 접근 권한을 양보하지 않은 상태에서 다른 자원에 대한 접근 권한을 요구할 수 있습니다.

 

3) 비선점(No preemption)

 한 프로세스가 다른 프로세스의 자원 접근 권한을 강제로 취소할 수 없습니다.

 

4) 순환대기(Circular wait)

 두 개 이상의 프로세스가 자원 접근 권한을 서로 기다리는 사이클이 존재합니다.

 

 

교착상태 방지

 

 4가지 조건 가운데 1가지를 제거하면 됩니다.

 대부분의 교착상태 방지 알고리즘은 4번 조건(순환대기)을 제거하는 데 초점이 맞춰져 있습니다.

 

 공유 자원 중 많은 경우가 한 번에 한 프로세스만 사용할 수 있기 때문에 1번 조건(상호 배제)을 제거하기는 어렵습니다.

ex) 프린터

 

 

뮤텍스와 세마포어

 

 프로세스 혹은 스레드 간의 통신 시 공유 메모리(Shared memory) 등을 쓰는 경우,

 하나의 자원에 두 개 이상의 프로세스 혹은 스레드가 접근하는 경우 교착상태가 발생합니다.

 

 이를 제어하기 위해 스레드에서는 뮤텍스를 사용하며, 프로세스에서는 세마포어를 사용합니다.

 

뮤텍스

 상호 배제라고도 하며 Critical Section을 가진 스레드의 Running time이 서로 겹치지 않도록 서로 단독으로 실행하는 기술입니다. Synchronized 또는 lock을 통해 해결합니다.

 

세마포어

 리소스 상태를 나타내는 간단한 카운터를 이용해 공유 메모리에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용하는 기술입니다.

 

 

Critical Section

 

 다중 프로그래밍 운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때 각 프로세스에서 공유 데이터를 액세스하는 프로그램 코드 부분을 가리킵니다.

 

 공유 데이터를 여러 프로세스가 동시에 액세스하면 시간적인 차이로 변경되지 않은 값이 반영되어 잘못된 결과를 만들어 낼 수 있습니다. 한 프로세스가 Critical Section을 수행하고 있을 때 즉, 공유 데이터를 액세스하고 있을 때 다른 프로세스들은 절대로 그 데이터를 액세스하지 못하도록 해야 합니다.