今天再看《嵌入式軟件系統(tǒng)教程》((美)西蒙 著,陳向群 等譯) ,里面講到關(guān)中斷會(huì)關(guān)了任務(wù)調(diào)度,作者沒說原因,我也不知道為什么,所以查了查網(wǎng)絡(luò)。 =============================================================== 在這個(gè)網(wǎng)址http://www./bbs/topic.aspx?topicid=11253上有一個(gè)討論,我覺得很有道理。很明顯觀點(diǎn)是關(guān)了中斷,只是禁止了搶占,但并沒有禁止調(diào)度。 這樣看來,那本書上的觀點(diǎn)是不正確的??
把一些自認(rèn)為很有道理的解釋摘抄下來: 首先說明一下,引起調(diào)度(任務(wù)切換)的原因有兩個(gè): 1、任務(wù)主動(dòng)進(jìn)入了阻塞狀態(tài),就像2樓說的,調(diào)用了所謂的切換函數(shù)。 2、中斷,中斷服務(wù)程序(isr)改變了任務(wù)狀態(tài),使某個(gè)比當(dāng)前任務(wù)優(yōu)先級(jí)高的任務(wù)進(jìn)入了準(zhǔn)備好(ready)狀態(tài),于是內(nèi)核調(diào)用了切換函數(shù)。
這兩個(gè)原因可以稱為“同步方式調(diào)度”和“異步方式調(diào)度”。搶占的意義在于:如果高優(yōu)先級(jí)任務(wù)進(jìn)入準(zhǔn)備好狀態(tài)后,操作系統(tǒng)可以立即調(diào)度(任務(wù)切換),將高優(yōu)先級(jí)任務(wù)投入運(yùn)行。而這些動(dòng)作對(duì)低優(yōu)先級(jí)任務(wù)來說是完全透明的。
但是,誰?!使高優(yōu)先級(jí)任務(wù)進(jìn)入準(zhǔn)備好狀態(tài),而又對(duì)低優(yōu)先級(jí)任務(wù)透明呢?就是“中斷”。
所以說,“搶占”是系統(tǒng)進(jìn)行了“異步方式調(diào)度”的結(jié)果。既然關(guān)閉了中斷,也就禁止了搶占。樓主,你想明白了嗎?
在這里也要糾正一下3樓和5樓:“關(guān)了中斷,就禁止了調(diào)度”這種說法不妥。關(guān)了中斷,只是禁止了搶占,但并沒有禁止調(diào)度啊。 |
正在運(yùn)行的任務(wù)是所有就緒任務(wù)中優(yōu)先級(jí)最高的,如果要運(yùn)行其它優(yōu)先級(jí)更高的任務(wù),就只有發(fā)生了某些事件使得更高優(yōu)先級(jí)的任務(wù)進(jìn)入了就緒狀態(tài),而這些事件只有在兩種情況下發(fā)生: 1. 中斷改變了任務(wù)狀態(tài) 2. 運(yùn)行中的任務(wù)主動(dòng)使優(yōu)先級(jí)更高的任務(wù)進(jìn)入就緒狀態(tài)
2 相當(dāng)于是主動(dòng)放棄CPU占有權(quán),所以說搶占是由中斷引起的,是異步調(diào)度的結(jié)果(??這里邏輯有點(diǎn)問題。作者的意思可能是 :2是非搶占的,主動(dòng)的,1是搶占的,被動(dòng)的,所以說搶占是由中斷引起的,是異步調(diào)度的結(jié)果。by imjacob)
所以就是你說的結(jié)論,關(guān)中斷只是關(guān)了搶占,而運(yùn)行中的任務(wù)依然可以主動(dòng)做任務(wù)調(diào)度。這里uC/OS有一個(gè)非常重要的前提條件,就是 運(yùn)行中的任務(wù)是所有就緒任務(wù)中優(yōu)先級(jí)最高的,如果沒有事件發(fā)生就會(huì)一直運(yùn)行直到完成。
|
所以,你最開始的疑問:“關(guān)中斷只是屏蔽了中斷,并沒有阻止任務(wù)切換,高優(yōu)先級(jí)的任務(wù)任然可以搶占CPU并訪問臨界區(qū)和共享變量啊”
關(guān)了中斷,就禁止了搶占,如果當(dāng)前任務(wù)也沒有進(jìn)行主動(dòng)調(diào)度,當(dāng)然系統(tǒng)中也就不會(huì)出現(xiàn)比當(dāng)前優(yōu)先級(jí)更高的任務(wù)進(jìn)入就緒了,也就談不上去“搶占CPU并訪問臨界區(qū)和共享變量”了。(作者這里說加了條件“如果當(dāng)前任務(wù)也沒有進(jìn)行主動(dòng)調(diào)度”,那如果當(dāng)前任務(wù)進(jìn)行了主動(dòng)調(diào)度會(huì)怎么樣?我認(rèn)為,若是在臨界區(qū)中進(jìn)行了主動(dòng)調(diào)度,那么后果就是提問的人說的:“關(guān)中斷只是屏蔽了中斷,并沒有阻止任務(wù)切換,高優(yōu)先級(jí)的任務(wù)任然可以搶占CPU并訪問臨界區(qū)和共享變量”。by imjacob) 由以下網(wǎng)址為證:http://www./xuexi/UNIX-XIUGAI/ch02/os0203.htm 中2.3.4為證。 上面是這么說的:
關(guān) 中 斷 之 后, 任 何 外 部 事 件 都 不 能 打 擾 處 理 機(jī) 連 續(xù) 執(zhí) 行 臨 界 區(qū) 程 序。 如 果 臨 界 區(qū) 程 序 本 身 并 不 包 含 使 它 的 進(jìn) 程 轉(zhuǎn) 變 為 封 鎖 狀 態(tài) 的 因 素, 那 么 這 種 方 法 就 能 保 證 臨 界 區(qū) 作 為 一 個(gè) 整 體 執(zhí) 行。 這 種 方 法 的 優(yōu) 點(diǎn) 是 簡 單、 可 靠, 但 是 它 也 有 一 定 的 局 限 性 和 若 干 不 足 之 處。 (1) 它 不 能 用 于 多 處 理 機(jī) 系 統(tǒng)。 其 原 因 是: 由 于 該 系 統(tǒng) 中 的 多 個(gè) 處 理 機(jī) 都 有 其 各 自 的 中 斷 開 關(guān), 因 此 一 個(gè) 處 理 機(jī) 并 不 能 阻 止 在 其 它 處 理 機(jī) 上 運(yùn) 行 的 進(jìn) 程 進(jìn) 入 同 類 臨 界 區(qū)。 (2) 在 臨 界 區(qū) 中 如 果 包 含 有 使 執(zhí) 行 它 的 進(jìn) 程 有 可 能 進(jìn) 入 封 鎖 狀 態(tài) 的 因 素, 則 也 不 能 使 用 這 種 方 法。 因 為 在 該 進(jìn) 程 進(jìn) 入 封 鎖 狀 態(tài) 后, 系 統(tǒng) 將 調(diào) 度 另 一 進(jìn) 程 使 用 處 理 機(jī), 如 果 需 要, 該 進(jìn) 程 也 可 以 執(zhí) 行 臨 界 區(qū) 程 序, 不 會(huì) 受 到 任 何 阻 攔, 所 以 在 這 種 情 況 下, 開、 關(guān) 中 斷 不 能 實(shí) 施 臨 界 區(qū) 互 斥。 (3) 如 果 臨 界 區(qū) 比 較 長, 則 本 法 會(huì) 降 低 中 斷 響 應(yīng) 速 度。 (4) 這 是 一 把 鎖 處 理 各 類 臨 界 區(qū), 不 必 要 地 擴(kuò) 大 了 互 斥 范 圍。 |
“為什么關(guān)中斷開中斷可以作為互斥條件,而且是最粗暴的方式呢?”
按上面的解釋,開關(guān)中斷是可以作為互斥條件的,但的確很粗暴。眾所周知,嵌入式實(shí)時(shí)操作系統(tǒng)最關(guān)鍵的性能指標(biāo)之一便是中斷響應(yīng)時(shí)間。中斷響應(yīng)時(shí)間越短,實(shí)時(shí)性就越好。但很多嵌入式操作系統(tǒng)(包括uCos在內(nèi))的中斷響應(yīng)時(shí)間都比較長。原因就是在這些操作系統(tǒng)中大量使用了關(guān)中斷這種“粗暴”的方式(OS_ENTER_CRITICAL),你可以看看uCos, FreeRTOS等操作系統(tǒng)的源碼,這樣的寫法比比皆是。當(dāng)然,不用OS_ENTER_CRITICAL是不可能的,那會(huì)造成數(shù)據(jù)混亂,這是它們的系統(tǒng)結(jié)構(gòu)所決定的。
如果能保證在中斷處理中不去寫共享數(shù)據(jù)(包括可能改變共享數(shù)據(jù)的系統(tǒng)調(diào)用),就可以不用關(guān)中斷了,但這需要改變系統(tǒng)結(jié)構(gòu),把中斷服務(wù)分為兩個(gè)部分,這就是所謂的“Top half 和 Bottom half”。如果想了解具體,你可以去網(wǎng)上查查。應(yīng)用這種技術(shù)的操作系統(tǒng)有Linux, Windows, eCos等。
|
不用中斷來進(jìn)行調(diào)度的操作系統(tǒng),就是沒有搶占,說白了就是一個(gè)協(xié)作式操作系統(tǒng),怎么會(huì)一定導(dǎo)致死鎖?難道搶占式操作系統(tǒng)就不會(huì)出現(xiàn)死鎖?
其實(shí),死鎖是多個(gè)任務(wù)在企圖獲取多個(gè)獨(dú)占(exclusive)資源時(shí),可能導(dǎo)致的一種所有參與任務(wù)全部被阻塞的狀態(tài)。這分明是屬于應(yīng)用程序的邏輯概念,而調(diào)度則是屬于操作系統(tǒng)的邏輯概念,怎么能混為一談。 |
|
后記:
另外在查網(wǎng)絡(luò)的時(shí)候,還看到一本中國人的書<操作系統(tǒng)教程>(http://books.google.cn/books?id=X8lmMtog0XcC&pg=PT59&lpg=PT59&dq=%E5%85%B3%E4%B8%AD%E6%96%AD+%E4%BA%92%E6%96%A5&source=bl&ots=GwX4qh0hM0&sig=j1ieBs1RvU-bTpkddC4OyxoneTc&hl=zh-CN&sa=X&oi=book_result&resnum=2&ct=result) 3.2.2 硬件方法中寫:“ 因?yàn)閏pu只在發(fā)生中斷時(shí)引起進(jìn)程切換,這樣禁止中斷就能保證當(dāng)前運(yùn)行進(jìn)程將臨界區(qū)代碼順利執(zhí)行完,從而保證了互斥的正確實(shí)現(xiàn)。”顯然也是錯(cuò)的。我們可以當(dāng)作練習(xí)把它改正了。哈哈。
這是一個(gè)不淺也不深的問題,如果RTOS支持時(shí)間按片,那么與OS TIMER INT無法產(chǎn)生,基于時(shí)間片的調(diào)度就無法進(jìn)行。 中斷關(guān)了,CPU在公所,只有OS,你想想與這個(gè)有關(guān)嗎? 3樓 JohnsonJin 發(fā)表于 2008/11/26 13:15 回復(fù)所以,關(guān)中斷不會(huì)禁止調(diào)度,還要在關(guān)中斷處理的這個(gè)過程中不調(diào)用任何的OS函數(shù),至少不能調(diào)用哪些會(huì)引起調(diào)度的函數(shù)。比如:資源申請(qǐng),(內(nèi)存申請(qǐng),萬一內(nèi)存沒有了呢),semaphore等同步函數(shù)的操作,給其他進(jìn)程發(fā)消息....。 2樓 JohnsonJin 發(fā)表于 2008/11/26 13:11 回復(fù) 以上大部分都片面!我們先看調(diào)度發(fā)生的時(shí)機(jī): 1. 中斷 2. 系統(tǒng)調(diào)用。 然后我們看中斷為什么會(huì)引起調(diào)度,通常中斷會(huì)做一些處理,然后引起上層的“注意”。上層包括進(jìn)程和負(fù)責(zé)進(jìn)程調(diào)度的OS。如果系統(tǒng)支持時(shí)間片調(diào)度,那時(shí)鐘中斷引起OS把時(shí)間片到期的任務(wù)試著切換出去(如果沒有相同優(yōu)先級(jí)的進(jìn)程在等待CPU的話,就不切換)。如果中斷處理所需要引起的上層注意者是進(jìn)程(中斷ISR給進(jìn)程發(fā)消息,信號(hào),釋放semaphore等),也就是本來在等待事件的進(jìn)程被放到了ready隊(duì)列。在中斷處理結(jié)束的時(shí)候,OS的中斷后處理過程會(huì)重新調(diào)度。這個(gè)時(shí)候就看誰的優(yōu)先級(jí)高了,如果喚醒的是高優(yōu)先級(jí)的進(jìn)程,則做進(jìn)程切換。系統(tǒng)調(diào)用其實(shí)也是一樣的道理,在系統(tǒng)調(diào)用中,通常會(huì)引起資源或者鎖的釋放,或者觸發(fā)其他高優(yōu)先級(jí)進(jìn)程ready,在系統(tǒng)調(diào)用結(jié)束的一刻,OS會(huì)重新嘗試調(diào)度。 1樓 JohnsonJin 發(fā)表于 2008/11/26 13:10 回復(fù)以上大部分都片面! 我們先看調(diào)度發(fā)生的時(shí)機(jī): 1. 中斷 2. 系統(tǒng)調(diào)用 然后我們看中斷為什么會(huì)引起調(diào)度,通常中斷會(huì)做一些處理,然后引起上層的“注意”。上層包括進(jìn)程和負(fù)責(zé)進(jìn)程調(diào)度的OS。如果系統(tǒng)支持時(shí)間片調(diào)度,那時(shí)鐘中斷引起OS把時(shí)間片到期的任務(wù)試著切換出去(如果沒有相同優(yōu)先級(jí)的進(jìn)程在等待CPU的話,就不切換)。如果中斷處理所需要引起的上層注意者是進(jìn)程(中斷ISR給進(jìn)程發(fā)消息,信號(hào),釋放semaphore等),也就是本來在等待事件的進(jìn)程被放到了ready隊(duì)列。在中斷處理結(jié)束的時(shí)候,OS的中斷后處理過程會(huì)重新調(diào)度。這個(gè)時(shí)候就看誰的優(yōu)先級(jí)高了,如果喚醒的是高優(yōu)先級(jí)的進(jìn)程,則做進(jìn)程切換。 系統(tǒng)調(diào)用其實(shí)也是一樣的道理,在系統(tǒng)調(diào)用中,通常會(huì)引起資源或者鎖的釋放,或者觸發(fā)其他高優(yōu)先級(jí)進(jìn)程ready,在系統(tǒng)調(diào)用結(jié)束的一刻,OS會(huì)重新嘗試調(diào)度。
|