반응형
모니터
세마포의 단점을 개선하기 위해 조금 더 캡슐화하여 프로그래머가 정의한 ADT
cf> 세마포의 단점?
1. wait()가 와야되는데 , signal()이 옴 = 여러 프로세스들이 임계구역에 접근
2. signal()이 와야되는데, wait()가 옴 = 교착상태에 빠짐
● Monitor 구조 예시
1 2 3 4 5 6 7 8 | class monitor{ public: void procedure(); void function(); private: int count; }; | cs |
하지만, 모니터 역시 세마포와 똑같은 단점들이 존재한다.
○ 프로세스가 자원에 대한 허락을 받지 않고 자원에 엑세스한 경우
○ 프로세스가 자원에 대한 허락을 받은 다음 그 자원을 방출하지 않은 경우
○ 프로세스가 자원에 대한 허락을 받지 않았는데도 그 자원을 방출한 경우
○ 프로세스가 자원에 대한 허락을 받은 다음 방출하지 않은 상태에서 또 그 자원을 요청한 경우
Deadlock
= 교착상태 = 한정된 자원을 여러 곳에서 사용하려고 할 때 발생할 수 있다.
1. 상호 배제 : 자원은 한번에 한 프로세스만 사용할 수 있어야 함
2. 점유 대기 : 최소한 하나의 자원을 점유하고, 다른 프로세스가 사용중인 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 함
3. 비선점 : 다른 프로세스에 할당된 자원은 사용이 끝날때까지 빼앗을 수 없어야 함
4. 순환 대기 : 자원에 대한 대기가 Circular형태로 이루어져야 함
교착상태 처리에 관한 항목은 총 5가지이다.
① 교착 상태 예방(Prevention)
1. 여러 개의 프로세스가 공유 자원을 이용하도록 함
2. 프로세스가 실행되기 전 모든 자원을 할당
3. 자원을 점유하는 프로세스가 다른 자원을 요구할 때 자원을 반납하도록 함
4. 자원에 고유 번호를 할당하고, 번호 순서대로 자원을 요구
② 교착 상태 회피(Avoidance)
= Bankers Algorithm
프로세스가 자원을 요구할 때, 시스템이 자원을 할당한 후에도 안정상태인지 사전에 검사하여 교착상태를 회피하는 것을 목표
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import numpy as np n_processes = int(input('Number of processes? ')) n_resources = int(input('Number of resources? ')) available_resources = [int(x) for x in input('Claim vector? ').split(' ')] currently_allocated = np.array([[int(x) for x in input('Currently allocated for process ' + str(i + 1) + '? ').split(' ')] for i in range(n_processes)]) max_demand = np.array([[int(x) for x in input('Maximum demand from process ' + str(i + 1) + '? ').split(' ')] for i in range(n_processes)]) total_available = available_resources - np.sum(currently_allocated, axis=0) running = np.ones(n_processes) # An array with n_processes 1's to indicate if process is yet to run while np.count_nonzero(running) > 0: at_least_one_allocated = False for p in range(n_processes): if running[p]: if all(i >= 0 for i in total_available - (max_demand[p] - currently_allocated[p])): at_least_one_allocated = True print(str(p) + ' is running') running[p] = 0 total_available += currently_allocated[p] if not at_least_one_allocated: print('Unsafe') exit() print('Safe') | cs |
③ 교착 상태 탐지(Detection)
= 자원 할당 그래프를 통해 확인한다!!!
④ 교착 상태 회복(Recovery)
= 교착 상태를 일으킨 프로세스를 종료, 혹은 할당된 자원을 해제
1. 교착 상태의 프로세스 모두 중지
2. 교착 상태가 제거될때까지 하나씩 중지
반응형
'Developer > OS' 카테고리의 다른 글
7. Virtual Memory - 가상메모리 (1) | 2018.12.20 |
---|---|
6. Memory Fragmentation - 메모리 단편화 (0) | 2018.12.18 |
4. Critical Area - 임계구역이란? (0) | 2018.12.13 |
2. Process - 프로세스 (0) | 2018.12.11 |
1. What is Operation System? 운영체제란? (0) | 2018.12.11 |