訊號燈與自旋鎖對比。

2021-05-27 08:42:47 字數 1910 閱讀 8057

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 集合中包含的計數訊號燈的個數 ...