- 論壇徽章:
- 0
|
本帖最后由 oceanljp 于 2011-06-14 17:39 編輯
最近在看宋寶華的《設(shè)備驅(qū)動(dòng)開發(fā)詳解》第二版,看到自旋鎖的部分,有些疑惑,所以來請(qǐng)教下大家。
下面是我參考一些網(wǎng)絡(luò)上的資料得出的一些想法,不知正確與否,記錄下來大家討論下:
(1) linux上的自旋鎖有三種實(shí)現(xiàn):
1. 在單cpu,不可搶占內(nèi)核中,自旋鎖為空操作。
2. 在單cpu,可搶占內(nèi)核中,自旋鎖實(shí)現(xiàn)為“禁止內(nèi)核搶占”,并不實(shí)現(xiàn)“自旋”。
3. 在多cpu,可搶占內(nèi)核中,自旋鎖實(shí)現(xiàn)為“禁止內(nèi)核搶占” + “自旋”。
(2) 關(guān)于搶占式內(nèi)核與非搶占式內(nèi)核:
在非搶占式內(nèi)核中,如果一個(gè)進(jìn)程在內(nèi)核態(tài)運(yùn)行,其只有在以下兩種情況會(huì)被切換:
1. 其運(yùn)行完成(返回用戶空間)
2. 主動(dòng)讓出cpu(即主動(dòng)調(diào)用schedule或內(nèi)核中的任務(wù)阻塞——這同樣也會(huì)導(dǎo)致調(diào)用schedule)
在搶占式內(nèi)核中,如果一個(gè)進(jìn)程在內(nèi)核態(tài)運(yùn)行,其只有在以下四種情況會(huì)被切換:
1. 其運(yùn)行完成(返回用戶空間)
2. 主動(dòng)讓出cpu(即主動(dòng)調(diào)用schedule或內(nèi)核中的任務(wù)阻塞——這同樣也會(huì)導(dǎo)致調(diào)用schedule)
3. 當(dāng)從中斷處理程序正在執(zhí)行,且返回內(nèi)核空間之前(此時(shí)可搶占標(biāo)志premptcount須為0) 。
4. 當(dāng)內(nèi)核代碼再一次具有可搶占性的時(shí)候,如解鎖及使能軟中斷等。
在宋寶華的書中,有提到在使用自旋鎖時(shí),要避免用來保護(hù)“包含引起阻塞的代碼”,因?yàn)樽枞馕吨M(jìn)行進(jìn)程的切換。這點(diǎn)讓我很迷惑。因?yàn)樵诳蓳屨际絻?nèi)核中使用自旋鎖,是“禁止內(nèi)核搶占”的,既然“禁止內(nèi)核搶占”怎么又會(huì)發(fā)生進(jìn)程的切換呢?
現(xiàn)在我是這么想的:禁止內(nèi)核搶占只是關(guān)閉“可搶占標(biāo)志”,而不是禁止進(jìn)程切換。顯式使用schedule或進(jìn)程阻塞(此也會(huì)導(dǎo)致調(diào)用schedule)時(shí),還是會(huì)發(fā)生進(jìn)程調(diào)度的。
這里補(bǔ)充一些想法:宋寶華的書上說,在使用自旋鎖保護(hù)臨界區(qū)時(shí),如臨界區(qū)中因“包含引起阻塞代碼”而引發(fā)阻塞,從而引起進(jìn)程切換后,若另一進(jìn)程企圖獲得本自旋鎖,死鎖會(huì)發(fā)生。
個(gè)人感覺,只有在多cpu,內(nèi)核可搶占的情況會(huì)發(fā)生死鎖。而在單cpu,內(nèi)核可搶占或不可搶占的情況,不會(huì)發(fā)生死鎖,但此時(shí)自旋鎖失效(即無法實(shí)現(xiàn)保護(hù)臨界區(qū)的功能)。這是因?yàn)槎郼pu可搶占內(nèi)核實(shí)現(xiàn)了“自旋”,所以會(huì)導(dǎo)致死鎖;而單cpu可搶占或不可搶占內(nèi)核,沒有實(shí)現(xiàn)“自旋”,僅僅是“禁止內(nèi)核搶占”,因此不會(huì)發(fā)生死鎖,但是會(huì)發(fā)生無保護(hù)的重復(fù)進(jìn)入臨界區(qū)的情況(即無法實(shí)現(xiàn)保護(hù)臨界區(qū)的功能)。
以上觀點(diǎn)只是個(gè)人想法,不當(dāng)之處,還請(qǐng)各位指出,謝謝。 |
評(píng)分
-
查看全部評(píng)分
|