상호배제:EventCount/Sequencer

MoOrY·2022년 11월 16일
0

운영체제

목록 보기
12/20

semaphore의 문제점인 wake-up이 비결정적임을 해결하기 위한 방안
은행의 번호표와 비슷한 개념

Busy waiting 문제 해결
Starvation(무한대기현상) 문제 해결
Semaphore보다 더 low level control이 가능하다

Sequencer

정수형 변수이며, 생성시 0으로 초기화, 감소하지 않는다
발생 사건들의 순서를 유지하며
ticket()연산으로만 접근가능하다

ticket(S)

현재까지 ticket()연산이 호출된 횟수를 반환
Indivisible operarion

Eventcount

정수형 변수
생성시 0으로 초기화, 감소하지 않는다
특정 사건의 발생 횟수를 기록
read(E), advance(E), await(E,v)연산으로만 접근 가능
현재 몇명이나 불렀는가를 기록하는 숫자

read(E)

현재 Eventcount값 반환

advance(E)

E <- E+1
E를 기다리고 있는 프로세스를 깨움(Wake-up)

await(E,v)

V는 정수형 변수
if(E < v)이면 E에 연결된 Qe(대기열)에 프로세스 전달(push)
->E는 현재 창구의 호출번호, v는 자신의 번호표 숫자라고 생각하고,
자신의 번호가 창구번호보다 크다면 기다린다

ME Solution


1. 임계영역에 진입하려 할때, v변수를 sequencer변수의 값으로 업데이트.
2. await변수로 sequencer변수(v)와 EvecntCount변수를 비교
3. E > v일때 임계영역 진입. 아니라면 ready queue에서 asleep상태로 대기
4. 일을 마치고 나올 때 E를 E+1로 변경하고, Ready queue에 있는 작업을 깨운다

생산자-소비자 문제 Sulution

생산자용, 소비자용 총 2개의 sequencer, eventcount을 사용
각각 2번째 await(Out, t-N+1)와 await(In, u+1)의 수식은
버퍼에 용량이 있는지, 채워져 있는지 확인하는 작업

즉 첫번째 await로는 버퍼에 한명씩만 접근할 수 있도록 확인하는 작업
두번째 await는 버퍼에 용량이 있는지 채워져 있는지 확인하는 작업

profile
필기용 블로그입니다.

0개의 댓글