모니터는 mutual exclusion 보장 , critical section 에서의 대기 이 두가지 기능을 제공하는 동기화 툴이다.
이 모니터는 언제 사용하나? 한 번에 하나의 스레드가 실행되어야 하고, 여러 스레드가 협업이 필요할 때 사용한다.
mutex lock ( 뮤텍스 락)
Critical Section 에서 mutual exclusion 을 보장하기 위해 사용
wait() : 한 스레드가 condition varaibled을 갖고 동작을 수행하고 있다면, 자기 자신을 이 condition variable의 waiting queue에 넣고 대기상태로 전환하게 된다.
signal() : 한 스레드가 동작을 마무리할 때, condition variable의 waiting queue 에서 대기중인 스레드 중 하나를 깨운다.
broadcast() : 한 스레드가 동작을 마무리할 때, condition variable의 waiting queue 에서 대기중인 스레드 전부를 깨운다.
acquire(m) //모니터락 취득(뮤텍스 락)
while (!p){ //조건확인
wait(m,cv) //조건 충족 안되면 waiting (entry queue)
}
작업 수행
signal(cv2) or boradcast(cv2) //waiting하고 있는 thread들 깨움
release(m) //모니터 락 반환 (뮤텍스 락)
문제 : 제한된 크기의 버퍼에서 생산자와 소비자가 아이템을 생산,소비하는 과정에서 발생 할 수 있는 문제를 다루는데, 소비자 입장에서 버퍼에 아이템이 없으면 계속 버퍼에 아이템이 있는지 확인해야하고, 생산자 입장에서는 버퍼가 꽉 찾을 때 버퍼에 자리가 생길 때까지 반복적으로 확인해야한다.
생산자 소비자 무도 공틍오르 사용할 변수
q : 생산자가 버퍼에 아이템을 넣으면 소비자가 버퍼에서 아이템을 꺼내서 처리
lock : 모니터의 뮤텍스 락
fullCV : 생산자가 아이템을 버퍼에 넣으려다 버퍼가 찼다면, 버퍼에 공간이 생길 때까지 fullCV condition varaible의 waiting queue에서 기다리게 된다.
emptyCV: 소비자가 아이템을 버퍼에서 꺼내려고 했는데 버퍼에 아이템이 없다면, empty condition variable의 waiting queue에서 기다리게 된다.
producer(), consumer() 모두 같은 뮤텍스 락으로 크리티컬 섹션을 보호하고 있다. 서로 다른 두 critical section 이지만, 같은 뮤텍스 락이 걸려있기 때문에 동시에 실행 x
쉽게 설명하면 생산자 스레드가 producer() 하는동안 소비자가 consumer()를 할 수없다는 의미
모든 자바 객체에는 내부적으로 모니터를 갖는다. 모니터의 mutual exclusion 기능은
synchronized 키워드로 사용한다
함수앞에 사용할 synchronized를 붙여서 사용할 수 있고 synchronized(객체명){} 블록형식으로도 사용 가능하다.
자바의 모니터는 condition variable 한 개를 갖는다.
-wait , notify(signal) , notifyAll ( broadcast)
다음과 같은 예시가 있다. 직접 ide에서 쳐보고 작동하는 것을 확인해보자.
https://www.youtube.com/watch?v=Dms1oBmRAlo&list=PLcXyemr8ZeoT-_8yBc_p_lVwRRqUaN8ET&index=28