[OS] Monitor(모니터)
2020. 4. 25. 18:08ㆍProgramming/CS
모니터
저번 포스팅에서 상세히 다루었던 세마포는 사실, 조금 오래된 동기화 도구였단 사실! 짜잔!
java에서는 특히나 이 monitors를 동기화 도구로 사용하고있다. 세마포가 어셈블리 수준이었다면 monitor는 high level language수준이라고 볼 수 있다!
이미지 출처 : https://user-images.githubusercontent.com/34755287/54345852-3bd73680-4687-11e9-8c99-236870a019d9.png
- 공유자원 + 공유자원에 접근하는 함수 + 2개의 Queue(배타동기, 조건동기)로 구성되어있다.
- 최대 1개의 쓰레드만 공유자원접근함수에 들어갈 수 있고, 그 이상 들어가려고 하면 waiting해야한다.
- mutual exclusion (Queue): 상호배타 - 많은 쓰레드가 있어도 오직 한 쓰레드만 접근할수있다
- conditional synchronization (Queue) : 조건분기 - 블락되고 기다림
wait()
: Thread가 이미 공유자원접근함수에 들어가있으면 block되고, 기다려야함modify()
: 아까 conditional Sync Queue에서wait()
하고있는 Thread를 깨워 다시 common variable 접근 함수를 실행하게끔 해줌 -> 새 쓰레드 진입 가능(새 쓰레드는 conditional Sync 로 block된 쓰레드를 깨울 수 있음)
자바 모니터
자바에서는 모든 객체가 모니터가 될 수 있다.
- mutual exclusion : 세마포처럼 배타동기를 위해
acquire()
를 호출할 필요 없이,synchronized
키워드를 사용하여 지정한다 - conditional Synchronization :
wait()
-큐에 갇혀라!,notify()
-깨워라,notifyAll()
-다깨웟! 메서드를 사용한다
class C{
private int commonVal;
synchronized void f() {
// f가 호출되면 g는 호출되지 못함 (mutual exclusion해야하니까)
...
}
synchronized void g() {
...
}
void h() {
// 공통변수를 업데이트 하는 함수가 아니라는 뜻 (다른 common value를 사용하는 쓰레드와 같이 실행가능)
...
}
}
semaphore vs monitor
동기화에서 중요한것은 1. mutual exclusion해야하기때문(critical Section에는 오직 하나만)이었다.
- 세마포(semaphore) : critical Section 앞에서 semaphore.acquire(), 나가면서 semaphore.release() 해줬었음. 그리고 세마포의 초기값은 1로 두었음
- 모니터(monitor) :
synchronized
만 붙여주면 됨 !
사용이 간단해졌다 ㅎㅎ.
2.로는 순서 정하기였다.
- 세마포(semaphore) :
acquire()
, #기록, 비교하는과정거쳐release()
- 모니터(monitor) :
wait()
,notify()
좀 더 깔끔해지고 수월해졌다!
'Programming > CS' 카테고리의 다른 글
[OS] 메모리 구조와 낭비 방지Dynamic Loading, Dynamic Linking, Swapping (1) | 2020.04.27 |
---|---|
[OS] Deadlock (교착상태)와 Deadlock 처리 (0) | 2020.04.24 |
[OS] 동기화와 Critical Section(임계구역) 문제 (0) | 2020.04.22 |
[OS] Thread와 프로세스 동기화 (0) | 2020.04.20 |
[OS] 프로세스의 생성과 종료 (0) | 2020.04.19 |