整型訊號量與記錄型訊號量

2022-08-17 06:24:13 字數 2831 閱讀 7192

訊號量機構是一種功能較強的機制,可用來解決互斥與同步的問題,它只能被兩個標準的原語wait(s)和signal(s)來訪問,也可以記為「p操作」和「v操作」。

原語是指完成某種功能且不被分割不被中斷執行的操作序列,通常可由硬體來實現完成不被分割執行特性的功能。如前述的「test-and-set」和「swap」指令,就是由硬體實現的原子操作。原語功能的不被中斷執行特性在單處理機時可由軟體通過遮蔽中斷方法實現。

原語之所以不能被中斷執行,是因為原語對變數的操作過程如果被打斷,可能會去執行另乙個對同一變數的操作過程,從而出現臨界段問題。如果能夠找到一種解決臨界段問題的元方法,就可以實現對共享變數操作的原子性。整型訊號量被定義為乙個用於表示資源數目的整型量s,wait和signal操作可描述為:

複製

純文字新視窗

wait

(s)signal

(s)

wait(s)

signal(s)

wait操作中,只要訊號量s<=0,就會不斷地測試。因此,該機制並未遵循「讓權等待」 的準則,而是使程序處於「忙等」的狀態。記錄型訊號量是不存在「忙等」現象的程序同步機制。除了需要乙個用於代表資源數目的整型變數value外,再增加乙個程序鍊錶l,用於鏈結所有等待該資源的程序,記錄型訊號量是由於釆用了記錄型的資料結構得名。記錄型訊號量可描述為:

複製

純文字新視窗

typedef

struct

semaphore;

typedef struct semaphore;
相應的wait(s)和signal(s)的操作如下:

複製

純文字新視窗

void

wait

(semaphores)

}

void wait (semaphore s) 

}

wait操作,s.value--,表示程序請求乙個該類資源,當s.value<0時,表示該類資源已分配完畢,因此程序應呼叫block原語,進行自我阻塞,放棄處理機,並插入到該類資源的等待佇列s.l中,可見該機制遵循了「讓權等待」的準則。

複製

純文字新視窗

void

signal

(semaphores)

}

void signal (semaphore s) 

}

signal操作,表示程序釋放乙個資源,使系統中可供分配的該類資源數增1,故s.value++。若加1後仍是s.value<=0,則表示在s.l中仍有等待該資源的程序被阻塞,故還應呼叫wakeup 原語,將s.l中的第乙個等待程序喚醒。訊號量機構能用於解決程序間各種同步問題。設s為實現程序p1、p2同步的公共訊號量,初值為0。程序p2中的語句y要使用程序p1中語句x的執行結果,所以只有當語句x執行完成之後語句y才可以執行。其實現程序同步的演算法如下:

複製

純文字新視窗

semaphores =0;

//初始化訊號量p1(

)p2())

semaphore s = 0;  //初始化訊號量

p1 ( )

p2())

訊號量機構也能很方便地解決程序互斥問題。設s為實現程序pl、p2互斥的訊號量,由於每次只允許乙個程序進入臨界區,所以s的初值應為1(即可用資源數為1)。只需把臨界區置於p(s)和v(s)之間,即可實現兩程序對臨界資源的互斥訪問。其演算法如下:

複製

純文字新視窗

semaphores =1;

//初化訊號量p1(

)p2()

semaphore s = 1;  //初化訊號量

p1 ( )

p2()

互斥的實現是不同程序對同一訊號量進行p、v操作,乙個程序在成功地對訊號量執行了 p操作後進入臨界區,並在退出臨界區後,由該程序本身對該訊號量執行v操作,表示當前沒有程序進入臨界區,可以讓其他程序進入。訊號量也可以用來描述程式之間或者語句之間的前驅關係。圖2-8給出了乙個前驅圖,其中s1, s2, s3, …, s6是最簡單的程式段(只有一條語句)。為使各程式段能正確執行,應設定若干個初始值為「0」的訊號量。例如,為保證s1 -> s2、 s1 -> s3的前驅關係,應分別設定訊號量a1、a2。同樣,為了保證 s2 -> s4、s2 ->s5、s3 -> s6、s4 -> s6、s5 -> s6,應設定訊號量bl、b2、c、d、e。 

圖2-8 前驅圖舉例

實現演算法如下:

複製

純文字新視窗

semaphoreal=a2=bl=b2=c=d=e=0;

//初始化訊號量

s1()

s2()

s3()

s4()

s5()

s6()

semaphore  al=a2=bl=b2=c=d=e=0;  //初始化訊號量

s1()

s2()

s3()

s4()

s5()

s6()

1) 關係分析。找出問題中的程序數,並且分析它們之間的同步和互斥關係。同步、互斥、前驅關係直接按照上面例子中的經典正規化改寫。

2) 整理思路。找出解決問題的關鍵點,並且根據做過的題目找出解決的思路。根據程序的操作流程確定p操作、v操作的大致順序。

3) 設定訊號量。根據上面兩步,設定需要的訊號量,確定初值,完善整理。

說明:本文非原創,原始鏈結已不可查。

來自為知筆記(wiz)

AND型訊號量

避免出現多個資源共享導致的死鎖,那麼在每個程序把需要的各種資源都得到並完成計算之後釋放,另乙個程序也在拿到需要的全部資源之後計算,這樣就不會出現交叉使用資源的情況。每個程序把需要的全部資源拿到後才會進入臨界區。那麼wait操作就需要改變 wait s1,s2,sn else s1到sn都表示所需資源...

systemV訊號量 與 Posix訊號量

一 函式上的區別 訊號量有兩種實現 傳統的system v訊號量和新的posix訊號量。它們所提供的函式很容易被區分 對於所有system v訊號量函式,在它們的名字裡面沒有下劃線。例如,應該是semget 而不是sem get 然而,所有的的posix訊號量函式都有乙個下劃線。下面列出了它們提供的...

訊號量 二值訊號量

訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...