Semaphores은 앞의 방식들을 추상화시킨 일종의 추상자료이다. 공유자원 획득과 반납을 도와준다
Semaphores s #자원의 개수
# p연산: 공유데이터 획득
while(s<=0) do no-op;
s--
# v연산: 공유데이터 반납, lock을 푼다
s++
자원이 없으면 while문을 돌면서 대기한다. 자원이 생기면 개수를 하나 줄이고 사용한다. 다 사용하게 되면 자원의 개수를 다시 늘린다.
critical section 문제에 Semaphore 적용
Semaphore mutex;
do{
p(mutex);
critical section
v(mutex)
remainder section
} while(1);
busy wait는 효율적이지 못함(=spin lock)
Semaphore를 다음과 같이 정의한다
typedef struct
{
int value;
struct process *L
}Semaphore
Semaphore에 Block wakeup방식을 적용
# p연산
s.value--;
if (s.value<0)
{ add this process to s.L;
block();
}
# v연산
s.value++;
if (s.value<=0)
{ remove a process P from s.L;
wakeup(p);
}
세마포어를 획득할수 없으면 block 하고 자원이 생기면 wakeup시킨다
Busy wait vs Block wakeup
- critical section의 길이가 긴 경우 Block wakeup이 적당
- critical section의 길이가 매우 짧은 경우 Block wakeup 오버헤드가 Busy wait 오버헤드보다 더 커질 수 있음
- 일반적으로는 Block wakeup 방식이 더 좋음
Deadlock
둘 이상의 프로세스가 서로 상대방에 의해 충족될 수 있는 event를 무한히 기다리는 현상
반응형
'CS(Computer Science) > 운영체제' 카테고리의 다른 글
[운영체제] Concurrency Control 병행 제어 (0) | 2023.02.15 |
---|---|
[운영체제] 프로세스 동기화의 고전적인 문제 (0) | 2023.02.08 |
[운영체제] 프로세스 동기화 문제 & 해결방법 (0) | 2023.02.07 |
[운영체제] 프로세스 동기화 & Race Condition (0) | 2023.01.31 |
[운영체제] CPU 스케줄링 (0) | 2023.01.30 |
댓글