[OS] 프로세스 동기화 : Semaphore과 P, V Operation

parkheeddong·2023년 4월 16일
0

Operating System

목록 보기
23/63
post-thumbnail

📌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 문제 등에 사용된다.

0개의 댓글