데드락이란
데드락은 교착상태라고도 불리며, 두 개 이상의 프로세스 혹은 스레드가 서로가 가진 리소스를 기다리는 상태를 의미합니다.
서로 자원을 가진 상태에서 다른 스레드가 가진 자원을 기다리기 때문에 무한정 기다리게 되기 때문에, 위험한 상태입니다.
데드락이 생길 수 있는 조건
데드락이 생기기 위해서는 다음 4가지 조건을 만족해야 합니다.
- Mutal exclusion : 리소스는 프로세스 혹은 스레드가 공유해서 사용할 수 없다.
- Hold and wait : 프로세스 혹은 스레드가 반드시 하나 이상의 리소스를 취득한(hold) 상태에서 다른 프로세스 혹은 스레드가 사용하고 있는 리소스를 추가로 기다려한다(wait).
- No preemption : 비선점이라고도 하며, 리소스 반환은 오직 그 리소스를 취득한 프로세스 혹은 스레드만 가능하다. 즉 강제적으로 리소스를 탈환할 수 없음을 의미한다.
- Circular wait : 프로세스들이 순환의 형태로 서로의 리소스를 기다려야 한다.
OS 관점 데드락을 해결하는 방법
데드락은 다음과 같은 4가지 방법으로 해결할 수 있습니다.
- 데드락 방지 : 위에서 살펴봤던 4가지 조건 중 최소 하나 이상의 조건을 만족하지 않게끔 방지한다.
- Mutal exclusion 해결 : 리소스를 공유 가능하게끔 설계한다. => 사실상 불가능하다. 데이터 정합성 이슈가 발생한다.
- Hold and wait 해결 : 사용할 리소스들을 모두 확보한 후 해당 프로세스 혹은 스레드를 시작한다. 혹은 리소스를 전혀 가지지 않은 상태에서만 리소스를 요청한다. => 리소스의 효율이 떨어질 수 있으며, 해당 리소스가 인기가 많다면 기아 현상이 발생할 가능성이 있다.
- No preemption 해결 : 추가적인 리소스를 기다려야 한다면, 다른 프로세스가 가진 리소스를 선점 가능하도록 설계한다. time slice 가 만료되면 리소스 할당을 해제하고 다른 프로세스 혹은 스레드가 해당 자원을 선점하게끔 하는 컨텍스트 스위칭의 원리와 비슷하다.
- Circular wait 해결 : 리소스 할당에 순서체계를 부여하고 특정 순서(오름차순)로 자원을 할당할 수 있게끔 설계한다. 데드락 방지의 4가지 방법 중 가장 보편적인 방법이다.
- 데드락 회피 : 실행 환경에서 추가적인 정보를 활용해 데드락이 발생할 수 있는 상황을 회피한다. ex) Bank Algorithm
- 데드락 감지와 복구 : 데드락을 허용하고, 발생할 경우 복구한다.
- 복구 방법 1 : 프로세스 혹은 스레드를 강제로 종료한다. 극단적으로 모든 스레스를 강제 종료하는 것이 아닌, 순차적인 종료를 지원한다. 처리 과정과 결과가 모두 삭제되기 떄문에 리스크가 너무 크다.
- 복구 방법 2 : 일시적으로 스레드에게 필요한 리소스의 자원을 할당해준다.
- 데드락 무시 : OS 차원에서 해결하지 않고 개발자에게 위임한다.
프로그래밍 관점 데드락을 해결하는 방법
- Mutal exclusion 이 반드시 필요한 상황인지 다시 생각한다. 즉 자원에 대한 lock 을 무분별하게 설정하지 않았는지 다른 해결방법은 없을지 고민한다.
- 리소스 할당에 대한 순서를 바꿔 순환 형태의 선점 설계를 없앤다.
- 즉 프로그래밍 관점에서는 데드락의 발생 조건을 프로그래밍 적으로 없애 방지하는 방법으로 설계해야한다.
'개인 공부' 카테고리의 다른 글
[운영체제] 프로세스와 스레드 (0) | 2022.07.05 |
---|