亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 11937 | 回復(fù): 12
打印 上一主題 下一主題

關(guān)于自旋鎖與內(nèi)核搶占的一些想法,大蝦過來指點(diǎn)下。 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-06-14 15:58 |只看該作者 |倒序?yàn)g覽
本帖最后由 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)分

參與人數(shù) 1可用積分 +6 收起 理由
Godbach + 6 感謝分享

查看全部評(píng)分

論壇徽章:
1
射手座
日期:2013-11-07 09:19:48
2 [報(bào)告]
發(fā)表于 2011-06-14 17:38 |只看該作者
阻塞當(dāng)然意味著要進(jìn)行進(jìn)程切換,當(dāng)前進(jìn)程阻塞也就是說當(dāng)前進(jìn)程去sleep了,這時(shí)候kernel會(huì)調(diào)用scheduler來選擇一個(gè)合適的進(jìn)程進(jìn)入running狀態(tài)。這個(gè)過程和禁止搶占不矛盾。
使用自旋鎖時(shí),要避免用來保護(hù)“包含引起阻塞的代碼”,我的理解是這樣的:自旋鎖的實(shí)現(xiàn)是“搶的到就繼續(xù),否則就自旋——空循環(huán)”,如果一個(gè)進(jìn)程長時(shí)間持有自旋鎖,將會(huì)導(dǎo)致其他爭用該自旋鎖的進(jìn)程長時(shí)間處于自旋狀態(tài),而進(jìn)程自旋的時(shí)候其實(shí)什么都不做,白白消耗其時(shí)間片,浪費(fèi)CPU時(shí)間。所以使用自旋鎖的一個(gè)原則就是不要長時(shí)間持有它。如果在持有自旋鎖的期間進(jìn)程sleep了,那將導(dǎo)致持有該鎖的時(shí)間長度不可預(yù)期(鬼知道這個(gè)進(jìn)程什么時(shí)候會(huì)被wake up),這顯然會(huì)違反使用自旋鎖的上述原則。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-06-14 18:08 |只看該作者
回復(fù) 2# guocslock

同意樓上第一個(gè)觀點(diǎn)。

第二個(gè)觀點(diǎn),使用自旋鎖時(shí),避免用來保護(hù)“包含引起阻塞的代碼”的主要原因,應(yīng)該是避免在阻塞并發(fā)生進(jìn)程調(diào)度后,再次進(jìn)入臨界區(qū)引起的“死鎖”或“無保護(hù)重復(fù)進(jìn)入臨界區(qū)的錯(cuò)誤”。“不長時(shí)間持有自旋鎖”應(yīng)該不是其主要原因。
而且如我在一樓所述,自旋鎖的實(shí)現(xiàn)在不同的情況下是不同的,并不都是“搶的到就繼續(xù),否則就自旋——空循環(huán)”。應(yīng)分開討論。
在單cpu系統(tǒng)中的自旋鎖,并不具備“自旋”功能。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-06-14 18:51 |只看該作者
單cpu 非搶占:  內(nèi)核中的執(zhí)行天然的隔絕了進(jìn)程切換。要注意 自旋鎖不能防止系統(tǒng)調(diào)用被 硬中斷或者異常搶占去。

單cpu搶占:  spin_lock只 要關(guān)搶占,否則在本cpu起不到任何 鎖的作用。 這要求臨界區(qū)盡量的短小

多cpu 搶占: 自選就意味著核間呼斥,本cpu上的進(jìn)程間互斥,由其關(guān)搶占性質(zhì)實(shí)現(xiàn) !

  多cpu 非搶占: 自選就意味著核間呼斥就可以了 !

