第7章 Linux併發控制 訊號量

2021-08-20 03:47:10 字數 1600 閱讀 7686

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原語的理論不...