[Java] Monitor

한호성·2022년 6월 13일
2

Synchronization

목록 보기
2/2

Monitor

개념

모니터는 mutual exclusion 보장 , critical section 에서의 대기 이 두가지 기능을 제공하는 동기화 툴이다.

이 모니터는 언제 사용하나? 한 번에 하나의 스레드가 실행되어야 하고, 여러 스레드가 협업이 필요할 때 사용한다.

구성요소

mutex lock ( 뮤텍스 락)

  • critical section 에서 mutual exclusion을 보장하기 위해 사용됨.

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)						//모니터 락 반환 (뮤텍스 락)

모니터로 Bounded Producer /Consumer Problem 해결하기

문제 : 제한된 크기의 버퍼에서 생산자와 소비자가 아이템을 생산,소비하는 과정에서 발생 할 수 있는 문제를 다루는데, 소비자 입장에서 버퍼에 아이템이 없으면 계속 버퍼에 아이템이 있는지 확인해야하고, 생산자 입장에서는 버퍼가 꽉 찾을 때 버퍼에 자리가 생길 때까지 반복적으로 확인해야한다.

생산자 소비자 무도 공틍오르 사용할 변수

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에서 쳐보고 작동하는 것을 확인해보자.

Reference

https://www.youtube.com/watch?v=Dms1oBmRAlo&list=PLcXyemr8ZeoT-_8yBc_p_lVwRRqUaN8ET&index=28

profile
개발자 지망생입니다.

0개의 댓글