[OS] 프로세스 동기화 : Semaphore와 Spinlock

parkheeddong·2023년 4월 17일
0

Operating System

목록 보기
26/63
post-thumbnail

1. Semaphore-based Solution의 특징

1) No busy waiting

Busy Waiting 과정이 없다.
Critical Section의 진입을 위해서 Loop을 돌지 않는다.

2) No scheduling for wakeup

Wakeup을 할 때 스케줄링을 하지 않는다. 여러개의 process가 queue에서 기다릴 수 있는데, 한 프로세스를 wakeup 시켜주는 V연산을 할 때 '그들 중 아무거나 하나 깨우는 것'이다.
먼저 들어온 프로세스를 깨우는 것도 아니고, 스케줄링이 정해져 있지 않다.
따라서 Starvation이 발생할 수도 있다.

2. Spinlock

1) 정의

Spinlock은 정수형 변수이다.(Integer Variable0
초기화 연산, P연산과 v연산에 의해서만 접근 가능한 보호 받는 변수이다.

✔️ Semaphore과의 차이점

spinlock에서는 Sleep queue가 존재하지 않는다.
즉, spinlock은 busy waiting을 하는 semaphore이다.

=> Spinklock은 P연산에서 s<=0이면 loop을 돈다.
=> V연산에서도 Wakeup 에 대한 부분은 없다!

2) Spinlock으로 Mutual Exclusion 하기

Active라는 Spinlock 변수

process가 CS에 진입을 시도할 때에는 p연산을 수행한다. CS에서 나올 때에는 V연산을 수행한다.

전체적인 구조는 semaphore와 동일하지만, 차이점은 P연산과 V연산의 내용이 다르다는 점이다.

➡️ busy waiting을 하는 것이 좋은가, 안 하는 것이 좋은가?!

경우에 따라 다르다!

특별히 하는 일 없이 cpu를 사용만 한다는 점에선 busy waiting은 좋지 않다.
그러나 sleep을 하는 것은 Context Switching을 해야 한다는 것이고, 이것은 커널의 개입이 필요하다. Context Switching 자체도 오버헤드이기 때문에 좋지 않다.

따라서 Spinlock은 context switching은 안 해도 되지만 cpu자원의 낭비라는 단점이 있고 Semaphore의 단점인 Context Switching 오버헤드가 있다.

그런데 만약 단일 cpu인 상황에서는 무조건 Semaphore을 사용해야 한다.
반면 cpu가 여러개 있다면, 그리고 lock 기간이 너무 길지 않다면 spinlock을 사용하는 것이 더 좋은 방법일 수도 있다.

현재 리눅스, 솔라리스2, 윈도우즈는 spinlock 을 사용하고 있다.

0개의 댓글