세마포어 대 모니터-차이점은 무엇입니까?


233

모니터세마포 의 주요 차이점은 무엇입니까 ?


8
모니터를 이진 세마포어로 생각할 수 있습니다.
Maxim Egorushkin


1
albahari.com/threading/part2.aspx를 참조하십시오 . 이 글을 읽었습니다. 스레딩에서 읽은 최고의 기사
Shantanu Gupta

5
당신이 옳다고 생각하지 않습니다, Maxim. 세마포어는 실수가 아닌 경우 "저수준"구조이지만 모니터는 본격적인 개체입니다. 우리는 대학의 운영 체제 수업에서 모니터를 간략하게 살펴 봤지만 모니터가 객체 지향적이라는 점을 제외하고 Mutex와 어떻게 다른지 기억하지 못합니다. 모니터를 사용하여 한 가지 문제를 해결할 수 있었지만 C 언어의 제한으로 인해 클래스에서 동일한 방법을 사용할 수 없었습니다.
user919860

1
세마포어와 모니터는 서로 다른 것을 구현할 수 있다는 점에서 차이가 있지만 성능면에서 동등합니다. 여기
Thanh DK

답변:


529

모니터는 여러 스레드에서 액세스 할 수 있도록 설계 객체입니다. 모니터 오브젝트의 멤버 함수 또는 메소드는 상호 배제를 강제하므로 주어진 시간에 하나의 스레드 만 오브젝트에 대한 조치를 수행 할 수 있습니다. 하나의 스레드가 현재 오브젝트의 멤버 함수를 실행중인 경우 해당 오브젝트의 멤버 함수를 호출하려는 다른 스레드는 첫 번째가 완료 될 때까지 기다려야합니다.

세마포어는 낮은 수준의 개체입니다. 세마포어를 사용하여 모니터를 구현할 수 있습니다. 세마포어는 본질적으로 카운터 일뿐입니다. 카운터가 양수이면 스레드가 세마포어를 얻으려고 시도하면 허용되고 카운터가 감소합니다. 스레드가 완료되면 세마포어를 해제하고 카운터를 증가시킵니다.

스레드가 세마포어를 얻으려고 할 때 카운터가 이미 0이면 다른 스레드가 세마포어를 해제 할 때까지 기다려야합니다. 스레드가 세마포어를 해제 할 때 여러 스레드가 대기중인 경우 스레드 중 하나가 해당 스레드를 가져옵니다. 세마포어를 해제하는 스레드는이를 획득 한 스레드와 동일하지 않아도됩니다.

모니터는 공중 화장실과 같습니다. 한 번에 한 사람 만 입장 할 수 있습니다. 그들은 다른 사람이 들어오지 못하도록 물건을 잠그고 물건을 한 다음 떠날 때 잠금을 해제합니다.

세마포어는 자전거 대여 장소와 같습니다. 그들은 특정 수의 자전거를 가지고 있습니다. 자전거를 대여하려고하는데 자전거가 무료 인 경우 자전거를 탈 수 있습니다. 그렇지 않으면 기다려야합니다. 누군가 자전거를 반환하면 다른 사람이 자전거를 탈 수 있습니다. 자전거를 가지고 있다면 자전거를 다른 사람에게 돌려 줄 수 있습니다.-자전거 대여 장소는 자전거를 돌려받는 한 자전거를 반납하는 사람을 신경 쓰지 않습니다.


162
공용 욕실 및 자전거 대여 장소와 +1의 비유. 나는 지금 둘 사이의 차이점을 결코 잊지 않을 것입니다.
Drupad Panchal

4
귀하의 답변이 stackoverflow.com/a/7336799/632951 .. 와 맞지 않는 것 같습니다 .
Pacerier

6
@Pacerier : 나는 :-) 유일한 모순은 고수준 / 저수준의 것입니다. 세마포어에서 모니터를 만들 수 있습니다 . 모니터가 세마포어 보다 상위 수준 이기 때문에 정교하지는 않습니다 . 세마포어는 기다리는 카운터 일뿐입니다. "세마포어의 작은 책" greenteapress.com/semaphores
Anthony Williams

