7.6 訊號量
訊號量(semaphore)是作業系統中最典型的用於同步和互斥的手段,訊號量的值可以是0、1或者n。訊號量與作業系統中的經典概念pv操作對應。
p(s):
①將訊號量s的值減1,即s=s-1;
②如果s≥0,則該程序繼續執行;否則該程序置為等待狀態,排入等待佇列。
v(s):
①將訊號量s的值加1,即s=s+1;
②如果s>0,喚醒佇列中等待訊號量的程序。
linux中與訊號量相關的操作主要有下面幾種。
#include
1.定義訊號量
定義名稱為sem的訊號量:
struct semaphore sem;
2.初始化訊號量
void sema_init(struct semaphore *sem, int val);
該函式初始化訊號量,並設定訊號量sem的值為val。
3.獲得訊號量
1)void down(struct semaphore * sem);// 可引起睡眠
該函式用於獲得訊號量sem,它會導致睡眠,不能在中斷上下文中使用。
2)int down_interruptible(struct semaphore * sem);//能被訊號打斷
該函式功能與down類似,不同之處為,因為down()進入睡眠狀態的程序不能被訊號打斷,但因為down_interruptible()進入睡眠狀態的程序能被訊號打斷,訊號也會導致該函式返回,這時候函式的返回值非0。
3)int down_trylock(struct semaphore * sem);// 非阻塞函式,不會睡眠。無法鎖定資源則馬上返回
該函式嘗試獲得訊號量sem,如果能夠立刻獲得,它就獲得該訊號量並返回0,否則,返回非0值。它不會導致呼叫者睡眠,可以在中斷上下文中使用。
注意:使用down_interruptible()獲取訊號量時,對返回值一般會進行檢查,如果非0,通常立即返回-erestartsys,如:
if (down_interruptible(&sem))
return -erestartsys;
4.釋放訊號量
void up(struct semaphore * sem);
該函式釋放訊號量sem,喚醒等待者。
作為一種可能的互斥手段,訊號量可以保護臨界區,使用方式和自旋鎖類似。與自旋鎖相同,只有得到訊號量的程序才能執行臨界區**。與自旋鎖不同的是,當獲取不到訊號量時,程序不會原地打轉而是進入休眠等待狀態。
用作互斥時,訊號量一般這樣被使用:
由於新的linux核心傾向於直接使用mutex作為互斥手段,訊號量用作互斥不再被推薦使用。
訊號量也可以用於同步,乙個程序a執行down()等待訊號量,另外乙個程序b執行up()釋放訊號量,這樣程序a就同步地等待了程序b。
第7章 Linux併發控制 完成量
7.8 完成量 linux提供了完成量 completion,完成量 完成量用於乙個執行單元等待另乙個執行單元執行完某事。linux中與完成量相關的操作主要有以下4種。include 1.定義完成量 定義名為my completion的完成量 struct completion my complet...
Linux併發(POSIX訊號量)
system v的訊號量是老古董,除非萬不得已,否則我們一般用posix訊號量,好用 簡單 靠譜。拓展 posix訊號量分為兩種,分別是posix無名訊號量和posix有名訊號量,這兩種訊號量比之前介紹的system v的訊號量機制要簡潔,雖然沒有後者的應用範圍那麼廣泛 尤其在一些老系統中,因為sy...
作業系統 訊號量 併發控制
0.基礎概念 程序同步 有邏輯的程序之間需要有一定的先後順序 程序互斥 程序之間對臨界資源的使用 1.產生背景 由於多個程序要使用臨界資源,必須對臨界資源進行管理 臨界資源是一次僅允許乙個程序使用的共享資源 每個程序中訪問臨界資源的那段程式稱為臨界區,或者叫臨界 2.關於pv操作 p,v原語的理論不...