日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

信号量 Linux(linux信号量编程)

發(fā)布時間:2023/12/2 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 信号量 Linux(linux信号量编程) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

spinlock和Semaphore信號量的區(qū)別?

Mutex是一把鑰匙,一個人拿了就可進入一個房間,出來的時候把鑰匙交給隊列的第一個。一般的用法是用于串行化對critical section代碼的訪問,保證這段代碼不會被并行的運行。

Semaphore是一件可以容納N人的房間,如果人不滿就可以進去,如果人滿了,就要等待有人出來。對于N=1的情況,稱為binary semaphore。一般的用法是,用于限制對于某一資源的同時訪問。

Binary semaphore與Mutex的差異:

在有的系統(tǒng)中Binary semaphore與Mutex是沒有差異的。在有的系統(tǒng)上,主要的差異是mutex一定要由獲得鎖的進程來釋放。而semaphore可以由其它進程釋放(這時的semaphore實際就是個原子的變量,大家可以加或減),因此semaphore可以用于進程間同步。Semaphore的同步功能是所有系統(tǒng)都支持的,而Mutex能否由其他進程釋放則未定,因此建議mutex只用于保護critical section。而semaphore則用于保護某變量,或者同步。

另一個概念是spin lock,這是一個內(nèi)核態(tài)概念。spin lock與semaphore的主要區(qū)別是spin lock是busy waiting,而semaphore是sleep。對于可以sleep的進程來說,busy waiting當然沒有意義。對于單CPU的系統(tǒng),busy waiting當然更沒意義(沒有CPU可以釋放鎖)。因此,只有多CPU的內(nèi)核態(tài)非進程空間,才會用到spin lock。Linux kernel的spin lock在非SMP的情況下,只是關irq,沒有別的操作,用于確保該段程序的運行不會被打斷。其實也就是類似mutex的作用,串行化對critical section的訪問。但是mutex不能保護中斷的打斷,也不能在中斷處理程序中被調(diào)用。而spin lock也一般沒有必要用于可以sleep的進程空間。

---------------------------------------------------------------------------------------------

內(nèi)核同步措施

為了避免并發(fā),防止競爭。內(nèi)核提供了一組同步方法來提供對共享數(shù)據(jù)的保護。 我們的重點不是介紹這些方法的詳細用法,而是強調(diào)為什么使用這些方法和它們之間的差別。

Linux 使用的同步機制可以說從2.0到2.6以來不斷發(fā)展完善。從最初的原子操作,到后來的信號量,從大內(nèi)核鎖到今天的自旋鎖。這些同步機制的發(fā)展伴隨 Linux從單處理器到對稱多處理器的過度;伴隨著從非搶占內(nèi)核到搶占內(nèi)核的過度。鎖機制越來越有效,也越來越復雜。

目前來說內(nèi)核中原子操作多用來做計數(shù)使用,其它情況最常用的是兩種鎖以及它們的變種:一個是自旋鎖,另一個是信號量。我們下面就來著重介紹一下這兩種鎖機制。

自旋鎖

自旋鎖是專為防止多處理器并發(fā)而引入的一種鎖,它在內(nèi)核中大量應用于中斷處理等部分(對于單處理器來說,防止中斷處理中的并發(fā)可簡單采用關閉中斷的方式,不需要自旋鎖)。

自旋鎖最多只能被一個內(nèi)核任務持有,如果一個內(nèi)核任務試圖請求一個已被爭用(已經(jīng)被持有)的自旋鎖,那么這個任務就會一直進行忙循環(huán)——旋轉(zhuǎn)——等待鎖重新可用。要是鎖未被爭用,請求它的內(nèi)核任務便能立刻得到它并且繼續(xù)進行。自旋鎖可以在任何時刻防止多于一個的內(nèi)核任務同時進入臨界區(qū),因此這種鎖可有效地避免多處理器上并發(fā)運行的內(nèi)核任務競爭共享資源。

