Written by
xi-jjun
on
on
운영체제 - 16
KOCW 운영체제 16강
양희재 교수님 강의를 듣고 쓴 글입니다.
Monitor
Semaphore
는 오래된 동기화 도구이다. Monitor
는 이후에 나온 java 프로세스 동기화 도구로써 보다 더 고수준의 개념이다.
Semaphore
Monitor
- 대기하고 있던 thread 진입. 공통 자원에 접근하려는 method에 접근. 1개의 thread만 접근할 수 있게 mutual exclusion 보장. 나머지는
mutual exclusion Queue
에 대기 중. - 진입한 해당 thread가
wait()
을 호출하면, blocked.Conditional Synchronization Queue
에 들어간다. 이제 새로운 thread가 진입 가능해진 것이다. mutual exclusion Queue
에 있던 새로운 thread가 진입.- 진입한 새로운 thread가
notify()
를 호출하면 아까 blocked 된 thread를 깨울 수 있다. 따라서 현재 새로운 thread가 다시 나가게 되면 깨워진 이전 thread가 재진입하게 된다.
Semaphore
보다 복잡해 보이지만, 그래서 더 사용하기 편하다.
-
Java 의 모든 객체는
Monitor
가 될 수 있다.Mutual Exclusion Synchronization
:synchronized
키워드를 사용하여 지정.Conditional Synchronization
:wait(), notify(), notifyAll()
method를 사용.
class ExMonitor { private int value; // other variable.. synchronized void function1(){ // common variable에 접근하는 method } synchronized void function2(){ // common variable에 접근하는 method } void function3(){ // common variable에 접근하지 않는 method } }
따라서 간단히 설명하자면,
synchronized
라는 키워드가 붙은 메서드에는 오직 한번에 1개의 thread만 접근 가능하게 한다.(Mutual Exclusion
)
Semaphore vs Monitor
-
Mutual Exclusion
-
Semaphore
void run() { // ... semaphore.acquire(); // Critical Section semaphore.release(); // ... }
-
Monitor
synchronized void run() { // Critical Section }
둘의 차이가 확연히 보인다.
Semaphore
는 매번acquire(), release()
를 호출해줘야 하기에 번거롭고, 복잡해질 수 있다. 그러나Monitor
는 키워드 1개만 쓰면 되기에 더욱 편하다. -
-
Ordering
process1
을process2
보다 먼저 실행하고 싶을 때 위와 같이 하면 된다.Semaphore
를 사용하게 되면 permit 수도 신경써야 하고,acquire(), release()
도 해줘야 한다. 그러나Monitor
는wait(), notify()
와 동기화 키워드로 쉽게 구현할 수 있다.
자세한 코드는 여기서 볼 수 있다.