複製鏈接
請複製以下鏈接發送給好友

原語

鎖定
計算機進程的控制通常由原語完成。所謂原語,一般是指由若干條指令組成的程序段,用來實現某個特定功能,在執行過程中不可被中斷。在操作系統中,某些被進程調用的操作,如隊列操作、對信號量的操作、檢查啓動外設操作等,一旦開始執行,就不能被中斷,否則就會出現操作錯誤,造成系統混亂。所以,這些操作都要用原語來實現 原語是操作系統核心(不是由進程,而是由一組程序模塊組成)的一個組成部分,並且常駐內存,通常在管態下執行。原語一旦開始執行,就要連續執行完,不允許中斷 [1] 
中文名
原語
外文名
primitive
類    型
操作系統
組    成
若干條指令
屬    性
一個過程
作    用
實現進程的通信和控制

原語介紹

原語是在操作系統中調用核心層子程序的指令。與一般廣義指令的區別在於它是不可中斷的,而且總是作為一個基本單位出現。它與一般過程的區別在於:它們是“原子操作(primitive or atomic action)”。所謂原子操作,是指一個操作中的所有動作要麼全做,要麼全不做。換言之,它是一個不可分割的基本單位,因此,在執行過程中不允許被中斷。原子操作在管態下執行,常駐內存。原語的作用是為了實現進程的通信和控制,系統對進程的控制如不使用原語,就會造成其狀態的不確定性,從而達不到進程控制的目的 [2] 

原語分類

計算機網絡中也有“原語”一詞,它與操作系統的“原語”概念不同。服務原語是指協議中的下層協議通過接口為上層協議提供某種服務而發送的原語操作。
原語分為四類:請求(Req)型原語,用於高層向低層請求某種業務;證實(Cfm)型原語,用於提供業務的層證實某個動作已經完成;指示(Ind)型原語,用於提供業務的層向高層報告一個與特定業務相關的動作;響應(Res)型原語,用於應答,表示來自高層的指示原語已收到。

原語組成及功能

原語通常由若干條指令組成,用來實現某個特定的操作。通過一段不可分割的或不可中斷的程序實現其功能。原語是操作系統的核心,它不是由進程而是由一組程序模塊所組成,是操作系統的一個組成部分,它必須在管態(一種機器狀態,管態下執行的程序可以執行特權和非特權兩類指令,通常把它定義為操作系統的狀態)下執行,並且常駐內存,而個別系統有一部分不在管態下運行。原語和廣義指令都可以被進程所調用,兩者的差別在於原語有不可中斷性,它是通過在執行過程中關閉中斷實現的,且一般由系統進程調用。許多廣義指令的功能都可用目態(一種機器狀態,通常把它作為用户程序執行時的狀態)下運行的系統進程完成,而不一定要在管態下完成,例如文件的建立、打開、關閉、刪除等廣義指令,都是藉助中斷進入管態程序,然後轉交給相應的進程,最終由進程實現其功能。引進原語的主要目的是為了實現進程的通信和控制。

原語異步原語

異步原語也叫做異步通信原語,是指與阻塞的通信原語相對應的是另一種稱為非阻塞的通信原語。如果一個send原語是非阻塞的,它在消息實際發送之前,就立即把控制返回給調用者。也就是説,發送進程在發送消息時並不進入阻塞狀態,它不等消息發送完就繼續執行其後繼語句。異步原語(又稱非阻塞原語)的優點是明顯的。發送進程可在消息實際發送過程中進行連續的工作,而不是讓CPU空轉(假定此時沒有其它進程可以運行)。這就是説,採用非阻塞的通信原語可以大大提高系統的效率和處理機的利用率。然而,由非阻塞原語所帶來的效率上的好處卻被一個嚴重的缺點抵消了。這個缺點就是緩衝區中能使用一次,因為發送者在發送完消息之前,進程不能繼續使用原來的緩衝區。倘若在消息傳送期間修改緩衝區會帶來可怕的後果,至於何時才能允許使用這個緩衝區,卻無法得知 [3] 

原語進程控制塊的原語

進程控制的主要任務,是對系統中所有進程從創建到消亡的全過程實行有效的管理和控制。這意味着它不僅對進程狀態變化加以管理和控制,而且具有創建新進程和撤銷已完成任務的進程的能力。
為了對進程進行控制,在操作系統中必須設置一個機構,它具有創建進程、撤銷進程及其他管理功能。這是操作系統中最常用、最核心的內容,常稱為內核。內核是計算機硬件的第一層擴充軟件,是操作系統的管理和控制中心,其功能往往是通過執行各種原語操作來實現的。為了保證操作的正確性,原語在執行期間不可分割。原語一旦開始執行,直到完畢之前,是不允許中斷的。在操作系統中,用於進程控制的原語主要有創建原語、撤銷原語、阻塞原語、喚醒原語 [3] 

原語創建原語

在實際系統中創建一個進程有兩種方法:一是由操作系統建立,O號進程就是由操作系統建立的;二是由其他進程創建一個新的進程。基本操作都是一樣的。創建進程原語總是先為新建進程申請一空白PCB,併為之分配唯一的數字標識符,使之獲得PCB的內部名稱,若該進程所對應的程序不在內存中,則應將它從外存儲器調入內存,並將該進程有關信息填入PCB中,然後置該進程為就緒狀態,並將它排入就緒隊列和進程家族隊列中 [3] 

原語撤銷原語

撤銷進程的實質是撤銷進程存在標誌——進程控制塊PCB。一旦PCB被撤銷,進程就消亡了。撤銷原語的操作過程大致如下:以調用者提供的標識符Ⅱ為索引,從該進程所在的隊列,將它從該隊列中消去,並撤銷屬於該進程的一切“子孫進程”,若有父進程則從父進程PCB中刪除指向該進程的指針,並釋放撤銷進程所佔用的全部資源,或將其歸還給父進程,或歸還給系統。若被撤銷的進程處於執行狀態,應立即中斷該進程的執行,並設置調度標識為真,以指示該進程被撤銷後系統應重新調度 [3] 

原語阻塞原語

阻塞原語的大致工作過程如下:開始時,進程正處於執行狀態,因此首先應中斷CPU執行,並保存該進程的CPU現場,然後把阻塞狀態賦予該進程,並將它插入具有相同實體的阻塞隊列中 [3] 

原語喚醒原語

一進程因為等待事件的發生而處於阻塞狀態,當等待的事件完成後,進程又具有了繼續執行的條件,這時就要把該進程從阻塞狀態轉變為就緒狀態,這個工作由喚醒原語來完成。喚醒原語執行的操作有:先把被喚醒進程從阻塞隊列中移出,設置該進程當前狀態為就緒狀態,然後再將該進程插入到就緒隊列中 [3] 

原語PV原語

PV原語通過操作信號量來處理進程間的同步與互斥的問題。其核心就是一段不可分割不可中斷的程序。 信號量的概念1965年由著名的荷蘭計算機科學家Dijkstra提出,其基本思路是用一種新的變量類型(semaphore)來記錄當前可用資源的數量。semaphore有兩種實現方式:
1) semaphore的取值必須大於或等於0。0表示當前已沒有空閒資源,而正數表示當前空閒資源的數量;
2) semaphore的取值可正可負,負數的絕對值表示正在等待進入臨界區的進程個數。
信號量是由操作系統來維護的,用户進程只能通過初始化和兩個標準原語(P、V原語)來訪問。初始化可指定一個非負整數,即空閒資源總數。

原語P原語

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

原語V原語

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;
參考資料