Banker’s Algorithm
하나의 자원이 가진 인스턴스가 여러개일 때 Deadlock을 Avoidance하는 방법 프로세스에게 Maximum 자원을 할당해줘도 Safe한지 확인하는 알고리즘
특징
- Multiple Instance에 적용 가능
- 사전에 process가 필요로 하는 자원의 정보가 필요
- 자원을 얻기전에 Process가 기다릴 수도 있다.
- 프로세스는 자원을 정해진 시간 내에 반납해야한다.
Data Structures for the Banker’s Algorithm
Available : 현재 여유분. 여유 자원의 갯수. Available[j] = k 이면 j자원의 갯수가 여유가 k개 있다. Max : Process가 원하는 자원의 최댓값. Max[i][j] = K 이면 Pi가 Rj를 원하는 갯수의 최댓값은 k개 이다. Allocation : 프로세스에 할당된 자원. Allocation[i][j] = k이면 Pi가 Rj를 k개만큼 갖고있다. Need : 필요로하는 자원의 갯수. Need[i][j] = k이면 Pi가 Rj를 k개만큼 받길 원한다.
Need[i][j] = Max[i][j] - Allocation[i][j] 필요한 자원 = 원하는 최대 자원 - 할당된 자원 이다.
Safety Algorithm.
안전한지 check하는 알고리즘.
- Work = Available ( Work는 Available이다.) Finish[i] = false for every i (모든 프로세스들이 아직 끝나지 않았다.)
- Finish[i] = false인치 체크하고, Need[i] <= Work ( 필요한 자원을 줄만큼 여유가 있으면)
- Finish[i] = true. 일이 끝나고, Work = Work + Allocation[i]. 프로세스가 할당받은 자원을 다시 돌려받는다.
- Finish[i] == true for every process. ==> safe. 모든 프로세스가 끝나면 safe state에 있다고 할 수 있다.
Safety Algorithm에서 모든 프로세스를 처리하는 순서가 있다는 것이 중요하다. 하지만 그 프로세스의 특정 순서는 중요하지 않다.
Resource-Request Algorithm for Process Pi
특정 프로세스가 요청하는 자원의 할당 요청이 안전한지 판단하는 알고리즘.
- Request[i] < Need[i] 가 아니면?!! -> Error발생( 프로세스가 필요하다고 말했던 것보다 요청한 것이 크다면 에러가 발생하게 된다.)
- Request[i] < Available 이면 -> 요청한 자원을 줄만큼 여유자원이 있으면 goto 3. 여유자원이 없으면 기다리게 된다.
- P[i]에게 자원을 할당해주었다고 가정하고, Safety Algorithm을 실행시킨다. Available = Available - Request[i] -> 자원을 할당해주었다. Allocation[i] = Allocation[i] + Request[i] Need[i] = Need[i] - Request[i] 그 후 Safety Algorithm실행. safe -> 실제로 자원 할당, unsafe -> 자원을 할당하지 않고 P[i]는 기다리게 된다. 그리고 Available, Allocation, Need등 변경시켰던 값들을 다시 복원하게 된다.
Deadlock Detection
Deadlock state에 빠질 수 있게 허용하지만 Deadlock State를 탐지하고 회복한다.
Single Instance of Each Resource Type
하나의 자원에 하나의 인스턴스만 있을 때 Detection방법 Wait-for Graph를 그린다. Wait-for Graph에서 Node들은 하나의 프로세스를 의미한다. P[i] -> P[j]는 P[i]가 P[j]가 가진 자원을 기다린다는 것을 의미한다.
주기적으로 Wait-for Graph에 Cycle이 생기는지 검사한다. 검사하는 비용(Overhead)가 많이 든다.
Wait-for Graph는 Resource-Allocation Graph를 단순화시킨 것이라고 할 수 있다. Resource-Allocation Graph에서 자원의 노드를 전부 없앤 것이다. Wait-for Graph에서 Cycle이 생기게 되면 Instance가 하나일 때 무조건 Deadlock이 발생하는데, 여러 Instance일때를 가정하지 않았기 때문에 Cycle이 생기면 무조건 Deadlock이 발생한다고 가정한다.
Several Instances of a Resource Type
하나의 Resource가 여러 Instance를 가질 수 있다고 가정하자.
Available : 현재 여유분. Allocation : 프로세스에 할당된 자원. Request : 프로세스가 요청하는 자원. Request[i][j] =k 이면 P[i]가 R[j]를 k개만큼 요청하는 것이다.
Detection Algorithm
- Work = Available, 모든 i에 대해서 Allocation[i]가 0이 아니면 Finish[i] = false이다.(자원이 할당된 것이 있으면 아직 프로세스가 종료되지 않았다.)
- 모든 i에 대해서 Finish[i] == false이고 Request[i] < Available 이면 goto3, 모든 i가 조건을 만족하지 않으면 Deadlock이 발생했다고 가정한다.
- Work = Work + Allocation[i], Finish[i] = true. 그리고 이 2~3과정을 반복한다.
- 어떤 Finish[i] == false인데 할당해줄 여유 자원이 없다면 P[i]에서 Deadlock이 발생했음을 알 수 있다.
이 알고리즘은 많은 Overhead 비용을 필요로 한다.
Detection-Algorithm Usage
얼마나 자주 Detection알고리즘을 실행시키는게 좋을까? 다음과 같은 조건에 따라서 결정된다.
- 얼마나 자주 Deadlock이 발생할 가능성이 있는가?
- Deadlock에 관련된 Process의 갯수가 많은가? 적은가?
임의로 Algorithm 실행 주기를 결정하게 되면, Deadlock을 발생시킨 프로세스를 특정하기 어려울 수 있다.
Recovery from Deadlock : Process Termination
Process Termination = 비정상적인 프로세스 종료 프로세스를 종료하는 방법.
- 모든 프로세스를 종료시킨다.
- 하나씩 프로세스를 종료한다 -> 어느 프로세스를 먼저 죽일 것인가? 2-(1). 우선순위에 따라서 2-(2). 작업한 기간이 짧은 프로세스, 남은 작업기간이 많이 남은 프로세스를 우선적으로 종료시킨다. 2-(3). 사용하는 자원의 갯수가 많은 프로세스를 우선적으로 종료시킨다. 2-(4). 프로세스가 종료할 때 까지 필요한 자원의 수가 많은 프로세스를 우선적으로 종료시킨다. 2-(5). 얼마나 많은 프로세스를 종료시켜야 하는지를 고려한다. 2-(6). Interactive한 작업은 먼저 종료시키고, Batch 작업은 한번에 수행하는 작업의 크기가 크므로 나중에 종료시킨다.
Recovery from Deadlock : Resource Preemption
Resource Preemption = 프로세스를 죽이지 않고 자원을 빼앗아오는것.
어떤 프로세스를 먼저 희생양으로 삼을것인가? -> Cost를 Minimize해야한다. Rollback -> 희생양이 된 프로세스는 종료되지 않고, Safe state가 된다면 프로세스가 Restart된다. Starvation이 발생할 가능성이 있다. 따라서 Preemption된 횟수를 고려하는 것이 한 방법이 될 수 있다.
'Computer Science > OS' 카테고리의 다른 글
Memory Management (1) (1) | 2023.12.04 |
---|---|
7강 연습문제 (0) | 2023.12.02 |
Deadlock(1) (1) | 2023.12.01 |
6강. 연습문제 (2) | 2023.12.01 |
Process Synchronization(2) (2) | 2023.11.30 |