블링블링 범블링

[OS 13장] 프로세스 관리 - 모니터 본문

Technology/오퍼레이팅 시스템

[OS 13장] 프로세스 관리 - 모니터

뻠스키 2018. 4. 17. 17:42

동기화 문제를 해결하기 위해서 우리는 세마포라는 도구를 사용하였다하지만 동기화 문제를 해결하는데 세마포만이 사용되지는 않는다사실 세마포의 경우 오래된 동기화 도구라고 할 수 있다현재 사용되는 도구 중 하나가 모니터이다특히 자바 프로그램에서는 모니터에 대한 활용이 높다세마포가 어셈블리 언어에 적합한 도구라면 모니터는 그보다 고수준인 언어의 도구라고 할 수 있다.


공유자원과 공유자원에 대한 접근함수가 존재한다이러한 구역을 임계구역이라고 한다모니터의 경우 두 개의 queue가 있는데 각각 배타동기와 조건동기의 역할을 한다배타동기의 queue는 하나의 쓰레드만 공유자원에 접근할 수 있게 하는 작용을 하는 공간이다특정 쓰레드가 공유자원을 사용하는 함수를 사용하고 있으면 다른 쓰레드는 접근을 할 수 없고 대기해야 한다조건 동기의 queue는 진입 쓰레드가 블록되면서 새 쓰레드가 진입가능하게 하는 공간이다새 쓰레드는 조건동기로 블록된 쓰레드를 깨울 수 있다깨워진 쓰레드는 현재 쓰레드가 나가면 재진입할 수 있다.


자바의 모니터를 살펴보면서 모니터의 원리를 더욱 알아보도록 하자.







자바의 모든 객체는 모니터가 될 수 있다배타 동기는 synchronized 키워드를 사용해서 지정할 수 있고 조건 동기는 wait()함수와 notify()함수notifyAll()함수를 사용한다배타 동기를 지정하는 함수들은 공통 자원을 사용하고 있는 경우이다공통 자원을 사용할 경우 배타 동기를 선언하는 synchronized라는 키워드를 적어주기만 하면 상호배타의 원리를 만족시키는 함수로 만들어준다조건 동기의 경우 wait()함수를 실행하면 진입한 쓰레드를 조건 동기 queue에 블록을 시킨다. notify()함수는 그렇게 블록된 함수를 깨우는데 새로운 쓰레드가 실행하는 방식으로 깨우게 된다. notifyAll()은 모든 쓰레드를 깨우는 것으로 사용할 수 있다.

세마포의 경우와 비교를 해볼 수 있다세마포의 경우 임계구역 앞에 설치되어 초기 값을 설정해 들어갈 수 있는 한계를 놓는다들어갈 때 acquire()명령하고 나올 때는 release()명령을 실행시켜 주어야한다하지만 이런 관계를 기억하는 것이 힘들다이와 반대로 모니터는 따로 명령을 불러줄 필요 없이 함수에 synchronized만 붙여 넣으면 상호배타의 기능을 수행할 수 있다.



은행계좌 문제의 자바 프로그램을 예시로 들어보자우리는 앞에서 세마포를 이용해서 은행계좌 문제를 하였는데 지금은 모니터를 바로 사용해 볼 것이다은행계좌 문제에서 은행계좌에 대한 값이 공통 자원으로 사용되며 이에 접근하는 함수가 입금과 출금이라는 값이 된다따라서 우리는 모니터로 만들기 위해서 접근하는 함수 앞에 synchronized를 선언하여 공통 자원에 접근하는 함수이라는 것을 선언한다그러면 접근하는 하나의 함수가 실행될 때 다른 synchronized 함수는 실행될 수 없게 된다이렇게 되면 다른 쓰레드는 함수로 임계구역에 들어갈 수 없게 되어 상호배타가 만족되게 된다.



세마포의 경우 쓰레드의 실행 순서를 사용자 마음대로 할 수 있다는 장점이 있었다모니터 역시 가능하다. notify()함수와 wait()함수를 이용하면 모니터에서도 순서를 제어할 수 있다프로세스1과 프로세스2에 대해서 프로세스1을 먼저 실행시키고 싶다고 가정하자그러면 프로세스2의 실행코드 전에 wait()함수를 기술해주면 프로세스2는 임계구역에서 실행 코드를 실행시키기 전에 wait()함수에 의해 조건 동기의 queue에 블록이 되게 된다그러면 문맥전환에 의해 프로세스1에 실행 권한이 넘어가게 되고 임계구역에 들어가서 실행코드를 실행시킨다실행이 끝나고 난 후 notify()함수를 실행시켜 프로세스2를 깨어나게 하여 임계구역에 접근을 하도록 한다이러면 우리는 항상 프로세스1이 프로세스2보다 먼저 실행이 되도록 프로그램을 만들 수 있다.





Comments