王道操作系统考研笔记——2.3.4 信号量机制
文章目錄
- 2.3.4 信號量機制
- 2.3.4.1 引入
- 2.3.4.2 整型信號量
- 2.3.4.3 記錄型信號量
- 2.3.4.4 小結
2.3.4 信號量機制
知識總覽
在1965年,荷蘭學著Dijkstra提出了一種卓有成效的實現進程互斥、同步的方法——信號量機制。
2.3.4.1 引入
用戶進程可以通過使用操作系統提供的一對原語來對信號量進行操作,從而很方便的實現了進程互斥、進程同步。
一對原語:wait(S)原語和signal(S)原語,可以把原語理解為我們自己寫的函數,函數名為wait和signal,括號里的信號量S其實就是函數調用時傳入的一個參數。
wait、signal原語常常簡稱為P、V操作(來自荷蘭語proberen和verhogen)。因此,做題的時候常把wait(S)和signal(S)兩個操作分別寫為P(S)、V(S)
信號量其實就是一個變量(可以是一個整數,也可以是更復雜的記錄型變量),可以用一個信號量來表示系統中某種資源的數量,比如:系統中只有一臺打印機,就可以設置一個初值為1的信號量。
原語是一種特殊的程序段,其執行只能一氣呵成,不可被中斷。原語是由關中斷/開中斷指令實現的。軟件解決方案的主要問題是由"進入區的各種操作無法一氣呵成",因此如果能把進入區、退出區的操作都用原語實現,使這些操作能夠一氣呵成就能避免問題。
2.3.4.2 整型信號量
整型信號量就是用一個整數型的變量作為信號量,用來表示系統中某種資源的數量。其與普通整數變量的區別在于其無法做更多操作,只能初始化、P操作、V操作。
讓我們用C來描述整型信號量的機制,假設我們有一臺打印機,打印機作為一種臨界資源。
int S = 1//初始化整型信號量S,表示當前系統中可用的打印機資源數void wait(int s) //wait原語,相當于"進入區" {while(S<=0);//如果資源數不夠,就一直循環等待S = S-1;//如果資源數夠,則占用一個資源 }void signal(int S)//signal原語,相當于"退出區" {S = S+1; //使用完資源后,在退出區釋放資源 }進程P0: ... wait(S); 使用打印機資源; signal(S);由于使用了原語,操作只能一氣呵成,所以檢查和上鎖一氣呵成,避免了并發、異步導致的問題。而存在的問題是,其不滿足讓權等待,當一個進程占用處理機時,另一個進程會卡在wait操作的while循環步驟中,會發生忙等。
2.3.4.3 記錄型信號量
整型信號量的缺陷是存在忙等問題,因此人們又提出了記錄型信號量,即用記錄型數據結構表示的信號量。
讓我們看一下用C語言實現的邏輯:
/*記錄型信號量的定義*/ typedef struct {int value; //剩余資源數struct process *L; //等待隊列 }semaphore;/*某進程需要使用資源時,通過wait原語申請*/ void wait(semaphore S) {S.value--;if(S.value<0){block(S.L);} }/*進程使用完資源后,通過signal原語釋放*/ void signal(semphore S) {S.value++;if(S.value <= 0){wakeup(S.L)} }當剩余資源數不夠時,使用block原語使進程從運行態進入阻塞態,并把其掛到信號量S的等待隊列中。
當釋放完資源后,若還有別的進程在等待這種資源,則使用wakeup原語喚醒等待隊列中的一個進程,該進程從阻塞態變為就緒態。
我們來用一個例子詳細說明:
某計算機系統中有兩臺打印機,則可在初始化信號量S時將S.value的值設為2,隊列S.L設置為空。
/*記錄型信號量的定義*/ typedef struct {int value; //剩余資源數struct process *L; //等待隊列 }semaphore;void init(semaphote &S) {S.value = 2;S.L = null; }讓我們來回顧一下整個過程,wait(S)和signal(S)也可以即為P(S)和V(S),這對原語可用于實現系統資源的申請和釋放。其中S.value的初值表示系統中某種資源的數目。
對信號量S的一次P操作意味著進程請求一個單位的該類資源,因此需要執行S.value–,表示資源數-1,當S。value<0時表示該類資源已分配完畢,因此進程應調用bolck原語進行自我阻塞(當前運行的過程從運行態→阻塞態),主動放棄處理機,并插入該類資源的等待隊列S.L中,可見,該機制遵循了讓權等待的原則,不會出現忙等現象。
對信號量的一次V操作意味著進程釋放一個單位的該類資源,因此需要執行S.value++,表示資源數+1,若加1后仍是S.value<=0,表示依然有進程在等待該類資源,因此應該調用wakeup原語喚醒等待隊列中的第一個進程,讓其從阻塞態變為就緒態。
2.3.4.4 小結
總結
以上是生活随笔為你收集整理的王道操作系统考研笔记——2.3.4 信号量机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java连接数据库电商平台_Java数据
- 下一篇: 介绍自定义JDataGrid电子表格版本