2012-07-02 2 views
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 결과에 대한 가능한 설명은 무엇입니까 :

하지만 큰 차이 (프리젠 테이션 슬라이드에서 데이터)가 있었다 측정?

+0

일반적으로 어디에서 시작하나요? s가 0에서 시작하면 펄스는 V()의 두 번째 구현에서 호출되지 않습니다. –

+0

@ Me.Name : s가 0에서 시작하는 예 : s.P() wait 및 s = -1. 그런 다음 s.V(), 그래서 s는 0이되고 Pulse가 호출됩니다. 나는 어떤 예가 작동하지 않는다는 것을 모른다. 정확히 무슨 뜻인지 말해 줄래? – anopows

답변

0

나는이 이유가 첫 번째 해결책에서 while 일 뿐이므로 두 번째 것은 단지 if입니다. while은 반복적으로 조건을 검사하여 시간 조각이 발생할 때까지 대기를 발생시킵니다.