[운영체제] 17. Deadlocks 2

이건회·2022년 3월 21일
0

운영체제

목록 보기
16/27

  • 지난 내용과 같이 데드락을 처리할 수 있는 네 가지 방법이 있다.

  • 프로세스의 자원 요청을 받아들였을 때 데드락의 가능성이 있으면 자원을 할당하지 않는 것이 데드락 어보이던스 였다.
  • 항상 safe한(현재 가용 가능한 자원으로도 프로세스 자원 요청 처리를 끝낼 수 있음)상태를 유지한다.
  • 프로세스 a를 처리하고 나면 a가 자원을 다시 뱉어내므로 그 뱉어낸 자원을 가지고 다른 프로세스 요청을 순차적으로 처리할 수 있다.

  • 뱅커스 알고리즘에서 need는 하나의 프로세스가 최대로 요청할 수 있는 자원에서 현재 할당된 자원을 뺀 값이다. 이 값이 가용할 수 있는 자원보다 적으면 자원을 할당할 수 있다. 항상 프로세스가 최대의 요청을 할 것이라고 가정하여 요청을 처리하는 것이 뱅커스 알고리즘이다.

  • safe state상태에 있으면 데드락이 아니다. 가용자원으로 처리가 안되는 상황이 unsafe인데, 이 상태에 있다고 해서 반드시 데드락은 아니다. 프로세스가 가진걸 내놓지 않은 상황에서 요청을 하면 데드락이지만, 가진 것을 내놓았을 때 생기는 가용자원으로 처리가 될 수 있다면 데드락에 빠지지 않는다.

  • 다음은 데드락이 생겨도 그냥 놔두고, 시스템이 이상해지면 탐지 후 회복하는 처리 방법이다.
  • 이것이 데드락 디텍션이다. 자원당 인스턴스가 하나면 자원할당 그래프 이용을 해 데드락을 탐지하고, 여러개면 테이블을 그려 데드락을 탐지한다.

  • 자원당 인스턴스가 하나인 상황에서, 자원 할당 그래프에 사이클이 있으면 데드락이다.
  • 자원을 빼고, 자원 요청을 하는 프로세스에서 요청을 받는 프로세스 끼리로 이어주는 그래프를 통해 그래프를 간결하게 그릴 수 있다.
  • 프로세스 n개에서 사이클이 있는지를 알아보는시간은 O(n^2)시간이 걸린다.
  • dfs, bfs를 통해 사이클이 있는지를 찾을 수 있다.

  • 자원 당 인스턴스가 여러개일 때 데드락을 찾는 경우다. 할당자원, 요청자원, 가용자원을 테이블에 나타냈다.
  • 위의 표는 가용자원이 없어 요청을 받아들일 수 없는 상황이다. 이 때 자원 요청이 없는 각 프로세스(그램에서 0번과 2번)가 현재 자원을 반납할 것이라고 가정한다. 그러면 가용 자원은 abc순으로 3 1 3이 되고, 이후 다른 프로세스의 요청을 처리했을 경우 반납할 것도 가정을 하면 데드락이 없어진다.

  • 만약 2번 프로세스가 C자원 1 더 요청하여 0번만 반납을 가정했는데, 이 때 가용자원은 0 1 0 이다. 그러나 B를 요청하는 프로세스는 아무도 없으므로 데드락이 된다.

  • 그래서 데드락이 발견되면 리커버리를 한다.
  • 데드락에 연루된 프로세스를 모두 죽이거나(모든 프로세스 종료)
  • 데드락에 연루된 프로세스를 하나씩 죽여 가며 데드락이 없어지는지 계속 확인하는 것이다.(데드락에 연루된 프로세스의 자원 뺏음). 누구한테 자원을 뺏을 지 희생할 프로세스를 찾는데, 뺏은 후 safe state로 롤백하여 프로세스를 재시작한다. 그러나 자원을 뺏을 때 다른 프로세스가 그 자원을 잡기 전에, 자원을 뺏긴 프로세스가 동일한 자원을 다시 점유하여, 같은 프로세스가 계속 victim으로 선정되는 경우가 있다. 기아 문제가 생길 수 있으므로, 자원을 뺏는 패턴을 계속 바꿔줄 필요가 있다.

  • 마지막은 데드락이 일어나든 상관없이 상관쓰지 않는 ignorance 방법이다. 데드락을 탐지하거나 방지하는데 드는 비용이 있으므로 운영체제가 이를 신경쓰지 않고, 사용자가 알아서 처리하도록 하는 것이다. 현재 대부분의 운영체제가 이 방법을 선택하고 있다.
profile
하마드

0개의 댓글