동기화를 위한 대표적인 도구를 배운다.
뮤텍스 락, 세마포, 모니터에 대해 알아보자
탈의실 = 하나의 공유 자원
대기줄 사람들 = 프로세스
탈의실에 프로세스가 들어가면 문을 잠근다.
다음 번 사람은 문이 열렸는지 계속 확인한다.
뮤텍스 락은
동시에 접근해서는 안되는 자원에 동시에 접근하지 않도록 만드는 도구
상호 배제를 위한 동기화 도구
즉 크게
acquire(){
while(lock==true)
;
lock=true;
}
release() {
lock = false;
}
하나의 프로세스는 아래와 같이 구성된다.
acquire()
//임계구역
release()
프로세스는 공유자원이 잠겨있는지 계속 확인해야 하는데 이와 같은 대기 방식을 "바쁜 대기(busy wait)"라고 한다.
= 뮤텍스 락 + 하나의 공유 자원에서 여러 개의 공유 자원
= 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 조금 더 일반화된 방식의 동기화 도구
세마포가 어떻게 구현되는지 간략하게 살펴보자
wait(){
while(S <= 0)
;
S--;
}
signal(){
S++;
}
하나의 프로세스는 아래와 같다.
wait()
//임계구역
signal()
그러나 뮤텍스 락과 마찬가지로 바쁜 대기가 발생한다.
따라서 실제로 세마포는 더 좋은 방법을 사용한다.
앞서 발생하는 바쁜 대기를 해결
wait() {
S--;
if(S<0){
add this process to Queue;
sleep();
}
}
signal(){
S++;
if(S<=0){
remove a process p from Queue
wakeup(p)
}
}
먼저 실행할 프로세스
// 임계구역
signal()
나중에 실행할 프로세스
wait()
//임계구역
세마포 앞 뒤로 wait()와 signal() 불편하다
wait()와 signal()의 순서를 헷갈리거나 중복해서 사용하거나 혹은 아예 빠트리는 경우가 생길 수 있음
사용자가 사용하기에 훨씬 쉬운 도구인 모니터
모니터란
공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리한다. 그리고 반드시 프로세스는 인터페이스를 통해서만 공유 자원 접근 가능
공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록 상호 배제를 위한 동기화 기법
조건 변수를 사용한다.
조건 변수란
프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
조건변수는 wait와 signal 연산을 수행한다.
모니터에 접근한 어떤 프로세스가 조건 x에 대한 wait를 호출하면
조건 변수 x에 대한 큐에 그 프로세스가 산입된다.
빈 모니터에 다음 프로세스가 들어온다.
다른 프로세스의 signal 연산을 통해서 큐에 대기된 프로세스는 실행이 재개된다.