PV原語(yǔ)通過(guò)操作信號量來(lái)處理進(jìn)程間的同步與互斥的問(wèn)題。其核心就是一段不可分割不可中斷的程序?!?/p>
信號量的概念1965年由著(zhù)名的荷蘭計算機科學(xué)家Dijkstra提出,其基本思路是用一種新的變量類(lèi)型(semaphore)來(lái)記錄當前可用資源的數量。有兩種實(shí)現方式:1)semaphore的取值必須大于或等于0。0表示當前已沒(méi)有空閑資源,而正數表示當前空閑資源的數量;2) semaphore的取值可正可負,負數的絕對值表示正在等待進(jìn)入臨界區的進(jìn)程個(gè)數。
信號量是由操作系統來(lái)維護的,用戶(hù)進(jìn)程只能通過(guò)初始化和兩個(gè)標準原語(yǔ)(P、V原語(yǔ))來(lái)訪(fǎng)問(wèn)。初始化可指定一個(gè)非負整數,即空閑資源總數。
P原語(yǔ):P是荷蘭語(yǔ)Proberen(測試)的首字母。為阻塞原語(yǔ),負責把當前進(jìn)程由運行狀態(tài)轉換為阻塞狀態(tài),直到另外一個(gè)進(jìn)程喚醒它。操作為:申請一個(gè)空閑資源(把信號量減1),若成功,則退出;若失敗,則該進(jìn)程被阻塞;
V原語(yǔ):V是荷蘭語(yǔ)Verhogen(增加)的首字母。為喚醒原語(yǔ),負責把一個(gè)被阻塞的進(jìn)程喚醒,它有一個(gè)參數表,存放著(zhù)等待被喚醒的進(jìn)程信息。操作為:釋放一個(gè)被占用的資源(把信號量加1),如果發(fā)現有被阻塞的進(jìn)程,則選擇一個(gè)喚醒之。
具體PV原語(yǔ)對信號量的操作可以分為三種情況:
1)把信號量視為一個(gè)加鎖標志位,實(shí)現對一個(gè)共享變量的互斥訪(fǎng)問(wèn)。
實(shí)現過(guò)程:
P(mutex); // mutex的初始值為1 訪(fǎng)問(wèn)該共享數據;
V(mutex);
非臨界區
2)把信號量視為是某種類(lèi)型的共享資源的剩余個(gè)數,實(shí)現對一類(lèi)共享資源的訪(fǎng)問(wèn)。
實(shí)現過(guò)程:
P(resource); // resource的初始值為該資源的個(gè)數N 使用該資源;
V(resource); 非臨界區
3)把信號量作為進(jìn)程間的同步工具
實(shí)現過(guò)程:
臨界區C1;
P(S);
V(S);
臨界區C2;
聯(lián)系客服