- 論壇徽章:
- 0
|
ULK3 第五章 中的 “在自旋鎖,信號量及中斷禁止之間的選擇”粗略歸納了下,希望能與大家一起紙上談兵。加深認(rèn)識。
Linux內(nèi)核中在自旋鎖,信號量及中斷禁止之間的選擇
一.linux內(nèi)核控制路徑的三種執(zhí)行環(huán)境:
1>中斷
中斷的頂半部分,也就是用request_irq注冊的中斷例程
處中斷上下文,不可睡眠
2>可延遲函數(shù)(軟中斷及基于軟中斷實(shí)現(xiàn)的其它處理函數(shù),如tasklet, 定時(shí)器等)
被中斷的頂半部分觸發(fā),并在稍后時(shí)間內(nèi)執(zhí)行的例程。
處中斷上下文,不可睡眠
一般是:
由open_softirq注冊,在中斷處理中由raise_softirq觸發(fā)的函數(shù)。
由tasklet_init初始化,在中斷處理中由tasklet_schedule調(diào)度的函數(shù)。
3>異常
典型是系統(tǒng)調(diào)用(內(nèi)核線程也算吧)。
處進(jìn)程上下文,可睡眠
中斷,異常及可延遲函數(shù)之間對cpu的爭奪:
1>中斷處理程序可以搶占其它中斷處理程序
2>中斷處理程序可以搶占異常
3>中斷處理程序可以搶占可延遲函數(shù)
4>中斷處理程序在退出前觸發(fā)可延遲函數(shù)。
5>一個(gè)可延遲函數(shù)不能搶占中斷處理程序。
6>一個(gè)可延遲函數(shù)不能搶占另一個(gè)可延遲函數(shù)。
7>相同類型的軟中斷可以并發(fā)的運(yùn)行在多個(gè)cpu上
8>相同類型的tasklet只能被串行的執(zhí)行,不同類型的tasklet可以在幾個(gè)cpu上并發(fā)執(zhí)行。tasklet基于軟中斷而實(shí)現(xiàn)(可視為加入約束的軟中斷?)。
9>軟中斷始終在觸發(fā)它的同一個(gè)cpu上執(zhí)行,tasklet也是。
10>異常不能搶占中斷,不能搶占可延遲函數(shù),不能搶占異常(缺頁不在考慮之中)
二.自信號旋鎖,信號量及關(guān)中斷的之間的……
自旋鎖:在竟?fàn)帡l件下,反復(fù)執(zhí)行緊湊的循環(huán)指令,直到鎖被釋放。防止多cpu間的竟?fàn)帯?br />
信號量:在竟?fàn)帡l件下,不允許內(nèi)核控制路徑繼續(xù)進(jìn)行,相應(yīng)的進(jìn)程被掛起。因此中斷處理,和可延遲函數(shù)都不能使用信號量。
關(guān)中斷:禁用本地中斷。關(guān)中斷都是為了防止同一cpu下的中斷搶占,關(guān)本地中斷后,可延遲函數(shù)也被禁止了。
三.Linux內(nèi)核中在自旋鎖,信號量及中斷禁止之間的選擇
3.1僅異常時(shí)的數(shù)據(jù)訪問保護(hù)
1>單處理器:此時(shí)的CPU運(yùn)行在內(nèi)核態(tài)為用戶進(jìn)程提供服務(wù)。此竟?fàn)帡l件可通過信號量避免。
2>多處理器:與單處理器環(huán)境時(shí)相同
3>訪問per-cpu變量時(shí),要禁用搶占。
3.2僅中斷時(shí)的數(shù)據(jù)訪問保護(hù)
單處理器
1>只有一個(gè)中斷的“上半部分”訪問時(shí),中斷都相對自己串行地執(zhí)行,無需同步。
2>多個(gè)中斷的“上半部分”訪問時(shí),要關(guān)中斷。
多處理器
3>只有一個(gè)中斷的“上半部分”訪問時(shí),中斷都相對自己串行地執(zhí)行,無需保護(hù)。
4>多個(gè)中斷可訪問時(shí),要關(guān)中斷,并加上自旋鎖。
3.3僅可延遲函數(shù)(軟中斷和tasklet)中的數(shù)據(jù)訪問保護(hù)
單處理器
1>上不存在競爭問題
多處理器
2>軟中斷訪問的數(shù)據(jù)使用自旋鎖,防止多cpu竟?fàn)?br />
3>僅由一種tasklet訪問的數(shù)據(jù)結(jié)構(gòu)不需要保護(hù)
4>被多種tasklet訪問需要用自旋鎖保護(hù)
3.4.異常和中斷時(shí)的數(shù)據(jù)訪問保護(hù)(只考慮一種中斷與一種異常)
單處理器
1>在異常的訪問中關(guān)閉中斷;中斷的訪問中不需要保護(hù)
多處理器
2>在異常的訪問中關(guān)閉本地中斷,并加上自旋鎖;中斷的訪問中加上自旋鎖即可(可用緊循環(huán)和down_trylock代替自旋的功能)
3.5.異常和可延遲函數(shù)中的數(shù)據(jù)訪問保護(hù)(只考慮一種異常與一種可延遲函數(shù))
單處理器
1>在異常訪問中關(guān)閉中斷(禁止可延遲函數(shù)更合適);可延遲函數(shù)無需保護(hù)
多處理器
2>在異常訪問中關(guān)閉中斷(禁止可延遲函數(shù)更合適)并加上自旋鎖;可延遲函數(shù)加上自旋鎖
3.6.中斷和可延遲函數(shù)中的數(shù)據(jù)訪問保護(hù)(只考慮一種中斷與一種可延遲函數(shù))
單處理器
1>可延遲函數(shù)訪問中關(guān)閉中斷;中斷的訪問中不需要保護(hù)
多處理器
2>可延遲函數(shù)訪問中關(guān)閉中斷,并加上自旋鎖;中斷的訪問中加上自旋鎖
3.7.異常,中斷和可延遲函數(shù)中的數(shù)據(jù)訪問保護(hù)(只考慮一種中斷一種可延遲函數(shù)一種異常)
單處理器
1>在異常訪問中關(guān)閉中斷; 可延遲函數(shù)訪問中關(guān)閉中斷 ;中斷的訪問中不需要保護(hù)
多處理器
2>在異常訪問中關(guān)閉中斷并加上自旋鎖; 可延遲函數(shù)訪問中關(guān)閉中斷并加上自旋鎖 ;中斷的訪問中加上自旋鎖
其它的場景都可看作以上場景的組合
如:異常,中斷和可延遲函數(shù)中的數(shù)據(jù)訪問保護(hù)?煽醋髦袛嗪涂裳舆t函數(shù),中斷和異常的組合。可同時(shí)使用相應(yīng)的保護(hù)方式。 |
評分
-
查看全部評分
|