1. 程式人生 > >有關訊號量和PV操作的易(粗)懂(淺)理解

有關訊號量和PV操作的易(粗)懂(淺)理解

大概只有作業系統老師佈置的作業(要交)能讓我認真學習吧……

  • 訊號量Semaphore

1.有關訊號量的一些說明: 訊號量S是一個整數,S大於等於零時代表可供併發程序使用的資源實體數,但S小於零時則表示正在等待使用共享資源的程序數。 在多程序環境下,程序在進入一個臨界程式碼段之前,程序必須獲取一個訊號量;一旦臨界程式碼段完成了,釋放一個訊號量。其他想進入臨界程式碼段的程序必須等待直到那個程序釋放訊號量。 用訊號量實現程序互斥的演算法如下:

 semaphore S=1;
 Parbegin
    Process1:Begin 
           Repeate
                 while S<=0  do  no-ops;
                 S=S-1;
                 Critical section;//兩個程序的臨界區是互斥的
                 S=S+1;
            Until false;
            End
   Process2:Begin
          Repeate
                 while S<=0  do  no-ops;
                 S=S-1;
                 Critical section;
                 S=S+1;
            Until false;
            End
  Parend.

2.Windows下訊號量包含的幾個操作原語: CreateSemaphore() 建立一個訊號量

OpenSemaphore() 開啟一個訊號量

ReleaseSemaphore() 釋放訊號量

  • PV操作

1.PV操作的一些概念:

由來:PV操作是由荷蘭人狄克斯特拉用荷蘭文定義的,因為在荷蘭文中,通過叫passeren,釋放叫vrijgeven,PV操作因此得名。

作用:實現程序同步與互斥。P操作表示申請一個資源,V操作表示釋放一個資源。

定義: P操作:S=S-1,若S>=0,則執行P操作的程序繼續執行;若S<0,則置該程序為阻塞狀態,並將其插入阻塞佇列。

Wait(S):    while S<=0  do  no-ops;
                 S=S-1;

V操作:S=S+1,若S>0,則執行V操作的程序繼續執行,此時不喚醒其他程序;若S<0,則從阻塞狀態喚醒一個程序,並將其插入就緒佇列。

Signal(S): S=S+1;

用PV操作實現程序的互斥演算法——在臨界區的前後加上Wait(P操作)和Signal(V操作)函式即可:

Repeate
       Wait(S);
       Critical Section;
       Signal(S);
Until false;

2.PV操作的特點(一組PV操作對應於一個程序 ): 原子性,P和V操作不可分! 連續性,P和V操作是不間斷的。 P自己,V對方:P的是自己的訊號量減1,V的是對方的訊號量加1.