深入理解Linux

信號(hào)量

信號(hào)量僅僅是一個(gè)與數(shù)據(jù)結(jié)構(gòu)相關(guān)得計(jì)數(shù)器。所有的內(nèi)核線程在試圖訪問這個(gè)數(shù)據(jù)結(jié)構(gòu)之前,都要檢查這個(gè)信號(hào)量??梢园衙總€(gè)信號(hào)量看成一個(gè)對(duì)象。組成如下:

  • 一個(gè)整數(shù)變量
  • 一個(gè)等待進(jìn)程得鏈表
  • 兩個(gè)原子方法:down() 和 up()

down()方法對(duì)信號(hào)量的值減1,如果這個(gè)新值小于0,該方法就把正在運(yùn)行的進(jìn)程加入到這個(gè)信號(hào)量鏈表,然后阻塞該進(jìn)程(即調(diào)用調(diào)度程序)。up()方法對(duì)信號(hào)量的值加1,如果這個(gè)新的值大于或等于0,則激活這個(gè)信號(hào)量鏈表中的一個(gè)或多個(gè)進(jìn)程。

每個(gè)要保護(hù)的數(shù)據(jù)結(jié)構(gòu)都有它自己的信號(hào)量,其初始值為1。當(dāng)內(nèi)核控制路徑希望訪問到這個(gè)數(shù)據(jù)結(jié)構(gòu)時(shí),它在相應(yīng)得信號(hào)量上執(zhí)行down()方法。如果信號(hào)量得當(dāng)前值不是負(fù)數(shù),則允許訪問這個(gè)數(shù)據(jù)結(jié)構(gòu)。否則,把執(zhí)行內(nèi)核控制路徑得進(jìn)程加入到這個(gè)信號(hào)量得鏈表并阻塞該進(jìn)程。當(dāng)另一個(gè)進(jìn)程在那個(gè)信號(hào)量上執(zhí)行up()方法時(shí),允許信號(hào)量鏈表上的應(yīng)一個(gè)進(jìn)程繼續(xù)執(zhí)行。

自旋鎖(spin lock)

自旋鎖與信號(hào)量非常相識(shí),但是沒有進(jìn)程鏈表,當(dāng)一個(gè)進(jìn)程發(fā)現(xiàn)鎖被另外一個(gè)進(jìn)程鎖著時(shí),它就不停地“旋轉(zhuǎn)”, 執(zhí)行一個(gè)緊湊的循環(huán)指令直到鎖打開。

自旋鎖在單處理環(huán)境下是無效的。當(dāng)內(nèi)核控制路徑試圖訪問一個(gè)上鎖的數(shù)據(jù)結(jié)構(gòu)時(shí),它開始死循環(huán)。因此,內(nèi)核控制路徑可能因?yàn)檎谛薷氖鼙Wo(hù)的數(shù)據(jù)結(jié)構(gòu)而沒有機(jī)會(huì)繼續(xù)執(zhí)行,也沒有機(jī)會(huì)釋放這個(gè)自旋鎖。最終的結(jié)果可能是系統(tǒng)掛起。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容