[개발일지]/필기

Process Synchronization 2 - Semaphores

broship 2021. 8. 26. 08:39

Semaphores 세마포어(추상화):

- 세마포어 변수는 int형 변수(S)가 들어간다

- 공유자원을 획득하고 반납하는걸 세마포어가 처리해줌

- P연산은 공유자원을 획득하는 과정, V연산은 자원을 반납하는 과정

- S 에는 자원 개수가 들어감, lock, unlock일때는 1인 경우를 생각하면 됨

- 세마포어 변수 mutex를 1로 두고 들어갈때 P연산, 나올때 V연산 하면됨

- 추상자료형(?)이기 때문에 이렇게 작성하고 P연산과 V연산을 어떻게 구현할지는 그떄그떄 구현할 시스템에 맞게 구현해야됨

 

- 이것도 busy waiting 문제가 발생함, Block & Wakeup(sleep lock) 방식을 사용하면 좀더 효율적으로 구현할수있음

- 세마포어를 세마포어변수 value와 wait queue인 L로 구성

- 세마포어변수를 누가 사용중이면 CPU를 낭비하지 않고 blocked상태로 두고 wait queue에서 기다림

- 누가 세마포어 변수를 반납하면 wait queue에서 하나를 꺼내서 활성화시킴

- 실제 구현시 아래와 같이 됨

- P연산에는 무조건 value를 하나 감소시킴

- value가 0보다 작을시 누군가가 세마포어를 사용중이므로 wait queue에 넣고 block 상태에 들어감

- 누군가가 세마포어를 다 쓰고 깨워주면 그때 세마포어를 사용

 

- 사용을 완료하고 V 연산에는 value를 하나 증가시킴

- 하나 증가시켰는데도 불구하고 value가 0이하시 누군가가 wait queue에서 기다리고 있다는 뜻이므로 wait queue에서 하나의 프로세스를 깨움

 

- busy waitting일때 value는 사용할수 있는 자원의 개수를 의미

- Block & wakeup 방식은 음수일때는 누군가가 사용하고 있어서 기다려야 하고, 양수일때는 자원이 남아있어 기다리지 않고 바로 사용할수 있다는 상태를 의미

- 일방적으로는 Block & wakeup 방식이 더 효율적이나 critical section의 길이가 매우 짧을 경우 block하고 wake하는 오버헤드가 더 커질수도 있음

 

 

세마포어 사용시 발생할수 있는 문제:

- 세마포어가 S,Q인데, 프로세스가 일을 하기 위해선 S,Q둘다 얻어야지만 실행 가능함

- 만약 P0이 S를 획득하고, P1이 Q를 획득한 상태에서는 무한히 서로의 껏만 기다리는 문제점이 발생할 수 있음

- 이 경우는 무조건 S를 얻고 그 다음 Q를 얻게 정해주는 방식으로 자원을 얻는 순서를 정해주면 문제를 해결할수있음

'[개발일지] > 필기' 카테고리의 다른 글

Process Synchronization 4 - monitor  (0) 2021.09.01
Process Synchronization 3 - classical problems  (0) 2021.08.29
Process Synchronization1 - lock and unlock  (0) 2021.08.22
CPU Scheduling Algorithms  (0) 2021.08.16
CPU Scheduling  (0) 2021.08.15