오퍼레이팅 시스템 [11] - 조건동기화
‘조건동기화란?’
조건동기화
- Condition Synchronization
- 전 챕터에서 알아본 상호배제뿐만이 아니라 특정 조건에서 동기화를 시키는 조건 동기화라는 개념이 필요하다.
Condition Variable(CV)
프로세스가 특정 조건을 만족하기 전까지 Block시키는 Data Type
CV는 특정 조건을 만족할 때 까지 기다릴 Waiting Queue가 필요하다.
Operations
wait()
: 조건을 만족하지 않으면 sleep시킨다.signal()
: 조건을 만족하면 하나의 기다리는 Thread를 깨운다.broadcast()
: 모든 대기중인 Thread들을 깨운다.
* pthread API : POSIX calls
1. pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m);
2. pthread_cond_signal(pthread_cond_t *c);
3. pthread_cond_broadcast()
- Mutex와 함께 사용되도록 설계되어있다.
join()의 예시
JAVA에서 Thread 클래스의
join()
메소드를 본적이 있을것이다.이번엔 POSIX의 pthread API 함수를 이용하여 이의 작동 방식을 구현해 보도록 하겠다.
join()
이란 Thread를 제어할 수 있는 함수로, 다른 Thread의 작업이 종료될 때까지 기다리게한다.
- 필요조건들
- State Variable : Thread 실행에 필요한 조건 변수
- 조건 변수를 위한 상호배제 LOCK
- 조건 변수의 상태를 확인하기 위한 LOOP Checking
- 부모 Thread
//file: "Thread-1"
int main(){
pthread_t c;
pthread_create(&c, NULL, child, NULL) //자식스레드 생성
thr_join(); //생성한 자식스레드가 종료될때까지 대기하는 함수
//좀비 스레드를 예방한다.
return 0;
}
void thr_join(){
pthread_mutex_lock(&m);//Mutex를 활용한 조건변수에 접근을 막는 상호배제
while(done == 0){//done = 조건변수
pthread_cond_wait(&c, &m);//signal(&c)를 할때까지 sleep
/*이때 Mutex 객체를 매개변수로 받는 이유는, 앞서 상호배제를 위해 한 LOCK을 풀고 sleep 함으로서,
자식 스레드가 실행되어 exit()함수를 실행할수 있게 하기 위함이다.
일어나면 다시 LOCK을 건다.*/
pthread_mutex_unlock(&m);
}
}
- 자식 Thread
//file: "Thread-2"
void* child(void* arg){
thr_exit();//Thread를 종료시키며 부모 Thread에게 알린다.
return NULL;
}
void * thr_exit(){
pthread_mutex_lock(&m);
done = 1; //부모 Thread의 실행 조건을 만족시켜준다.
pthread_cond_signal(&c);//깨우는 함수 signal
pthread_mutex_unlock(&m);
}
State Variable(조건변수)가 없거나 Mutex를 이용한 상호배제가 없으면 무한히 Sleep 되는 등의 치명적인 오류가 발생한다!