프로세스 동기화(2)- 세마포어

|


세마포어


세마포어란?

  • 정수 값을 가지는 변수로서, 멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법으로 사용된다

  • P와 V 명령에 의해서만 접근가능하다

  • 추상자료형으로서, P와 V 명령을 수행할 때 원자적으로 수행된다고 가정하고 사용한다


구현 방법

  1. busy waitng
    • 비효율적, 어느 프로세스가 먼저 임계 영역에 들어갈지 결정할 수 없다
P(S) {
     while S <=0; // 아무것도 하지 않음 (반복문)
     S--;
 }

 V(S) {
     S++;
 }


  1. block/wake-up
    • busy waiting을 개선한 방법
 P(S) {
     S--;
     if S < 0
         // 이 프로세스를 재움 큐에 추가 (잠 듦)
 }

 V(S) {
     S++;
     if S <= 0
         // 재움 큐로부터 프로세스를 제거 (깨어남)
 }


세마포어의 종류

  1. Counting Semaphore
    • 초기값은 가능한 자원 수로 정해진다
    • 주로 resource counting에 사용한다
  2. binary Semaphore
    • 세마포어 값으로 0 또는 1을 가진다
    • 주로 mutual exclusion (lock/unlock)에 사용한다


주의점

  • dead-lock 또는 starvation 발생 할 가능성이 존재하므로 사용시 유의해야한다


ref. KOCW

ref. wiki