原帖由 思一克 于 2007-6-27 09:19 發(fā)表于 1樓
看鄰居帖子,大家回答的問題不大。但也有不同的回答和解釋。有點(diǎn)亂。
有必要討論,得出固定的結(jié)論。
原帖由 思一克 于 2007-6-27 10:21 發(fā)表于 6樓
那么LINUX有在中斷中睡眠的地方嗎
原帖由 gta 于 2007-6-27 13:29 發(fā)表于 8樓
任何os,不管是分時(shí)os,還是實(shí)時(shí)os,不管是微內(nèi)核,還是巨內(nèi)核,在ISR中都不能進(jìn)行進(jìn)程切換。因?yàn)镮SR不屬于任何進(jìn)程,而切換只能發(fā)生在進(jìn)程上下文中。雖然ISR在執(zhí)行過程中要使用進(jìn)程的系統(tǒng)堆棧,但那只是借用, ...
原帖由 zx_wing 于 2007-6-27 10:09 發(fā)表于 4樓
呵呵,我最喜歡這種討論了。先來獻(xiàn)丑了,說說我的看法。
先把中斷處理流程給出來
1.進(jìn)入中斷處理程序--->2.保存關(guān)鍵上下文---->3.開中斷(sti指令)--->4.進(jìn)入中斷處理程序的handler--->5.關(guān)中 ...
原帖由 zx_wing 于 2007-6-27 10:09 發(fā)表于 4樓
呵呵,我最喜歡這種討論了。先來獻(xiàn)丑了,說說我的看法。
先把中斷處理流程給出來
1.進(jìn)入中斷處理程序--->2.保存關(guān)鍵上下文---->3.開中斷(sti指令)--->4.進(jìn)入中斷處理程序的handler--->5.關(guān)中 ...
原帖由 思一克 于 2007-6-27 16:43 發(fā)表于 12樓
LINUX上中斷中不能睡眠(調(diào)用schedule,直接或間接)和“被中斷的進(jìn)程和中斷本身無關(guān)系”無關(guān)。
前面有人說“被中斷的進(jìn)程和中斷本身無關(guān)系”是不能睡眠的原因。我不理解,覺得說法不對(duì)。
原帖由 Solaris12 于 2007-6-27 13:58 發(fā)表于 9樓
呵呵,Solaris的低優(yōu)先級(jí)中斷是可以睡眠的,時(shí)鐘中斷也可以睡眠。盡管系統(tǒng)會(huì)盡量保證中斷線程不去睡眠。例如,磁盤驅(qū)動(dòng)的ISR里使用DRIVEDR mutex, 實(shí)際上系統(tǒng)把它當(dāng)作自適應(yīng)鎖,當(dāng)獲取鎖失敗時(shí),它先看其 ...
原帖由 gta 于 2007-6-27 17:52 發(fā)表于 14樓
呵呵,Solaris的低優(yōu)先級(jí)中斷是可以睡眠的,時(shí)鐘中斷也可以睡眠。盡管系統(tǒng)會(huì)盡量保證中斷線程不去睡眠。例如,磁盤驅(qū)動(dòng)的ISR里使用DRIVEDR mutex, 實(shí)際上系統(tǒng)把它當(dāng)作自適應(yīng)鎖,當(dāng)獲取鎖失敗時(shí),它先看其 ...
原帖由 motalelf 于 2007-6-27 17:15 發(fā)表于 13樓
這沒什么不對(duì),中斷和自陷在執(zhí)行的路徑上,沒有絲毫不同。如果說什么“中斷是因?yàn)闆]有進(jìn)程上下文,只有中斷上下文”而不能睡眠的話;那么自陷同樣“沒有進(jìn)程上下文,只有自陷上下文”。
但是自陷卻可以 ...
原帖由 gta 于 2007-6-27 17:52 發(fā)表于 14樓
ISR(interrupt service routine)是不能睡眠的,我覺得你說的那個(gè)不是ISR,是IST(interrupt service thread).IST平時(shí)處于睡眠態(tài),發(fā)生中斷后,cpu執(zhí)行ISR,在ISR中喚醒IST,中斷服務(wù)的主體在IST中完成。引入IST后,一來可以減小內(nèi)核體積,二來可以減小不可剝奪窗口,增強(qiáng)調(diào)度的實(shí)時(shí)性。WIN CE就是這樣做的。不知Solaris的做法是否與此類似。請(qǐng)Solaris12兄指教
原帖由 motalelf 于 2007-6-27 19:35 發(fā)表于 15樓
退一萬步說,假如中斷可以睡眠,那么也決不是低優(yōu)先級(jí)中斷可以睡眠;而是當(dāng)前進(jìn)程為低優(yōu)先級(jí)進(jìn)程時(shí)能睡眠。不然那些進(jìn)程調(diào)度算法不白寫了?高優(yōu)先級(jí)的進(jìn)程有什么用?只要碰到個(gè)低優(yōu)先級(jí)中斷就被調(diào)度出去了。
雖然我不知道Solaris長(zhǎng)的什么摸樣。
原帖由 zx_wing 于 2007-6-27 10:09 發(fā)表于 4樓
呵呵,我最喜歡這種討論了。先來獻(xiàn)丑了,說說我的看法。
先把中斷處理流程給出來
1.進(jìn)入中斷處理程序--->2.保存關(guān)鍵上下文---->3.開中斷(sti指令)--->4.進(jìn)入中斷處理程序的handler--->5.關(guān)中 ...
原帖由 rwen2012 于 2007-6-27 22:04 發(fā)表于 20樓
http://hi.baidu.com/rwen2012/blo ... 28f1b4c9eaf4d0.html
原帖由 xiaozhaoz 于 2007-6-27 22:36 發(fā)表于 21樓
簡(jiǎn)單看了一下前面的回復(fù), 不能認(rèn)同.
問題的焦點(diǎn)大家都集中在異步異常(中斷)沒有自己的上下文?
中斷搶占了當(dāng)前任務(wù)后, 可以通過current獲得當(dāng)前的task結(jié)構(gòu), 將當(dāng)前任務(wù)的寄存器信息壓入棧中, 替換成自己的eip和esp. 你完全可以理解為當(dāng)前任務(wù)調(diào)用了handler()函數(shù). 當(dāng)然, 如果中斷使用了自己的棧, 就會(huì)有問題!!
如果handler()函數(shù)調(diào)用了
schedule_timeout_interruptible(1000)
這樣當(dāng)前任務(wù)就被加入到定時(shí)器中, 定時(shí)器軟中斷到了1000ms就會(huì)把handler搶占的任務(wù)喚醒.
當(dāng)然上述代碼要正常工作, 要修改內(nèi)核一些地方, 如schedule()里面的很多檢查, 中斷中的很多標(biāo)志位和鎖, entry.s中的很多判斷.
只是想說明, 中斷不能sleep, 不是因?yàn)闆]有上下文!
原帖由 Solaris12 于 2007-6-27 23:05 發(fā)表于 22樓
的確不光是上下文的問題,比如說還有調(diào)度的問題。
假設(shè)按你說的方式中斷睡眠后,被打斷線程也跟著睡眠顯然會(huì)導(dǎo)致很多不可預(yù)知的問題。
中斷產(chǎn)生是隨機(jī)的,假設(shè)某次中斷一個(gè)內(nèi)核線程,而且按照你說的 ...
1. 毫無疑問, 在關(guān)中斷的時(shí)候不能sleep, 這點(diǎn)大家都知道, 因?yàn)闀r(shí)鐘中斷無法觸發(fā). 但不是所有情況下, 在關(guān)中斷時(shí)sleep都會(huì)導(dǎo)致系統(tǒng)死掉, 在SMP的情況下, 可能系統(tǒng)不會(huì)死掉.
2. 中斷的handler能否sleep?
這其實(shí)和"中斷沒有自己的上下文"無關(guān). CPU沒有關(guān)中斷, 中斷有自己的上下文, 中斷的上下文就是搶占的任務(wù)A的上下文.
和棧溢出也沒有關(guān)系, 現(xiàn)在的中斷都是可以嵌套的, 如果中斷sleep只會(huì)讓后面的中斷搶占其他任務(wù), 根本不存在棧溢出問題, 不過現(xiàn)在內(nèi)核的4K中斷單獨(dú)棧會(huì)有問題. 這會(huì)導(dǎo)致棧被破壞.
假設(shè)中斷sleep了, 在調(diào)度的時(shí)候, 內(nèi)核將中斷的CS:eip和SS:esp保存在被搶占任務(wù)A的thread_info中, 當(dāng)任務(wù)A被重新喚醒的時(shí)候, 任務(wù)A從中斷的CS:eip開始執(zhí)行, 這也能正常執(zhí)行下去, 中斷執(zhí)行完后, 從ret_from_intr中返回. 可以恢復(fù)任務(wù)A的搶占前的場(chǎng)景.
原帖由 xiaozhaoz 于 2007-6-27 23:13 發(fā)表于 23樓
所見略同.
19樓描述的就是這個(gè)問題.
而realtime Patch解決的也是這個(gè)問題.
PS. 最近在做一個(gè)多內(nèi)核的項(xiàng)目, 包括solaris, 請(qǐng)問你們討論solaris內(nèi)核一般在哪里? OpenSolaris的mail list感覺不太熱鬧.
原帖由 xiaozhaoz 于 2007-6-27 22:00 發(fā)表于 19樓
里面很多說法不是很同意, 個(gè)人認(rèn)為中斷處理handler不能sleep原因應(yīng)該不是上面那些.
我們都是從理論講下面這些問題, 因?yàn)閘inux在很多地方做了保護(hù), 所以直接sleep或者schedule()會(huì)導(dǎo)致內(nèi)核異常.
首先分 ...
原帖由 Solaris12 于 2007-6-27 20:25 發(fā)表于 17樓
Cool!
你說的很準(zhǔn)確。的確是你說的情況。
舉例來說, 寫網(wǎng)卡驅(qū)動(dòng)程序,我們通常把中斷服務(wù)函數(shù)說成ISR。
但在Solaris里,每個(gè)級(jí)低優(yōu)先級(jí)中斷都有個(gè)IST,中斷服務(wù)線程。
我說的ISR是驅(qū)動(dòng)程序的 ...
原帖由 xiaozhaoz 于 2007-6-27 22:36 發(fā)表于 21樓
簡(jiǎn)單看了一下前面的回復(fù), 不能認(rèn)同.
問題的焦點(diǎn)大家都集中在異步異常(中斷)沒有自己的上下文?
中斷搶占了當(dāng)前任務(wù)后, 可以通過current獲得當(dāng)前的task結(jié)構(gòu), 將當(dāng)前任務(wù)的寄存器信息壓入棧中, 替換成自 ...
原帖由 xiaozhaoz 于 2007-6-27 23:13 發(fā)表于 23樓
所見略同.
19樓描述的就是這個(gè)問題.
而realtime Patch解決的也是這個(gè)問題.
PS. 最近在做一個(gè)多內(nèi)核的項(xiàng)目, 包括solaris, 請(qǐng)問你們討論solaris內(nèi)核一般在哪里? OpenSolaris的mail list感覺不太熱鬧.
原帖由 zx_wing 于 2007-6-28 10:56 發(fā)表于 29樓
此外,我想lz對(duì)上下文一詞還有點(diǎn)誤解。
上下文(context)表示當(dāng)前cpu的狀態(tài),包括各種標(biāo)志及寄存器的值。這里中斷是運(yùn)行在自己的上下文而不是進(jìn)程的上下文。如果是運(yùn)行在進(jìn)程上下文的話,中斷處理就不需要在 ...
原帖由 zx_wing 于 2007-6-28 10:37 發(fā)表于 27樓
>>這其實(shí)和"中斷沒有自己的上下文"無關(guān). CPU沒有關(guān)中斷, 中斷有自己的上下文, 中斷的上下文就是搶占的任務(wù)A的上下文.
“中斷沒有自己的上下文”,呵呵,我沒有說這句話哈。lz很多立論在這 ...
原帖由 思一克 于 2007-6-28 11:05 發(fā)表于 31樓
中斷當(dāng)然有自己的CONTEXT。但沒有(準(zhǔn)確說經(jīng)常沒有)進(jìn)程相關(guān)的CONTEXT。
你看2.6.13 KERNEL,IRQ使用 自己的STACK,如果在中斷中schedule()了,能正確回來嗎?
原帖由 思一克 于 2007-6-28 11:05 發(fā)表于 31樓
中斷當(dāng)然有自己的CONTEXT。但沒有(準(zhǔn)確說經(jīng)常沒有)進(jìn)程相關(guān)的CONTEXT。
你看2.6.13 KERNEL,IRQ使用 自己的STACK,如果在中斷中schedule()了,能正確回來嗎?
原帖由 xiaozhaoz 于 2007-6-28 11:13 發(fā)表于 32樓
中斷sleep了, 由誰來喚醒?
在關(guān)中斷的情況下, 不能sleep, 19樓已經(jīng)描述了.
在中斷handler中, 絕大部分都是開中斷的, 這個(gè)時(shí)候?yàn)槭裁床荒躶leep? 時(shí)鐘中斷可以正常觸發(fā), 要不中斷嵌套怎么實(shí)現(xiàn)? 當(dāng)然由時(shí)鐘中 ...
原帖由 zx_wing 于 2007-6-28 10:56 發(fā)表于 29樓
此外,我想lz對(duì)上下文一詞還有點(diǎn)誤解。
上下文(context)表示當(dāng)前cpu的狀態(tài),包括各種標(biāo)志及寄存器的值。這里中斷是運(yùn)行在自己的上下文而不是進(jìn)程的上下文。如果是運(yùn)行在進(jìn)程上下文的話,中斷處理就不需要在 ...
原帖由 zx_wing 于 2007-6-28 11:25 發(fā)表于 35樓
>>在中斷handler中, 絕大部分都是開中斷的, 這個(gè)時(shí)候?yàn)槭裁床荒躶leep? 時(shí)鐘中斷可以正常觸發(fā), 要不中斷嵌套怎么實(shí)現(xiàn)? 當(dāng)然由時(shí)鐘中斷的軟中斷來喚醒. 如我說到的:
如果內(nèi)核修改好了, handler中調(diào)用sch ...
原帖由 augustusqing 于 2007-6-28 11:41 發(fā)表于 38樓
在中斷跟內(nèi)核用的是同一個(gè)棧的情況下,如果系統(tǒng)允許某個(gè)handler中可以sleep,那么在不可預(yù)知的任何時(shí)候,任何一個(gè)內(nèi)核線程/進(jìn)程在執(zhí)行的時(shí)候,恰好來了上面的中斷并執(zhí)行到了handler,則這個(gè)內(nèi)核線程/進(jìn)程就&quo ...
原帖由 xiaozhaoz 于 2007-6-28 12:19 發(fā)表于 39樓
對(duì), 就是這個(gè)意思,
所以這種系統(tǒng)的不確定性就很大.
而現(xiàn)在的中斷除了不sleep, 不能preempt之外, 對(duì)任務(wù)的影響也想你說的那樣"中獎(jiǎng)"式的, 所以現(xiàn)在系統(tǒng)的實(shí)時(shí)性是無法保證的!!
解決這個(gè)問 ...
原帖由 zx_wing 于 2007-6-28 12:38 發(fā)表于 40樓
>>總結(jié): 異步異常(中斷)handler不是沒有上下文, 而是沒有固定的上下文, 如果使用被搶占的任務(wù)作為上下文, 一,自身的處理無法得到實(shí)時(shí)保障,導(dǎo)致系統(tǒng)不確定性, 二,任務(wù)受到影響.
linux是通用操作系統(tǒng) ...
原帖由 思一克 于 2007-6-28 13:16 發(fā)表于 41樓
LZ發(fā)帖子是討論,不是有什么總結(jié)性的一句話能概括什么。我也是在學(xué)習(xí)中。
我覺得,LINUX設(shè)計(jì)不讓中斷中睡眠是經(jīng)過充分考慮的。seelp on interrupt(SOI)不允許是內(nèi)核設(shè)計(jì)的原因,而不是有什么絕對(duì)本質(zhì)的無法 ...
原帖由 zx_wing 于 2007-6-28 13:59 發(fā)表于 42樓
我說的lz是xiaozhaoz兄,因?yàn)樗爬ǖ挠^點(diǎn)有點(diǎn)多,我看的不是很明白,所以想讓他總結(jié)一下。
呵呵,版主以為我在叫你啦![]()
原帖由 zx_wing 于 2007-6-28 13:59 發(fā)表于 42樓
我說的lz是xiaozhaoz兄,因?yàn)樗爬ǖ挠^點(diǎn)有點(diǎn)多,我看的不是很明白,所以想讓他總結(jié)一下。
呵呵,版主以為我在叫你啦![]()
原帖由 思一克 于 2007-6-28 14:51 發(fā)表于 46樓
我看了19樓的帖子,
覺得
中斷和軟中斷的線程化和spin_lock的可sleep化這兩個(gè)并不能提高系統(tǒng)的實(shí)時(shí)性。
比如spinlock, 就是為了短暫需要lock的時(shí)候讓CPU空等待。這時(shí)比用可以sleep的鎖要節(jié)省CPU而不是浪 ...
原帖由 albcamus 于 2007-6-28 14:30 發(fā)表于 45樓
我怎么覺得你們3位彼此都懂對(duì)方說什么,只不過主張不同?
原帖由 思一克 于 2007-6-28 14:04 發(fā)表于 43樓
LZ我認(rèn)為是說發(fā)帖子的人呀?
難到我理解錯(cuò)了。
原帖由 思一克 于 2007-6-28 14:51 發(fā)表于 46樓
我看了19樓的帖子,
比如spinlock, 就是為了短暫需要lock的時(shí)候讓CPU空等待。這時(shí)比用可以sleep的鎖要節(jié)省CPU而不是浪費(fèi)。因?yàn)檎{(diào)度的耗費(fèi)可能要比SPIN的耗費(fèi)多的多。
linux的中斷是半THREAD化的。你可以增加工作在THREAD(softirqd)中的比重,增加后,系統(tǒng)反映更慢了。比如你打一個(gè)字,一個(gè)網(wǎng)絡(luò)包的處理,如果都用THREAD做,響應(yīng)應(yīng)該是慢一些。因?yàn)檎{(diào)度的原因
原帖由 xiaozhaoz 于 2007-6-28 15:55 發(fā)表于 47樓
這個(gè)問題已經(jīng)脫離了本貼的原意, 如果有興趣, 可以另外開貼討論.
實(shí)時(shí)性的必須保證, 系統(tǒng)在任何情況下, 可以在一定的時(shí)間內(nèi)執(zhí)行到某個(gè)任務(wù).
1. 你的比較尺度有問題, ...
原帖由 Solaris12 于 2007-6-28 23:11 發(fā)表于 53樓
1. Solaris的自適應(yīng)鎖比較聰明,發(fā)現(xiàn)有人已經(jīng)占用前就會(huì)去看鎖當(dāng)前的所有者是否在 CPU上運(yùn)行,如果是,就自旋,如果不是就睡眠。
2. Solaris的中斷線程是線程池,預(yù)先創(chuàng)建好的,kthread_t的結(jié)構(gòu)在中斷 ...
原帖由 zx_wing 于 2007-6-29 11:32 發(fā)表于 55樓
Solaris上鎖的持有者可以睡眠?那死鎖怎么辦?
原帖由 Solaris12 于 2007-6-29 14:39 發(fā)表于 56樓
我說的是自適應(yīng)鎖,Solaris的mutex本質(zhì)上分為自適應(yīng)和自旋兩種。
1.不允許睡眠的上下文要用自旋鎖,例如,IPI等高優(yōu)先級(jí)中斷。
2.允許睡眠的上下文用自適應(yīng)鎖,會(huì)動(dòng)態(tài)判斷自旋還是睡眠。一般低優(yōu)先級(jí) ...
原帖由 scutan 于 2007-6-27 09:38 發(fā)表
其實(shí)這只是一個(gè)設(shè)計(jì)上的問題, 而并不是強(qiáng)制的. 只是針對(duì)Linux內(nèi)核而言, 這是規(guī)矩.
LKD2上面說, 切換出去之后, 何時(shí)才能調(diào)度回來? 就是中斷回來之后可能不會(huì)回到之前所依俯的那個(gè)進(jìn)程了.
中斷不能睡眠 ...
原帖由 osama123 于 2007-12-28 13:47 發(fā)表
你想為什么B搶占A?因?yàn)锽比A優(yōu)先級(jí)高,所以在此調(diào)度時(shí),A不會(huì)比B之前運(yùn)行,就不會(huì)釋放lock,那么B就一直等下去了唄。
lucasman 發(fā)表于 2012-10-10 16:53
看看 http://product.china-pub.com/301691
里面對(duì) 中斷 可睡眠與否的解說吧。很清楚的。
Au_Hank 發(fā)表于 2007-09-03 08:19
中斷本來就是用來處理緊急/突發(fā)事件的, 而進(jìn)程睡眠是因?yàn)闆]有事情可以做才去睡眠的,
兩者本來就屬于對(duì)立的 ...
歡迎光臨 Chinaunix (http://www.72891.cn/) | Powered by Discuz! X3.2 |