事實上,自旋鎖的初衷就是:在短期間內(nèi)進行輕量級的鎖定。一個被爭用的自旋鎖使得請求它的線程在等待鎖重新可用的期間進行自旋(特別浪費處理器時間),所以自旋鎖不應該被持有時間過長。如果需要長時間鎖定的話, 最好使用信號量。

自旋鎖的基本形式如下:

spin_lock(&mr_lock);

//臨界區(qū)

spin_unlock(&mr_lock);

因為自旋鎖在同一時刻只能被最多一個內(nèi)核任務持有,所以一個時刻只有一個線程允許存在于臨界區(qū)中。這點很好地滿足了對稱多處理機器需要的鎖定服務。在單處理器上,自旋鎖僅僅當作一個設置內(nèi)核搶占的開關。如果內(nèi)核搶占也不存在,那么自旋鎖會在編譯時被完全剔除出內(nèi)核。

簡單的說,自旋鎖在內(nèi)核中主要用來防止多處理器中并發(fā)訪問臨界區(qū),防止內(nèi)核搶占造成的競爭。另外自旋鎖不允許任務睡眠(持有自旋鎖的任務睡眠會造成自死鎖——因為睡眠有可能造成持有鎖的內(nèi)核任務被重新調(diào)度,而再次申請自己已持有的鎖),它能夠在中斷上下文中使用。

死鎖:假設有一個或多個內(nèi)核任務和一個或多個資源,每個內(nèi)核都在等待其中的一個資源,但所有的資源都已經(jīng)被占用了。這便會發(fā)生所有內(nèi)核任務都在相互等待,但它們永遠不會釋放已經(jīng)占有的資源,于是任何內(nèi)核任務都無法獲得所需要的資源,無法繼續(xù)運行,這便意味著死鎖發(fā)生了。自死瑣是說自己占有了某個資源,然后自己又申請自己已占有的資源,顯然不可能再獲得該資源,因此就自縛手腳了。

信號量

Linux中的信號量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的信號量時,信號量會將其推入等待隊列,然后讓其睡眠。這時處理器獲得自由去執(zhí)行其它代碼。當持有信號量的進程將信號量釋放后,在等待隊列中的一個任務將被喚醒,從而便可以獲得這個信號量。

信號量的睡眠特性,使得信號量適用于鎖會被長時間持有的情況;只能在進程上下文中使用,因為中斷上下文中是不能被調(diào)度的;另外當代碼持有信號量時,不可以再持有自旋鎖。

信號量基本使用形式為:

static DECLARE_MUTEX(mr_sem);//聲明互斥信號量

if(down_interruptible(&mr_sem))

//可被中斷的睡眠,當信號來到,睡眠的任務被喚醒

//臨界區(qū)

up(&mr_sem);

信號量和自旋鎖區(qū)別

雖然聽起來兩者之間的使用條件復雜,其實在實際使用中信號量和自旋鎖并不易混淆。注意以下原則:

如果代碼需要睡眠——這往往是發(fā)生在和用戶空間同步時——使用信號量是唯一的選擇。由于不受睡眠的限制,使用信號量通常來說更加簡單一些。如果需要在自旋鎖和信號量中作選擇,應該取決于鎖被持有的時間長短。理想情況是所有的鎖都應該盡可能短的被持有,但是如果鎖的持有時間較長的話,使用信號量是更好的選擇。另外,信號量不同于自旋鎖,它不會關閉內(nèi)核搶占,所以持有信號量的代碼可以被搶占。這意味者信號量不會對影響調(diào)度反應時間帶來負面影響。

自旋鎖對信號量

需求 建議的加鎖方法

低開銷加鎖 優(yōu)先使用自旋鎖

短期鎖定 優(yōu)先使用自旋鎖

長期加鎖 優(yōu)先使用信號量

中斷上下文中加鎖 使用自旋鎖

持有鎖是需要睡眠、調(diào)度 使用信號量

linux怎么實現(xiàn)二進制信號?

用echo直接可以十六進制寫到文件里去。
echo -e -n "x11x22" > test

這樣就把兩個字節(jié)數(shù)據(jù)0x11和0x22寫入到了文件test中

總結

以上是生活随笔為你收集整理的信号量 Linux(linux信号量编程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。