訊號量semaphore解析

2021-09-08 04:38:56 字數 1814 閱讀 8107

1 基礎概念

訊號量在建立時須要設定乙個初始值,表示同一時候能夠有幾個任務能夠訪問該訊號量保護的共享資源。初始值為1就變成相互排斥鎖(mutex),即同一時候僅僅能有乙個任務能夠訪問訊號量保護的共享資源。

乙個任務要想訪問共享資源,首先必須得到訊號量,獲取訊號量的操作將把訊號量的值減1。若當前訊號量的值為負數,表明無法獲得訊號量。該任務必須掛起在該訊號量的等待佇列等待該訊號量可用;若當前訊號量的值為非負數。表示能夠獲得訊號量,因而能夠立馬訪問被該訊號量保護的共享資源。

當任務訪問完被訊號量保護的共享資源後。必須釋放訊號量,釋放訊號量通過把訊號量的值加1實現,假設訊號量的值為非正數。表明有任務等待當前訊號量,因此它也喚醒全部等待該訊號量的任務。

訊號量被看做乙個物件。包括乙個整型變數、乙個程序等待佇列和down()up()操作函式,掛起的程序直接增加等待佇列,等待訊號量的釋放。這樣,程序間的上下文切換帶來了不小的開銷。針對要求時間效率的加鎖,特別是在多處理器的平台上,自旋鎖更合適。

自旋鎖沒有等待佇列。程序會在還有乙個程序上不斷自迴圈,等待該程序的自旋鎖的釋放,所以單處理器上不能夠用自旋鎖。

2 訊號量的api

eclare_mutex(name)

該巨集宣告乙個訊號量name並初始化它的值為0。即宣告乙個相互排斥鎖。

declare_mutex_locked(name)

該巨集宣告乙個相互排斥鎖name。但把它的初始值設定為0,即鎖在建立時就處在已鎖狀態。

因此對於這樣的鎖,通常是先釋放後獲得。

void sema_init (struct semaphore *sem, int val);

該函用於數初始化設定訊號量的初值。它設定訊號量sem的值為val。

void init_mutex (struct semaphore *sem);

該函式用於初始化乙個相互排斥鎖,即它把訊號量sem的值設定為1。

void init_mutex_locked (struct semaphore *sem);

該函式也用於初始化乙個相互排斥鎖,但它把訊號量sem的值設定為0,即一開始就處在已鎖狀態。 

void down(struct semaphore * sem);

該函式用於獲得訊號量sem,它會導致睡眠,因此不能在中斷上下文(包含irq上下文和softirq上下文)使用該函式。該函式將把sem的值減1。假設訊號量sem的值非負。就直接返回,否則呼叫者將被掛起。直到別的任務釋放該訊號量才幹繼續執行。 

int down_interruptible(struct semaphore * sem);

該函式功能與down類似。不同之處為,down不會被訊號(signal)打斷。但down_interruptible能被訊號打斷,因此該函式有返回值來區分是正常返回還是被訊號中斷,假設返回0。表示獲得訊號量正常返回,假設被訊號打斷。返回-eintr。

int down_trylock(struct semaphore * sem);

該函式試著獲得訊號量sem。假設可以立馬獲得,它就獲得該訊號量並返回0。否則,表示不能獲得訊號量sem,返回值為非0值。因此,它不會導致呼叫者睡眠,可以在中斷上下文使用。 

void up(struct semaphore * sem);

該函式釋放訊號量sem,即把sem的值加1,假設sem的值為非正數。表明有任務等待該訊號量。因此喚醒這些等待者。

Semaphore訊號量原始碼解析

一 用法 訊號量,semaphore可以控同時訪問的執行緒個數,通過 acquire 獲取乙個許可,如果沒有就等待,而 release 釋放乙個許可。二 原始碼 構造方法,設定可以同時執行的執行緒數量。這裡可以設定是公平的,還是非公平的。這裡先說非公平的。acqurie 本質是aqs的方法,這個方法...

Semaphore初識 java訊號量

朋友在寫 活動的時候,為了控制線程,用到了semaphore類 之前也是沒有用到過,就簡單認識一下它。semaphore,是負責協調各個執行緒,以保證它們能夠正確 合理的使用公共資源。也是作業系統中用於控制程序同步互斥的量。或者說,簡單的來講,就 是訊號量。比如我們去網咖開機子上網 原諒樓主是個網癮...

訊號量Semaphore學習總結

訊號量 semaphore 有時被稱為訊號燈,是在多執行緒環境下使用的一種設施,是可以用來保證兩個或多個關鍵 段不被併發呼叫。在進入乙個關鍵 段之前,執行緒必須獲取乙個訊號量 一旦該關鍵 段完成了,那麼該執行緒必須釋放訊號量。其它想進入該關鍵 段的執行緒必須等待直到第乙個執行緒釋放訊號量。為了完成這...