3
@AnthonyWilliams : 아마도 세마포어에서만 모니터를 만들 수 있다는 개념을 의심합니다. 다른 방법도 가능하며 모니터 때문에 세마포어보다 높은 수준의 엔티티라고 풍부하게 말할 수는 없습니다.
Kavish Dwivedi

5
예, 모니터에서 세마포를 만들 수 있습니다. 항상 높은 수준의 개체로 낮은 수준의 개체를 만들 수 있습니다. 높은 수준과 낮은 수준의 내용은 기능과 작동 범위에 관한 것이며 다른 것을 만드는 데 사용될 수는 없습니다.
Anthony Williams

11

다음 설명은 실제로 모니터의 wait () 및 signal ()이 세마포어의 P 및 V와 어떻게 다른지 설명합니다.

대기 ()신호 () A의 조건 변수에 대한 연산 모니터 유사한 PV의 계산에 연산 세마포어 .

대기 명령문 은 프로세스의 실행을 차단할 수있는 반면 신호 명령문 은 다른 프로세스의 차단을 해제 할 수 있습니다. 그러나 약간의 차이가 있습니다그들 사이에. 프로세스가 P 연산을 실행할 때 카운팅 세마포어가 0보다 클 수 있으므로 반드시 해당 프로세스를 차단하지는 않습니다. 반대로 대기 명령문이 실행될 때 항상 프로세스를 차단합니다. 작업이 세마포어에서 V 작업을 실행하면 해당 세마포어에서 대기중인 작업이 차단 해제되거나 잠금 해제 할 작업이 없으면 세마포어 카운터가 증가합니다. 반면, 차단 해제 할 다른 프로세스가 없을 때 프로세스가 신호 명령문을 실행하면 조건 변수에 영향을 미치지 않습니다. 세마포어와 모니터의 또 다른 차이점은 V 작업으로 깨어 난 사용자가 지연없이 실행을 다시 시작할 수 있다는 것입니다. 반대로, 신호 조작으로 깨어 난 사용자는 모니터가 잠금 해제 된 경우에만 다시 시작됩니다. 게다가,

링크 : 자세한 내용은 여기참조하십시오 . 도움이 되길 바랍니다.


6

한 줄 답변 :

모니터 : 한 번에 하나의 스레드 만 모니터 에서 실행할 수 있도록 제어합니다. (단일 스레드를 실행하기 위해 잠금을 획득해야 함)

세마포어 : 공유 리소스를 보호하는 잠금. (자원에 액세스하려면 잠금을 획득해야 함)


5

세마포어를 사용하면 여러 스레드 (최대 설정된 수)가 공유 객체에 액세스 할 수 있습니다. 모니터는 공유 객체에 대한 상호 배타적 액세스를 허용합니다.

감시 장치

신호기


10
그러나 모니터는 MutEx와 어떻게 다릅니 까? 상호 배제 잠금은 세마포어와 동일한 기능을 수행하지만 한 번에 하나의 스레드 만 중요 영역에 액세스 할 수 있습니다.
user919860

2
네, mnitor와 mutex의 차이점은 무엇입니까?
Pacerier

2
세마포어는 공유 객체에 대한 액세스를 제어하지 않고 공유 객체 (여러 객체를 포함 할 것)에 대한 액세스를 제어한다는 점에 주목할 필요가 있습니다.
xbonez

@ xbonez : 우리가 보면 java.util.ArrayList: 여러 객체의 객체 또는 컨테이너입니까? 글쎄, 둘 다 동시에입니다. 따라서 세마포어가 액세스를 제어하는 ​​데 적합합니까? 나는 말할 것입니다 : 아니오.
dma_k

