筆試題:訊號量與PV操作
PV操作理解:
對於訊號量,可以認為是一個倉庫,有兩個概念,容量和當前的貨物個數。
P操作從倉庫拿貨,如果倉庫中沒有貨,執行緒一直等待,直到V操作,往倉庫裡添加了貨物,為了避免P操作一直等待下去,會有一個超時時間。
V操作往倉庫送貨,如果倉庫滿了,執行緒等待,直到有P操作,從倉庫中拿走貨物,有空的位置。
建立訊號量,設定容量,先有V操作,才能P操作。
P操作:貨物個數減1,減過之後,貨物個數大於等於0,說明已經拿到貨物,執行緒繼續。否者執行緒阻塞。
V操作:貨物個數加1,加過之後,貨物個數小於等於容量,說明新增成功,執行緒繼續。否者執行緒阻塞。
通常,訊號量的容量設定很大,可以一直V操作,不會阻塞,但是P操作的時候,很可能阻塞。
當容量為1,也就是互斥,執行流程必定是V操作,P操作,V操作,P操作...
1、訊號量
公用訊號量:實現程序間的互斥,初值=1或資源的數目
私用訊號量:實現程序間的同步,初值=0或某個整數
2、訊號量S的物理意義:S>=0時表示某資源的可用數,s<0時其絕對值表示阻塞佇列中等待該資源的程序數。P、V操作是實現程序同步與互斥的常用方法。
3、P操作表示申請一個資源,V操作表示釋放一個資源。
P操作的定義:S=S-1,若S>=0,則執行P操作的程序繼續執行;若S<0,則置該程序為阻塞狀態,並將其插入阻塞佇列。
V操作定義:S=S+1,若S>0則執行V操作的程序繼續執行;若S<0,則從阻塞狀態喚醒一個程序,並將其插入就緒佇列,執行V操作的程序繼續執行。
PV操作的特點:
原子性,P和V操作不可分。
連續性,P和V操作是不間斷的。
P自己,V對方:P的是自己的訊號量減1,V的是對方的訊號量加1。
利用PV操作實現程序的互斥
令訊號量mutex的初值為1,當進入臨界區時執行P操作,退出臨界區時執行V操作。這樣利用PV操作實現程序互斥的程式碼段如下:
P(mutex)
臨界區
V(mutex)
訊號量如何做到執行緒同步?
可以認為訊號量關聯一組執行緒,儲存一個指標,指向執行緒陣列的首地址。比如當前訊號量為-1,進行P操作,訊號量為-2,說明沒有拿到貨物,執行緒等待,取值為-2,說明有兩個執行緒等待那貨物。這個時候,其他執行緒進行V操作,訊號量加1,為-1,訊號量通知等待的執行緒中,第一個執行緒繼續執行,第二個執行緒繼續等待。
也就是說,P操作等待的情況是減1後,訊號量小於0。 P操作繼續執行的情況有兩種:a、減1後,訊號量大於等於0,不需等待,直接執行;b、訊號量小於0,等待中,其他人進行了V操作,通知這個執行緒,繼續執行。