우리네 장

[ 동기화 #3 ] 세마포어 본문

OS

[ 동기화 #3 ] 세마포어

qpmi1zm29 2023. 12. 27. 02:58

세마포어는 뮤텍스와 비슷하지만, 몇 가지 차이점이 존재한다.

1. 여러 개의 스레드 혹은 프로세스가 임계 영역에 접근할 수 있다. 
 - 즉, N개의 lock을 가질 수 있다.

2. lock을 획득한 주체가 아닌 다른 스레드 혹은 프로세스가 해제 할 수 있다.

 

 

public class Semaphore {

    private volatile int value = 3;
    private volatile int guard = 0; 
    //value 일종의 여러개의 T/P가 공유하는 공유자원 이므로, 임계영역으로 보호해주기 위해 추가된 변수이다.
    //guard 사용하게 되면 lock과 unlock이 동시에 발생하는 경우를 막아준다.

    public void wait() {
        //acquire lock
        while ( test_and_set ( &guard ) );
        if ( value == 0 ) {
           //스레드를 entry queue에 삽입 
        } else {
            value -= 1; //lock 하나 감소
        }
        guard = 0;
    }

    public void signal() {
        //release lock
        while ( test_and_set (&guard) );
        if ( queue에 하나라도 대기 중이라면 ) {
            //해당 스레드 실행
        }else {
            value += 1; //lock 하나 증가
        }
        guard = 0;
    }
    
}

 

구현 코드 자체는 뮤텍스와 큰 차이를 보이지 않는다.

 

value ( 여기선 lock 의미 ) 값이 1일 경우, 이진 세마포어 라고 하고,

값이 2,3,4 ... 일 경우 카운팅 세마포어 라고 한다.

 

 

그렇다면 이진 세마포어 일 경우, 뮤텍스와 동일하다고 봐도 될까?

NO!

1. 위에서 언급한 대로 뮤텍스는 lock을 획득한 주체 ( T/P )만 해제 할 수 있다.

2. 뮤텍스는 priority inheritence를 가진다.


priority inheritence ?
- 우선순위가 낮은 테스크 ( A ) 가 lock을 가지고 있고 + 그 lock을 대기 중인 테스크 ( B )가 우선순위가 높을 경우
A가 우선순위가 낮기 때문에 스케쥴링에서 뒤로 밀려 B가 우선순위가 높음에도 불구하고 실행이 지연되는 현상이 발생한다.

이 경우 B의 실행을 위해서 A의 우선 순위를 B만큼 높여주는 것을 Priority Inheritence라고 한다.


 

 

 

또한 세마포어는 테스크 간의 실행 순서를 제어할 경우에도 사용되는데,

이 때 lock의 값은 무조건 0으로 시작해야 한다.

 

P1 ( 프로세스 ) : task1 로 구성

P2 ( 프로세스 ) : task2, task3 으로 구성

 

이때, task1 > task3 보다 무조건 먼저 실행되도록 하고 싶을 경우, 위 그림처럼 구성하면 된다.

 

1. P1이 먼저 실행되는 경우

1 ) task 1 이 task 2 보다 먼저 종료

2 ) signal () 실행 → value = 1 로 store

3 ) P2 의 wait () 실행 lock을 획득하고 바로 넘어감

4 ) P2의 task 3 실행

 

이 경우 task1이 먼저 실행되는 것이 자연스럽다.

 

1. P2가 먼저 실행되는 경우

1 ) task 2 이 task 1 보다 먼저 종료

2 ) wait () 실행 → value = -1 로 store

3 ) P2 의 task 3을 실행하려고 하였으나 lock 획득 실패 → 큐로 진입

4 ) P1의 signal () 실행 → 큐에서 task 3 꺼내와서 실행

 

P2가 먼저 실행되는 경우에도 task1의 선실행을 보장한다.

'OS' 카테고리의 다른 글

[ 동기화 #4 ] 모니터  (1) 2023.12.27
가시성 feat.volatile  (0) 2023.12.27
[ 동기화 #2 ] 뮤텍스  (3) 2023.12.27
[ 동기화 #1 ] 스핀락  (0) 2023.12.27
[ OS ] 동기화 기법 소개3_Thread.join() 분석해보자!  (1) 2022.10.02