우리네 장

[ 동기화 #4 ] 모니터 본문

OS

[ 동기화 #4 ] 모니터

qpmi1zm29 2023. 12. 27. 18:40

모니터 또한 동기화 메커니즘 중 하나이다.

모니터의 목적 ?
- 상호 배제 구현
- 특정 조건에 부합할 경우에만 임의의 스레드 로직을 실행하는 것.
→ 조건 별 실행 여부를 제어할 수 있다.

 

 

모니터뮤텍스 LockCondition Variable 로 구성되어 있다.
- 상호 배제 구현을 위해 뮤텍스 Lock을 사용한다.
- Lock을 획득하려 하였으나 취득하지 못한 스레드는 뮤텍스가 가진 entry queue에서 wait 상태로 전환된다.
- entry queue는 무조건 FIFO로 구현된 것은 아니다. 내부 요소들에 모두 같은 가중치를 두고 경합을 벌여 우선순위를 결정하는 구현체도 존재한다.

- " 조건 별 실행 여부 "를 Condition Variable ( CV ) 로 구현하는데, 모니터 하나에 n개의 CV가 존재할 수 있다.
- 만약 스레드가 Lock을 획득하였으나, CV의 조건을 충족하지 못 할 경우, 해당 스레드는 wait 상태로 전환되고
CV 고유의 waiting queue에서 대기하게 된다.
- CV 에 사용되는 조건 문은 반드시 while 루프 안에서 실행되어야 한다. 

 

 

모니터 연산 ?

wait ( lock, cv ) : 스레드 실행 조건을 충족하지 못한 경우, 스레드가 가진 lock을 반납하고, cv 소유의 waiting queue를 통해 스레드를 wait 상태로 전환한다.

signal ( cv ) : cv 소유의 waiting queue에 대기 중이던 스레드 중 하나를 깨우는 역할을 한다.

broadcast ( cv ) : cv 소유의 waiting queue에 대기 중이던 스레드 모두를 깨우는 역할을 한다.

 

 

모니터를 통해 블로킹 큐를 구현할 수 있다. ( 아래는 수도코드 )

1개의 뮤텍스 lock과 2개의 ConditionVariable이 사용되었다.

buffer.isFull() 과 buffer.isEmpty() 가 스레드 실행 조건문 부분이다.

public class Monitor {

    global volatile Buffer buffer; 
    global volatile Lock lock;

    global CV fullCV;
    global CV emptyCV;

    public method producer() {
        while ( true ) {
            Item item = new Item();

            lock.acquire();

            if ( buffer.isFull() ) {
                wait( lock, fullCV );
            }

            buffer.enQueue(item);

            //이후 로직 

            signal( emptyCV ) or broadcast( emptyCV );

            lock.release();
        }
    }

    public method subscriber() {
        while ( true ) {
            lock.acquire();

            if ( bufer.isEmpty() ) {
                wait( lock, emptyCV );
            }

            Item item = buffer.deQueue();

            //이후 로직

            signal( fullCV ) or broadcast ( fullCV );

            lock.release();
        }
    }
}

 

 

 

'OS' 카테고리의 다른 글

우분투는 Dash shell!  (2) 2024.03.08
[ 동기화 #5 ] 모니터 in JAVA  (2) 2023.12.27
가시성 feat.volatile  (0) 2023.12.27
[ 동기화 #3 ] 세마포어  (1) 2023.12.27
[ 동기화 #2 ] 뮤텍스  (3) 2023.12.27