Operating System/O.S(Neso Academy, HPC Lab. KOREATECH)

HPC Lab) Semaphore + event count , Monitor

Tony Lim 2021. 5. 18. 15:22
728x90

Eventcount

정수형 변수 , 생성시 0으로 초기화 , 감소하지 않음

특정 사건의 발생횟수를 기록 

read(E) , advance(E) , await(E,v) 연산으로만 접근 가능 , 은행에서 창구마다 있는 대기번호라고 생각하면 됨

 

read(E) = 현재 Eventcount 값 반환

advance(E) = E 를 하나 증가시키고 해당 E (창구에서 처리하고 있는 번호) 를 기다리고 있는 프로세스를 깨워준다.

await(E,v) = E < v , 즉 현재 받은 대기번호가  창구에서 처리하고 있는 번호보다 크면 당연하게 기다려야한다. Queue에서 기다리게 함

Pticket , Cticket 각각 존재한다. 처음 대기표를 부여 받는 것이다. 

await(In, t) = 현재 처리하고 있는 In 보다 받은 대기번호(t) 가 더 크면 당연히 기다려야한다. 

advance(In) = In(Producer의 창구번호)을 증가시키고 Queue에서 기다리고있는 Consumer 가 존재하면 해당 In 대기번호를 소지하고 있는 process를 깨워준다. 

이 둘 안에 있는 critical section 에는 하나의 프로세스만 진입가능하다.

await(Out , t - N +1 ) = 현재 buffer 에 자리가 있나? 
buffer 의 남은 공간은 = N(total) - t(거쳐간 Producer들의 숫자) + out (소비하고 비어있는 , 즉 consumer 창구번호) 
이것이 1 보다 크냐? 를 의미한다.

await(In , u+1) = 현재 buffer 안에 자원이 있나?
남아있는 자원은 = In(현재 Producer의 창구번호, 즉 이만큼 쌓아두었다) - u (지나간 전체 Consumber , 대기번호) 
이것이 1보다 크냐? 를 의미한다.

이제 더 이상 프로세스 starvation 이 일어나지 않는다. 

 

Monitor (Language level construct)

위의 과정을 언어 레벨에서 서포트해줘서 개발자로 하여금 사용을 용이하게 해준다.

 

모니터의 구조  (모니터 == 일종의 Critical Section)

Entry queue(진입큐) = 모니터 내의 procedure 수만 큼 존재 

Mututal exclusion = 모니터내에는 하나의 프로세스만 진입

Information hiding = 공유 데이터는 모니터 내의 프로세스만 접근 가능

Condition queue = 모니터 내의 특정 이벤트를 기다리는 프로세스가 대기

Signaler queue = 모니터에 항상 하나의 프로세스가 존재해야하기 떄문에 자원을 다 쓴 프로세스가 잠시 여기 들어가고 Condition queue에서 기다리고 있는 애에게 Signal 을 주고
기다리고 있는 프로세스가 가지고 자원을 나가면
이제 다시 들어와서 남은 일을 처리한다.

 

 

맨처음 해당 numberForks buffer 들을 2개로 초기화 해준다. 

pickup procedure 에서는 자신에게 부여된 포크가 2개인지 확인하고 아니면 condition queue에서 기다린다.
존재한다면 해당 resource들을 -1 씩 해준다.

putdown procedure 에서는 자원을 다소비했으니 해당 resource 들을 +1 씩 해준다.
그리고 양옆에 이제 부여된 포크가 2개가 된다면 기다리고 있었던 해당 프로세스에게 signal 을 날려준다.

Java , C 가 지원하고있다.

 

 

 

728x90