P(S) {
// Busy Waiting 문제가 여전히 존재한다.
// ready Queue를 통해 해결 가능
while(S <= 0) do
endwhile;
S <- S-1;
}
V(S) {
S <- S + 1;
}
Busy waiting 문제 해결
struct semaphoe {
int count;
queueType queue;
};
semaphoe S;
// wait 연산 P
wait(S) {
S -> count--;
if(S -> count < 0) {
add this process to S -> queue; // 프로세스를 준비 큐에 추가
block(); // 프로세스 중단
}
}
// signal 연산 V
signal(S) {
S -> count++;
if (S -> count <= 0) {
remove a process P from S -> queue; // 준비 큐에서 제거
wakeup(P) // 신호를 보내 프로세스 실행
}
}
Monitor monitor_name
{
// 공유 데이터 변수 선언
procedure P1( ... ) {
...
}
procedure P2( ... ) {
...
}
.
.
.
procedure Pn( ... ) {
...
}
initialization_code( ...) { //초기화
...
}
}
운영체제:그림으로 배우는 구조와 원리 - 한빛 아카데미