信號(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)掛起。