수락 된 답변 자체에서 모니터가 상호 배제를 구현하고 있다고 언급됩니다. "모니터 객체의 멤버 함수 또는 메소드는 상호 배제를 강제하므로 주어진 시간에 하나의 스레드 만 객체에 대해 조치를 수행 할 수 있습니다"
achoora

2

세마포어가 임계 영역을 보호하기 위해 사용되는 경우, 세마포어와 보호되는 데이터 사이에는 직접적인 관계가 없습니다. 이것은 세마포어가 코드 주위에 분산되는 이유의 일부이며, wait 또는 notify 호출을 잊어 버리기 쉬운 이유 중 하나입니다 .이 경우 각각 상호 배제를 위반하거나 자원을 영구적으로 잠그는 결과가 발생합니다.

반대로, 이러한 나쁜 일에 대해서는 모니터로 발생할 수 있습니다. 모니터는 데이터에 직접 영향을 받고 (데이터를 캡슐화 함) 모니터 조작은 원자적인 조치이므로 입력 프로토콜을 호출하지 않고 데이터에 액세스 할 수있는 코드를 작성할 수 없습니다. 모니터 조작이 완료되면 종료 프로토콜이 자동으로 호출됩니다.

모니터에는 진행하기 전에 조건 변수의 형태로 조건 동기화를위한 내장 메커니즘이 있습니다. 조건이 충족되지 않으면 프로세스는 조건 변경을 알릴 때까지 기다려야합니다. 프로세스가 조건 동기화를 기다리는 경우 모니터 구현은 상호 배제 문제를 처리하고 다른 프로세스가 모니터에 액세스 할 수 있도록합니다.

Open University M362 3 단원 "상호 작용 과정"과정 자료에서 발췌.


세마포어는 매우 일반적으로 언어로 제공하고 제한 원자 사업자와 변수의 일종으로 교과서에 제시되어있다하더라도 것을 제외하고, 세마포어는 모니터의 특별한 경우는 - 때문에 이 제한 원자 사업자와 변수의 일종이다, 모니터가 그런 것이기 때문입니다. 세마포어가 "낮은 수준"이라는 위의 주장은 의문의 여지가 있습니다.
philipxy

2

세마포어 :

동시 시스템에서 일부 공유 자원에 대한 액세스를 제어하기 위해 카운터 또는 플래그 사용, 세마포어 사용을 의미 .

예:

  1. 극장 / 버스 / 기차 / 유람선 / 교실의 50 석 (공동 자원)을 50 명만 입수 할 수있는 카운터. 누군가 좌석을 비운 경우에만 새로운 승객을 허용합니다.
  2. 욕실의 약속 있음 / 없음 상태를 나타내는 이진 플래그입니다.
  3. 신호등은 플래그의 좋은 예입니다. 도로상의 차량 통과를 통제하여 흐름을 제어합니다 (공유 자원)

플래그는 자원의 현재 상태 만 나타내며, 자원에서 대기 중이거나 실행중인 오브젝트에 대한 수 또는 기타 정보는 표시되지 않습니다.

모니터 :

모니터 몇 가지 조건이 true가 될 때까지 획득 액세스 또는 대기하도록 요청 객체에 관심이 스레드와 통신하여 개체에 대한 액세스를 동기화합니다.

예:

  1. 아버지는 딸의 모니터 역할을하여 한 번에 한 사람 만 데이트 할 수 있습니다.
  2. 배턴을 사용하여 한 명의 어린이 만 수업에 참여할 수 있도록하는 학교 교사.
  3. 마지막으로 계정 개체의 트랜잭션 (스레드를 통한)은 무결성을 유지하기 위해 동기화됩니다.

도로 교차로의 신호등은 이진 플래그라고 생각합니다. 한 도로의 차량이나 직교 도로의 차량은 (상호 배타적) 주행이 가능하므로 예제 (3)은 (2)와 같습니다. 또한 그 예제는 모니터를 사용하여 구현할 수있는 세마포어 (사소한 경우)의 코너 사례라고 생각합니다. 위키 백과 에는 더 일반적인 예가 있습니다.
dma_k
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.