본문 바로가기
CS(Computer Science)/운영체제

[운영체제] Semaphores

by whdgus928 2023. 2. 8.

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를 무한히 기다리는 현상

 

 

 

반응형

댓글