0
컴퓨터 과학 수업에서 우리는 세마포어를 여러 가지로 구현했습니다.세마포어 구현 : 모니터 대 슬리핑 이발사, 큰 성능 차이
class Semaphore {
int s; object mutex = new object();
public Semaphore (int n) { s = n; }
public void P()
{
lock(mutex)
{
s--;
if (s < 0) Monitor.Wait(mutex);
}
}
public void V()
{
lock(mutex)
{
s++;
if (s <= 0) Monitor.Pulse(mutex);
}
}
}
모두 구현이 매우 유사 같다 :
모니터 구현 :
class Semaphore {
int s; object mutex = new object();
public Semaphore(int n) { s = n; }
public void P()
{
lock (mutex)
{
while (s == 0) Monitor.Wait(mutex);
s--;
}
}
public void V()
{
lock (mutex)
{
s++; Monitor.Pulse(mutex);
}
}
}
잠자는 이발사의 Implentation 그 중 두 사람은 잠자는 이발사 구현을 사용하여 일반 모니터의 구현을 사용 하나에 의해 수행되었다 나를. 내가 볼 수있는 유일한 차이점은 수면 용 이발 실행에서 음수가되고 Monitor 구현에서 V()가 실행될 때까지 s = 0으로 유지된다는 것입니다.
Semaphore Type Time (ms)
Monitor 7549
Monitor (Barber) 109598
그 거대한 다른 perfomance 결과에 대한 가능한 설명은 무엇입니까 :
하지만 큰 차이 (프리젠 테이션 슬라이드에서 데이터)가 있었다 측정?
일반적으로 어디에서 시작하나요? s가 0에서 시작하면 펄스는 V()의 두 번째 구현에서 호출되지 않습니다. –
@ Me.Name : s가 0에서 시작하는 예 : s.P() wait 및 s = -1. 그런 다음 s.V(), 그래서 s는 0이되고 Pulse가 호출됩니다. 나는 어떤 예가 작동하지 않는다는 것을 모른다. 정확히 무슨 뜻인지 말해 줄래? – anopows