우리네 장
[ 동기화 #4 ] 모니터 본문
모니터 또한 동기화 메커니즘 중 하나이다.
모니터의 목적 ?
- 상호 배제 구현
- 특정 조건에 부합할 경우에만 임의의 스레드 로직을 실행하는 것.
→ 조건 별 실행 여부를 제어할 수 있다.
모니터는 뮤텍스 Lock 과 Condition 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 |