작성
·
264
1
안녕하세요 교수님, 모니터 관련 질문 드릴 게 있습니다.
질문 1. 모니터와 세마포어의 정확한 차이를 모르겠습니다.
모니터 방식이 "프로그래머가 정의한 특정 영역에 접근하려면 모니터 락을 얻어야 한다" 라는 방식이라고 설명하셨는데.. 이는 결국 임계영역에 들어가기 위해 sleep(), wakeup() 하는 세마포어와 동일한 것 아닌가요?
정확히 어떤 차이점이 있는지 와닿지가 않습니다.
(질문 1 보충 설명)
자바 동기화를 생각했을 때는 차이점이 인지가 됩니다.
"세마포어는 프로그래머의 실수로 인해 타이밍 오류가 발생할 수 있지만 자바에서 synchronized 키워드를 사용하면 JVM이 모니터 락을 알아서 관리해주니까 세마포어에서 발생하는 실수에 대한 걱정이 없다"
정도로요.
그런데, conditional variables 을 사용하는 경우에서는 모니터와 세마포어의 차이를 모르겠다는 이야기입니다.
condition x;
x.wait(), x.signal()
이러한 호출도 결국 프로그래머가 직접 해주는 것 아닌가요? 그렇다면 이게 세마포어와 어떤 차이점이 있는 것인지...
요런 질문입니다.
질문 2. 컨디션 변수의 작용 범위?
컨디션 변수를 사용한 모니터 구현 방식에서.. 각 컨디션 변수의 wait, signal은 하나의 공유 자원에 대해 동작하는 건가요?
아니면 모니터 내부에서 미니 모니터(?)같은 느낌으로 또 다시 영역을 나누고 그 영역에 대해서 동작하는 건가요?
질문 3. 컨디션 변수가 하나만 있는 경우?
만약 컨디션 변수가 하나만 있다고 한다면.. 이러한 경우에서는 이 역시 결국 세마포어와 완전히 동일한 것 아닌가 하는 생각이 드는데요.
제가 이해하지 못한 다른 차이점이 있을까요?
지금까지는 강의 내용을 이해하는 것에 큰 무리는 없었는데.. 이번 강의는 뭔가 난이도가 확 올라간 느낌이네요;
답변 부탁드립니다.
감사합니다!!
답변 1
0
비유적으로 설명하는 것은 오해의 소지가 많기 때문에 경계해야 하지만,
이 경우는 비유적 설명이 필요할 것 같습니다.
C++ 언어로 스택을 구현한다고 해 봅시다.
전역 변수로 스택을 두고, push() 함수와 pop() 함수를 구현할 수 있겠지요?
이 경우는 세마포어라고 보면 되겠습니다.
대신, class Stack을 선언하고, 멤버 변수로 스택을 두고
push(), pop()을 메서드로 선언해도 되겠지요?
이 경우는 모니터라고 보면 되겠습니다.
이렇게 개념을 잡고 다시 모니터 부분을 들여다 보면 나머지 문제는 해결이 될 것 같습니다.
노파심에서 말하지만, 비유는 비유일 뿐, 이 설명이 정확하다고는 생각마시고,
교재 내용을 천천히 음미하면서 읽어보면 좀 더 깊은 이해가 가능할 것 같습니다.
한 번에 이해는 잘 안 되지만 답변주신 내용 토대로 더 생각해보겠습니다.
감사합니다!