📌Process의 busy waiting을 방지하는 방법
1. Semaphore
1) 정수형 변수
2) Encapsulation
➡️ 아무나 접근하지 못하는 Protected 변수 (Encapsulation)
➡️ P, V, 초기화 Operation 3가지 만이 접근 가능하다.
3) I/O Queue
➡️ Semaphore 변수 s가 생기면, Semaphore로 인해 sleep하는 프로세스들이 놓여 있을 I/O queue Q가 생긴다.
typedef struct{
int value;
struct process *list; // queue
} semaphore;
2. semaphore의 operation
1) 초기화 operation
2) P() : Wait
✔️ CS 진입하려는 프로세스가 CS에 다른 프로세스가 있으니 sleep하겠다는 것
➡️ semaphore 변수 s가 0보다 크면, s의 값을 1만큼 줄인다.
➡️ s가 0이면, queue로 보내어서 wait하게 한다. (process를 running 상태에서 sleep 상태로 보낸다)
3) V() : Signal
✔️ CS에 있던 프로세스가 CS를 나갔다는 시그널로 Sleep queue의 프로세스를 wake up
➡️ queue에 가서, 대기 중인 프로세스가 있다면 그 중 하나를 wakeup 시킨다.
➡️ 대기 중인 프로세스가 없다면, semaphore 변수 s를 하나 증가시켜라.
=> P, V는 기계어 명령처럼 Indivisible한 operation이다. ❌중간에 인터럽트를 받으면 안 된다!❌
3. semaphore의 종류
1) Binary Semaphore
semaphore 변수 s가 0 / 1중 하나를 가지는 변수
Mutual Exclusion이나 process synchronization에 사용된다.
2) Counting Semaphore
semaphore 변수 s가 0이 아닌 정수값을 가지는 변수
producer-consumer 문제 등에 사용된다.