為了更加深入理解訊號量我們還需了解一下幾個概念
原子操作意為不可被中斷的乙個或一系列操作,也可以理解為就是一件事情要麼做了,要麼沒做。而原子操作的實現,一般是依靠硬體來實現的。
同步:程序同步指的是多個程序需要相互配合共同完成一項任務,在訪問資源的時候,以某種特定順序的方式去訪問資源
互斥:乙個資源每次只能被乙個程序所訪問。
臨界區是一段**,在這段**中程序將訪問臨界資源(例如:公用的裝置或是儲存器),當有程序進入臨界區時,其他程序必須等待,有一些同步的機制必須在臨界區段的進入點和離開點實現,確保這些共用資源被互斥所獲得。
不同程序能夠看到的乙份公共的資源(如:印表機,磁帶機等),且一次僅允許乙個程序使用的資源稱為臨界資源。
1、訊號量的本質是資料操作鎖,它本身不具有資料交換的功能,而是通過控制其他的通訊資源(檔案,外部裝置)來實現程序間通訊,它本身只是一種外部資源的標識。
2、訊號量在此過程中負責資料操作的互斥、同步等功能。
為了防止出現因多個程序同時訪問乙個共享資源而引發的問題,我們需要一種方法,可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行流訪問**的臨界區域。而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時刻只有乙個執行流在訪問它。簡言之:訊號量的主要目的是為了保護臨界資源。
為了正確的實現訊號量,訊號量的操作應是原子操作
1、測試控制該資源的訊號量。
2、若此訊號量的值為正,則程序可以使用該資源。程序將訊號量值減1,,表示乙個資源被使用。
3、若此訊號量的值為0,則程序進入休眠狀態,直至訊號量值大於0,程序被喚醒,從新進入第1步。
4、當程序不再使用由乙個訊號控制的共享資源時,該訊號量值增1,如果有程序正在休眠等待該訊號量,則會被喚醒。
p原語
p(s)
}
v原語
注釋:
(1)功能:用來建立和訪問乙個訊號量集
(2)引數:
key—訊號量的名字
nsems—訊號量集中訊號量的個數
sem***—呼叫函式的操作型別,也可用於設定訊號量集的訪問許可權,通過or運算使用。
ipc_creat | ipc _excl | 0666 :一般用於建立,可保證返回乙個新的id,同時制定許可權為666
ipc_creat : 用於獲取乙個已經存在的id
(3)返回值:成功返回乙個非負整數,即該訊號量的標識碼;失敗返回-1
注釋:
(1)功能:用來初始化訊號集,或者刪除訊號集。
(2)引數:
semid:訊號量集ipc 識別符號。
semun:操作訊號在訊號集中的編號,第乙個訊號的號是0.
cmd:在semid指定的訊號量集合上執行此命令。
cmd常用命令:
ipc_seat:對此集合取semid_ds 結構,並存放在由arg.buf指向的結構中。
ipc_rmid:從系統中刪除該訊號量集合。
setval:設定訊號量集中的乙個單獨的訊號量的值,此時需要傳入第四個引數。
第四個引數是可選的,如果使用該引數,則其型別是semun,它是多個特定命令引數的聯合(union):
注釋:
(1)功能:操作乙個或一組訊號。也可以叫pv操作
(2)引數:
semid:訊號集的識別碼,可以通過semget獲取。
sops:是乙個指標,指向乙個訊號量運算元組。
nsops:訊號操作結構的數量,恆大於或等於1.
(3)返回值:成功執行時,都會回0,失敗返回-1,並設定errno錯誤資訊。
sembuf結構體
struct sembuf
;
說明:
(1)sem_num:操作訊號在訊號集中的編號,第乙個訊號的編號是0,最後乙個訊號的編號是nsems-1。
(2)sem_op:操作訊號量
若sem_op 為負(p操作), 其絕對值又大於訊號的現有值,操作將會阻塞,直到訊號值大於或等於sem_op的絕對值。通常用於獲取資源的使用權。
若sem_op 為正(v操作), 該值會加到現有的訊號內值上。通常用於釋放所控制資源的使用權。
sem_op的值為0:如果沒有設定ipc_nowait,則呼叫該操作的程序或執行緒將暫時睡眠,直到訊號量的值為0;否則程序或執行緒會返回錯誤eagain。
(3)sem_***: 訊號操作標識,有如下兩種選擇:
ipc_nowait:對訊號的操作不能滿足時,semop()不會阻塞,並立即返回,同時設定錯誤資訊。
sem_undo:程式結束時(正常退出或異常終止),保證訊號值會被重設為semop()呼叫前的值。避免程式在異常情況下結束時未解鎖鎖定的資源,早成資源被永遠鎖定。造成死鎖。
程序間通訊 訊號量
ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...
程序間通訊 訊號量
system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket t 在終端輸入命令 ipcs 可以看到目前系統中所有的ipc資訊 共享記憶體段 鍵 shmid 擁有者 許可權 位元組 nattch 狀...
程序間通訊 訊號量
訊號量不是ipc 機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別 二元訊號 值為0或 1,1說明有可用資源,0說明此時資源占用,其他程序需等待。計數訊號量 表示可用資源數量。計數訊號量集 由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。訊號量資料結構 include ...