CS지식/운영체제

TIL 정리_96(Monitor, Deadlock)

ran4 2022. 5. 23. 17:39

http://www.kocw.net/home/m/search/kemView.do?kemId=1046323

운영체제 강의를 듣고 정리한 내용입니다

 

 

Monitor

동시 수행중인 프로세스 사이에서 추상 데이터 타입의 안전한 공유를 보장하기 위한

high-level synchronization construct이다


Monitor를 이용한 해결코드

  • Monitor에서는 lock을 걸거나 풀 필요가 없다

 

Bounded-Buffer Problem (Monitor 이용)
monitor bounded_buffer {
int buffer[N];
condition full, empty;
//condition 변수는 값을 가지지 않고 자신의 큐에 프로세스를 매달아서 sleep 시키거나큐에서 프로세스를 깨우는 역할만 한다.

void produce(int x) {
empty.wait() //비어있는 버퍼가 없는 경우 기다린다
...
// x를 비어있는 버퍼에 추가한다
...
full.signal();
}

void consume(int * x) {
full.wait(); //값이 있는 버퍼가 없는 경우 기다린다
empty.signal();
}

 

 

Process Synchronization 프로세스 동기화

== Concurrency control 병행제어와 같은 의미이다

 

P 연산 : 자원을 획득

V 연산 : 자원을 반납

 

Dining Philoshphers Example (Monitor 이용)
monitor dining_philosopher {
enum {thinking, hungry, eating} state[5];
condition self[5];

void pickup(int I) {
state[i] = hungry;
test(i);
if(state[i] != eating)
self[i].wait(); //기다린다
}

void putdown(int I) {
state[i] = thinking;
//왼쪽과 오른쪽에 위치한 철학자를 테스트한다
test((i+4) % 5); //L이 기다리는 경우
test((i+1) % 5);

void test(int I) {
if(state[(i+4)%5] != eating) && (state[i] == hungry) && (state[(i+1) % 5] != eating)) {
state[i] = eating;
self[i].signal(); //Pi를 깨운다
}
}

void init() {
for(int I = 0; i<5; I++)
state[i] = thinking;
}

 

Each Philosopher

do {

pickup(i);

eat();

putdown(i);

think();

} while(1);

 

 

**Semaphore와 Monitor의 차이점

semaphore에서는 lock을 걸지만, monitor에서는 lock을 걸지 않는다

잠들게 할 때 monitorif문으로 조건을 건다

 


Deadlock

- 교착상태

 

예시) 4거리에서 서로 이동하려는 차량들이 양보를 하지 않아 막혀버리는 상황

->일부 자원을 가지고 있으면서 상대방의 자원을 요구하는 상황이 맞물려 교착상태에 빠진다

 

Deadlock 

일련의 프로세스들이 서로가 가진 자원을 기다리며 block된 상태를 말한다

 

Resource

하드웨어, 소프트웨어 등을 포함하는 개념이다

) I/O device, CPU cycle, memory space, semaphore 등이 있다

 

프로세스가 자원을 사용하는 절차

request, allocate, use, release

 

Deadlock 예시 1

  • 시스템에 2개의 tape drive가 있다
  • 프로세스 P1과 P2 각각이 하나의 tape drive를 보유한 채 다른 하나를 기다리고 있다

 

Deadlock 예시 2

Binary semaphores A and B

P0 P1

P(A); P(B);

P(B); P(A);

 

 

Deadlock이 발생하는 4가지 조건

Mutual excpusion (상호 배제)

매 순간 하나의 프로세스만이 자원을 사용할 수 있다

-> 자원을 독점적으로 사용할 때 발생한다

 

No preemption (비 선점)

프로세스는 자원을 스스로 내어놓을 뿐 강제로 빼앗기지 않는다

-> 자원을 빼앗기지 않기 때문에 발생한다

 

Hold and wait (보유 대기)

자원을 가진 프로세스가 다른 자원을 기다릴 때 보유 자원을 놓지 않고 계속 가지고 있는다

-> 자원을 내어놓지 않고 추가적으로 요청하기 때문에 발생한다

 

Circular wait (순환 대기)

자원을 기다리는 프로세스간에 사이클이 형성되어야 한다

프로세스 P0, P1, ...., Pn이 있을 때

P0P1이 가진 자원을 기다리고,

P1P2가 가진 자원,

Pn-1Pn이 가진 자원을,

PnP0가 가진 자원을 기다린다.

-> 서로가 자원을 내어놓지 않고 기다리기만 하여 사이클이 형성되고, deadlock이 발생한다

 

 

데드락이 발생했는지를 알아보기 위한 방법

- Resource-Allocation Graph(자원 할당 그래프)

Vertex

Process P = { P1, P2, ..., Pn }

Resource R = { R1, R2, ..., Rm }

 

Edge

request edge Pi -> Rj

assignment edge Rj -> Pi

 

-> 그래프에 cycle(순환)이 없으면 Dealock이 아니다

그래프에 cycle이 있는 경우, 

자원의 인스턴스가 하나만 존재할 때 Deadlock이 발생한다

자원의 인스턴스가 여러 개 존재하는 경우 Deadlock일수도 있고, 아닐수도 있다

'CS지식 > 운영체제' 카테고리의 다른 글

TIL 정리_98(Deadlock&Memory)  (0) 2022.05.25
TIL 정리_97(Deadlock)  (0) 2022.05.24
TIL 정리_95(동기화 관련 문제(2))  (0) 2022.05.22
TIL 정리_94(동기화 관련문제)  (0) 2022.05.21
TIL 정리_86  (0) 2022.05.13