原語
原語
原語 操作系統或計算機網路用語範疇。是由若干條指令組成的,用於完成一定功能的一個過程。primitive or atomic action 是由若干個機器指令構成的完成某種特定功能的一段程序,具有不可分割性·即原語的執行必須是連續的,在執行過程中不允許被中斷。
計算機網路中也有“原語”一詞,它與操作系統的“原語”概念不同。服務原語是指協議中的下層協議通過介面為上層協議提供某種服務而發送的原語操作。
原語分為四類:請求(Req)型原語,用於高層向低層請求某種業務;證實(Cfm)型原語,用於提供業務的層證實某個動作已經完成;指示(Ind)型原語,用於提供業務的層向高層報告一個與特定業務相關的動作;響應(Res)型原語,用於應答,表示來自高層的指示原語已收到。
原語通常由若干條指令組成,用來實現某個特定的操作。通過一段不可分割的或不可中斷的程序實現其功能。原語是操作系統的核心,它不是由進程而是由一組程序模塊所組成,是操作系統的一個組成部分,它必須在管態(一種機器狀態,管態下執行的程序可以執行特權和非特權兩類指令,通常把它定義為操作系統的狀態)下執行,並且常駐內存,而個別系統有一部分不在管態下運行。原語和廣義指令都可以被進程所調用,兩者的差別在於原語有不可中斷性,它是通過在執行過程中關閉中斷實現的,且一般由系統進程調用。許多廣義指令的功能都可用目態(一種機器狀態,通常把它作為用戶程序執行時的狀態)下運行的系統進程完成,而不一定要在管態下完成,例如文件的建立、打開、關閉、刪除等廣義指令,都是藉助中斷進入管態程序,然後轉交給相應的進程,最終由進程實現其功能。引進原語的主要目的是為了實現進程的通信和控制。
PV原語通過操作信號量來處理進程間的同步與互斥的問題。其核心就是一段不可分割不可中斷的程序。信號量的概念1965年由著名的荷蘭計算機科學家Dijkstra提出,其基本思路是用一種新的變數類型(semaphore)來記錄當前可用資源的數量。
semaphore有兩種實現方式:
1) semaphore的取值必須大於或等於0。0表示當前已沒有空閑資源,而正數表示當前空閑資源的數量;
2) semaphore的取值可正可負,負數的絕對值表示正在等待進入臨界區的進程個數。
信號量是由操作系統來維護的,用戶進程只能通過初始化和兩個標準原語(P、V原語)來訪問。初始化可指定一個非負整數,即空閑資源總數。
P是荷蘭語Passeren(通過)的首字母。為阻塞原語,負責把當前進程由運行狀態轉換為阻塞狀態,直到另外一個進程喚醒它。操作為:申請一個空閑資源(把信號量減1),若成功,則退出;若失敗,則該進程被阻塞;
V是荷蘭語Verhogen(增加)的首字母。為喚醒原語,負責把一個被阻塞的進程喚醒,它有一個參數表,存放著等待被喚醒的進程信息。操作為:釋放一個被佔用的資源(把信號量加1),如果發現有被阻塞的進程,則選擇一個喚醒之。
P原語操作的動作是:
(1)sem減1;
(2)若sem減1后仍大於或等於零,則P原語返回,該進程繼續執行;
(3)若sem減1后小於零,則該進程被阻塞後進入與該信號相對應的隊列中,然後轉進程調度。
V原語操作的動作是:
(1)sem加1;
(2)若相加結果大於零,則V原語停止執行,該進程返回調用處,繼續執行;
(3)若相加結果小於或等於零,則從該信號的等待隊列中喚醒一等待進程,然後再返回原進程繼續執行或轉進程調度。
PV操作對於每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語執行期間不允許有中斷的發生。
具體PV原語對信號量的操作可以分為三種情況:
1) 把信號量視為一個加鎖標誌位,實現對一個共享變數的互斥訪問。
實現過程:
P(mutex); // mutex的初始值為1 訪問該共享數據; V(mutex); 非臨界區;
2) 把信號量視為是某種類型的共享資源的剩餘個數,實現對一類共享資源的訪問。
實現過程:
P(resource); // resource的初始值為該資源的個數N 使用該資源; V(resource); 非臨界區;
3) 把信號量作為進程間的同步工具
實現過程:
臨界區C1; P(S); V(S); 臨界區C2;