sem就是乙個睡眠鎖.如果有乙個任務試圖獲得乙個已被持有的訊號量時,訊號量會將其推入等待佇列,然後讓其睡眠。這時處理器獲得自由去執行其它**。當持有訊號量的程序將訊號量釋放後,在等待佇列中的乙個任務將被喚醒,從而便可以獲得這個訊號量。訊號量一般在用程序上下文中.它是為了防止多程序同時訪問乙個共享資源(臨界區).
spin_lock叫自旋鎖.就是當試圖請求乙個已經被持有的自旋鎖.這個任務就會一直進行 忙迴圈——旋轉——等待,直到鎖重新可用(它會一直這樣,不釋放cpu,它只能用在短時間加鎖).它是為了防止多個cpu同時訪問乙個共享資源(臨界區).它一般用在中斷上下文中,因為中斷上下文不能被中斷,也不能被排程.
自旋鎖對訊號量 需求
建議的加鎖方法
低開銷加鎖
優先使用自旋鎖
短期鎖定
優先使用自旋鎖
長期加鎖
優先使用訊號量
中斷上下文中加鎖
使用自旋鎖
持有鎖是需要睡眠、排程
使用訊號量
程序間的sem.執行緒間的sem與核心中的sem的功能就很類似.
程序間的sem,執行緒間的sem功能是一樣的.只是執行緒的sem,它在同乙個程序空間,他的初始化,使用更方便.
程序間的sem,就是程序間通訊的一部分,使用semget,semop等系統呼叫來完成.
核心中的sem 被鎖定,就等於被呼叫的程序占有了這個sem.其它程序就只能進行睡眠佇列.這與程序間的sem基本一致.
區別
spin_lock
semaphore
保護的物件
一段**
乙個裝置(必要性不強),
乙個變數,
一段**
保護區可被搶占
不可以可以。
可允許在保護物件(**
)中休眠
不可以可以。但最好不這樣。
保護區能否被中斷打斷
可以,這樣容易引發死鎖。
最好是關了中斷再使用此鎖。
因為有可能中斷處理例程也需要得到同乙個鎖。
可以。其它功能
可完成同步,有傳達資訊的能力。
試圖占用鎖不成功後,程序的表現
不放開cpu
,自己自旋。
進入乙個等待佇列。
釋放鎖後,還有其它程序等待時,核心如何處理
某cpu(不是程序)最先發現鎖已釋放,則它就得到了鎖。
從等待佇列中選乙個出來占用此sem.
核心對使用者的要求
被保護的**執行時間要短,是原子的,
不能主動的休眠。
不能呼叫有可以休眠的核心函式。
風險發生死鎖
不允許鎖的持有者二次請求同乙個鎖。
不允許鎖的持有者二次請求同乙個鎖。
訊號量在生產者與消費者模式中可以進行同步。
當sem的down和up分別出現在對立函式中(讀,寫函式),其實這就是在傳達一種資訊。表示當前是否有資料可讀的資訊。
read_somthing()
down(裝置) 占用了此裝置 此時沒有其它人都使用此裝置上的所有操作(函式)
if(有資料)
讀完它。
()else
up(裝置)
down(有資料的sem)sem=1表示有資料,為0表示無資料。}}
write_somthing()
down(裝置) 占用了此裝置 此時沒有其它人都使用此裝置上的所有操作(函式)
if(有資料)
不寫。up(裝置)
return
else
寫入資料
up(有資料的sem)sem=1表示有資料,為0表示無資料。
up(裝置)
return;
}
訊號燈執行緒
這裡設定了乙個boolean的值,預設值是false 這裡面有二個執行緒,二個執行緒同時進入到tv 想象為容器 這個容器中 去拿資料!注意這裡有乙個boolean型別的燈!執行緒進去尋找方法!當boolean true的時候,生產表演了 voice!當boolean false的時候!就進去了!然後...
第10章 Posix訊號燈
三種訊號燈 說明 p v操作 互斥鎖 條件變數和訊號量之間的差別 include for o constants include for mode constants include sem t sem open const char name,int oflag sem t sem open co...
11訊號燈集 函式用法
1.建立訊號燈集 int semget key t key,int nsems,int sem 成功時返回訊號燈的id,失敗返回 1 示例 semget ipc private,3,0777 key 和訊息佇列關聯的key ipc private或ftok nsems 集合中包含的計數訊號燈的個數 ...