1. 程式人生 > >原語詳解

原語詳解

原語(原子語言,不可分割,不可中斷)是作業系統或計算機網路用語範疇。是由若干條指令組成的,用於完成一定功能的一個過程。primitive or atomic action 是由若干個機器指令構成的完成某種特定功能的一段程式,具有不可分割性。即原語的執行必須是連續的,在執行過程中不允許被中斷。

分類

計算機網路中也有“原語”一詞,它與作業系統的“原語”概念不同。服務原語是指協議中的下層協議通過介面為上層協議提供某種服務而傳送的原語操作。

原語分為四類:請求(Req)型原語,用於高層向低層請求某種業務;證實(Cfm)型原語,用於提供業務的層證實某個動作已經完成;指示(Ind)型原語,用於提供業務的層向高層報告一個與特定業務相關的動作;響應(Res)型原語,用於應答,表示來自高層的指示原語已收到。

組成及功能

原語通常由若干條指令組成,用來實現某個特定的操作。通過一段不可分割的或不可中斷的程式實現其功能。原語是作業系統的核心,它不是由程序而是由一組程式模組所組成,是作業系統的一個組成部分,它必須在管態(一種機器狀態,管態下執行的程式可以執行特權和非特權兩類指令,通常把它定義為作業系統的狀態)下執行,並且常駐記憶體,而個別系統有一部分不在管態下執行。原語和廣義指令都可以被程序所呼叫,兩者的差別在於原語有不可中斷性,它是通過在執行過程中關閉中斷實現的,且一般由系統程序呼叫。許多廣義指令的功能都可用目態(一種機器狀態,通常把它作為使用者程式執行時的狀態)下執行的系統程序完成,而不一定要在

管態下完成,例如檔案的建立、開啟、關閉、刪除等廣義指令,都是藉助中斷進入管態程式,然後轉交給相應的程序,最終由程序實現其功能。引進原語的主要目的是為了實現程序的通訊和控制。

PV原語2種形式

PV原語通過操作訊號量來處理程序間的同步與互斥的問題。其核心就是一段不可分割不可中斷的程式。 訊號量的概念1965年由著名的荷蘭電腦科學家Dijkstra提出,其基本思路是用一種新的變數型別(semaphore)來記錄當前可用資源的數量[1]。

semaphore有兩種實現方式:

1) semaphore的取值必須大於或等於0。0表示當前已沒有空閒資源,而正數表示當前空閒資源的數量;

2) semaphore的取值可正可負,負數的絕對值表示正在等待進入臨界區的程序個數。

訊號量是由作業系統來維護的,使用者程序只能通過初始化和兩個標準原語(P、V原語)來訪問。初始化可指定一個非負整數,即空閒資源總數。

P原語

P是荷蘭語Passeren(通過)的首字母。為阻塞原語,負責把當前程序由執行狀態轉換為阻塞狀態,直到另外一個程序喚醒它。操作為:申請一個空閒資源(把訊號量減1),若成功,則退出;若失敗,則該程序被阻塞;

V原語

V是荷蘭語Verhogen(增加)的首字母。為喚醒原語,負責把一個被阻塞的程序喚醒,它有一個引數表,存放著等待被喚醒的程序資訊。操作為:釋放一個被佔用的資源(把訊號量加1),如果發現有被阻塞的程序,則選擇一個喚醒之。

P原語操作的動作是:[1]

(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;