當前位置:首頁 > 嵌入式 > 嵌入式軟件

作者:楊碩,華清遠見嵌入式學院講師。

一、信號燈簡介:

Linux支持系統(tǒng)5的信號燈(semaphore),是一種進程間通信的方式,只不過它和管道、FIFO或者共享內存等不一樣,信號燈主要用于同步或者互斥對共享資源的訪問,它的發(fā)明來源于火車運行系統(tǒng)中的“信號燈”,利用信號燈可以實現 “PV操作”這種進程間同步機制。P操作是獲得資源,將信號燈的值減1,如果結果不為負則執(zhí)行完畢,進程獲得資源,否則進程睡眠以等待資源別的進程釋放資源;V操作則是釋放資源,給信號燈的值加1,釋放一個因執(zhí)行P操作而等待的進程。

二、信號燈的兩種類型

1、二值信號燈:

最簡單的信號燈形式,信號燈的值只能取0或1,類似于互斥鎖。

雖然二值信號燈能夠實現互斥鎖的功能,但兩者的關注內容不同。信號燈強調共享資源,只要共享資源可用,其他進程同樣可以修改信號燈的值;互斥鎖更強調進程,占用資源的進程使用完資源后,必須由進程本身來解鎖。

2、 計數信號燈:

信號燈的值可以取任意非負值(當然受內核本身的約束),用來統(tǒng)計資源,其值就代表可用資源的個數。

三、Linux下對信號燈的操作

1、 打開或創(chuàng)建信號燈

對應的系統(tǒng)調用:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semget(key_t key, int nsems, int sem*);

第一個參數key是一個鍵值,信號燈集的描述符就由系統(tǒng)范圍內唯一的一個鍵值生成。

key可以由ftok函數生產:

#include <sys/types.h>

#include <sys/ipc.h>

key_t ftok(conST char *pathname, int proj_id);

ftok返回與系統(tǒng)中的路徑pathname相對應的一個鍵值

nsems是信號燈集中信號燈的個數,其最大值取決于具體的系統(tǒng),如果是0,則代表訪問已存在的信號燈集。

sem*是一些標志位,它是IPC_CREAT、IPC_EXCL、IPC_NOWAIT三者與訪問權限或的結果,訪問權限一般都是0600,代表只有信號燈集的屬主才對信號燈集有讀寫的權限。

semget()如果執(zhí)行成功,返回與key對應的信號燈集描述字(非負整數,存在于內存之中),失敗返回-1,并將錯誤碼置于errno全局變量中。

2、操作信號燈

linux可以增加或減小信號燈的值,相應于對共享資源的釋放和占有。

對應的系統(tǒng)調用:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semop(int semid, struct sembuf *sops, unsigned nsops);

semop系統(tǒng)調用可以實現對由semid標志的信號燈集中的某一個指定信號燈的一系列操作。

semid即是semget返回的信號燈描述字。

sops是指向結構體sembuf的指針,可以是這種類型的結構體數組的頭指針,數組的每一個sembuf結構都刻畫一個在特定信號燈上的操作。

nsops為sops指向數組的大小(有幾個sembuf結構體)。

sembuf結構體定義如下:

struct sembuf

{

unsigned short sem_num; /* semaphore number */

short sem_op; /* semaphore operation */

short sem_*; /* operation flags */

};

sem_num對應信號燈集中的信號燈,0代表第一個信號燈。

sem_op的值決定了對sem_num指定的信號燈的三種不同操作:

● sem_op = 0,調用者阻塞等待直到信號燈的值等于0時返回。可以用來測試共享資源是否已用完。

● sem_op > 0,代表進程要申請-sem_op個共享資源。

如果信號燈值sem_val > abs(sem_op),則sem_val = sem_val-abs(sem_op);

否則調用進程睡眠直到sem_val>=abs(sem_op)。當然如果sem_*指定為IPC_NOWAIT,則調用進程立即返回。

● sem_op > 0,代表進程要釋放sem_op數量的共享資源。也就是V操作。

sem_*可取0,IPC_NOWAIT以及SEM_UNDO兩個標志。

● 0代表阻塞調用

● IPC_NOWAIT代表非阻塞調用

● 如果設置了SEM_UNDO標志,那么在進程結束時,相應的操作將被取消,這是比較重要的一個標志位。如果設置了該標志位,那么在進程沒有釋放共享資源就退出時,內核將代為釋放。如果為一個信號燈設置了該標志,內核都要分配一個 sem_undo結構來記錄它,為的是確保以后資源能夠安全釋放。事實上,如果進程退出了,那么它所占用就釋放了,但信號燈值卻沒有改變,此時,信號燈值反映的已經不是資源占有的實際情況,在這種情況下,問題的解決就靠內核來完成。這有點像僵尸進程,進程雖然退出了,資源也都釋放了,但內核進程表中仍然有它的記錄,此時就需要父進程調用waitpid來解決問題了。

semop調用成功返回0,失敗返回-1,并將錯誤碼置于errno全局變量中。

semop可以同時操作多個信號燈,在實際應用中,對應多種資源的申請或釋放。semop保證操作的原子性,這一點尤為重要。尤其對于多種資源的申請來說,要么一次性獲得所有資源,要么放棄申請,要么在不占有任何資源情況下繼續(xù)等待,這樣,一方面避免了資源的浪費;另一方面,避免了進程之間由于申請共享資源而造成死鎖。

3、 獲得或設置信號燈屬性:

對應的系統(tǒng)調用:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semctl(int semid, int semnum, int cmd, union semun arg);

semctl通過具體的cmd操作由semid標志的信號燈集上的由semnum指定的信號燈。

常用的cmd有一下幾個:

● IPC_STAT 獲取信號燈信息,信息由arg.buf返回;

● GETVAL 返回semnum所代表信號燈的值;

● SETVAL 設置semnum所代表信號燈的值為arg.val;

● IPC_RMID 刪除semnum所代表的信號燈

用戶需要自己定義聯合體semun如下:

union semun {

int val; /* Value for SETVAL */

struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */

unsigned short *Array; /* Array for GETALL, SETALL */

struct seminfo *__buf; /* Buffer for IPC_INFO (Linux-specific) */

};

semctl調用成功返回0,失敗返回-1,并將錯誤碼置于errno全局變量中。

四、利用信號燈實現PV操作

1、P操作:申請資源

這里我們封裝一個函數down():

/*

* function: ask for resource, P operation

* parameter: sem_id : identifier of a semaphore set;

sem_num : semaphore number

* return value: none

*/

void down(int sem_id, int sem_num)

{

struct sembuf op;

op.sem_num = sem_num;

op.sem_op = -1;

op.sem_* = 0;

semop(sem_id, &op, 1);

}

2、V操作:釋放資源

這里我們封裝一個函數up():

/*

* function: free resource, V operation

* parameter: sem_id : identifier of a semaphore set;

sem_num : semaphore number

* return value: none

*/

void up(int sem_id, int sem_num)

{

struct sembuf op;

op.sem_num = sem_num;

op.sem_op = 1;

op.sem_* = 0;

semop(sem_id, &op, 1);

}

“本文由華清遠見http://www.embedu.org/index.htm提供”



華清遠見

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