論壇徽章:
1
射手座
日期:2013-11-07 09:19:48
5 [報(bào)告]
發(fā)表于 2011-06-15 11:14 |只看該作者
回復(fù) 3# oceanljp
怎么會(huì)發(fā)生死鎖呢?
咱們分情況來看一下:
1. 單核非搶占:此時(shí)spinlock什么都不做,如果持有鎖的進(jìn)程阻塞,內(nèi)核會(huì)通過scheduler選擇其他進(jìn)程執(zhí)行,可能會(huì)造成臨界區(qū)的沖突;
2. 單核搶占:此時(shí)spinlock只是禁止搶占,防止持有鎖的進(jìn)程被搶占而引起的臨界區(qū)訪問沖突,但是如果持有鎖的進(jìn)程阻塞,內(nèi)核會(huì)通過scheduler選擇其他進(jìn)程執(zhí)行,也可能會(huì)造成臨界區(qū)的沖突;
3. 多核非搶占:此時(shí)spinlock應(yīng)該是“多個(gè)CPU對(duì)鎖搶的到就繼續(xù),否則就空循環(huán)”,持有鎖的進(jìn)程阻塞會(huì)會(huì)使得其他CPU爭用該鎖的時(shí)候忙等,引起系統(tǒng)性能下降;
4. 多核搶占:此時(shí)spinlock首先禁止持有鎖的進(jìn)程所在的CPU搶占,然后“多個(gè)CPU對(duì)鎖搶的到就繼續(xù),否則就空循環(huán)”,持有鎖的進(jìn)程阻塞的話,一方面在持有鎖的CPU上可能會(huì)造成臨界區(qū)的沖突,另一方面會(huì)使得其他CPU爭用該鎖的時(shí)候忙等,造成系統(tǒng)性能下降。
所有這四種情況應(yīng)該都不會(huì)導(dǎo)致死鎖的發(fā)生。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-06-15 14:20 |只看該作者
死鎖是有可能發(fā)生的。
死鎖發(fā)生在多核的情況,下面來分析一下:
首先,對(duì)于多核搶占與多核非搶占的情況,在使用自旋鎖時(shí),其情況基本是一致的。
因?yàn)樵诙嗪藫屨嫉那闆r下,使用自旋鎖會(huì)禁止內(nèi)核搶占,這樣多核搶占就相當(dāng)于多核非搶占的情況。

那下面就只分析多核非搶占的情況。
假設(shè)系統(tǒng)有A,B兩個(gè)CPU。
A上正在運(yùn)行的a進(jìn)程已獲得自旋鎖,并在臨界區(qū)運(yùn)行。
B上正在運(yùn)行的b進(jìn)程企圖獲得自旋鎖,但由于自旋鎖已被占用,于是b進(jìn)程在B CPU上“自旋”空轉(zhuǎn)。

這時(shí),如果在A上的a進(jìn)程因程序阻塞,而被休眠。接著A會(huì)切換運(yùn)行另一進(jìn)程c。
若這個(gè)進(jìn)程c也企圖獲取自旋鎖,c進(jìn)程同樣會(huì)因?yàn)殒i已被占用,而在A上“自旋”空轉(zhuǎn)。
這時(shí)候,A上的a進(jìn)程與c進(jìn)程就形成了死鎖。a進(jìn)程需要被c進(jìn)程占用的CPU,c進(jìn)程需要被a進(jìn)程占用的鎖。

至于在單cpu內(nèi)核上不會(huì)出現(xiàn)上述情況,因?yàn)閱蝐pu上的自旋鎖實(shí)際沒有“自旋功能”。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2011-06-15 15:43 |只看該作者
oh,樓上的兄弟,不得不再說一下, 自旋鎖的臨界區(qū),禁止使用睡眠。  如果你想使用睡眠鎖請(qǐng)使用 mutex, semaphore,rt_mutex 。

自旋鎖有別于睡眠鎖,就是為了提高多核條件下的運(yùn)行效率。 自選鎖臨界區(qū)sleep,等于自殘!

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2011-06-15 15:58 |只看該作者
看到這種分類就煩,單核下明明就不是自旋鎖非要用同一個(gè)名字,又賦予其不同的語義。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2011-06-15 16:14 |只看該作者
回復(fù) 7# tuibo

呵呵,多謝這位兄弟指導(dǎo),我只是看到宋寶華書上說,在自旋鎖的臨界區(qū)阻塞會(huì)發(fā)生死鎖,與我想的不大一致,拿出來和大家探討探討。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2011-06-16 22:36 |只看該作者
單核下應(yīng)該沒自旋鎖吧,這個(gè)應(yīng)該只在smp中的概念吧
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP