Linux中斷不能進行任務調度,關中斷是否禁止任務調度?關中斷能作為互斥嗎?...

今天再看《嵌入式軟件系統教程》((美)西蒙?著,陳向群?等譯)? ,里面講到關中斷會關了任務調度,作者沒說原因,我也不知道為什么,所以查了查網絡。

===============================================================

在這個網址http://www.hqwic.com/bbs/topic.aspx?topicid=11253上有一個討論,我覺得很有道理。很明顯觀點是關了中斷,只是禁止了搶占,但并沒有禁止調度。

這樣看來,那本書上的觀點是不正確的??

把一些自認為很有道理的解釋摘抄下來:

首先說明一下,引起調度(任務切換)的原因有兩個:

1、任務主動進入了阻塞狀態,就像2樓說的,調用了所謂的切換函數。

2、中斷,中斷服務程序(isr)改變了任務狀態,使某個比當前任務優先級高的任務進入了準備好(ready)狀態,于是內核調用了切換函數。

這兩個原因可以稱為“同步方式調度”和“異步方式調度”。搶占的意義在于:如果高優先級任務進入準備好狀態后,操作系統可以立即調度(任務切換),將高優先級任務投入運行。而這些動作對低優先級任務來說是完全透明的。

但是,誰?!使高優先級任務進入準備好狀態,而又對低優先級任務透明呢?就是“中斷”。

所以說,“搶占”是系統進行了“異步方式調度”的結果。既然關閉了中斷,也就禁止了搶占。樓主,你想明白了嗎?

在這里也要糾正一下3樓和5樓:“關了中斷,就禁止了調度”這種說法不妥。關了中斷,只是禁止了搶占,但并沒有禁止調度啊。

正在運行的任務是所有就緒任務中優先級最高的,如果要運行其它優先級更高的任務,就只有發生了某些事件使得更高優先級的任務進入了就緒狀態,而這些事件只有在兩種情況下發生:

1. 中斷改變了任務狀態

2. 運行中的任務主動使優先級更高的任務進入就緒狀態

2 相當于是主動放棄CPU占有權,所以說搶占是由中斷引起的,是異步調度的結果(??這里邏輯有點問題。作者的意思可能是 :2是非搶占的,主動的,1是搶占的,被動的,所以說搶占是由中斷引起的,是異步調度的結果。by imjacob)

所以就是你說的結論,關中斷只是關了搶占,而運行中的任務依然可以主動做任務調度。這里uC/OS有一個非常重要的前提條件,就是 運行中的任務是所有就緒任務中優先級最高的,如果沒有事件發生就會一直運行直到完成。

所以,你最開始的疑問:“關中斷只是屏蔽了中斷,并沒有阻止任務切換,高優先級的任務任然可以搶占CPU并訪問臨界區和共享變量啊”

關了中斷,就禁止了搶占,如果當前任務也沒有進行主動調度,當然系統中也就不會出現比當前優先級更高的任務進入就緒了,也就談不上去“搶占CPU并訪問臨界區和共享變量”了。(作者這里說加了條件“如果當前任務也沒有進行主動調度”,那如果當前任務進行了主動調度會怎么樣?我認為,若是在臨界區中進行了主動調度,那么后果就是提問的人說的:“關中斷只是屏蔽了中斷,并沒有阻止任務切換,高優先級的任務任然可以搶占CPU并訪問臨界區和共享變量”。by imjacob)

由以下網址為證:http://www.gdjy.com.cn/xuexi/UNIX-XIUGAI/ch02/os0203.htm?中2.3.4為證。

上面是這么說的:

關 中 斷 之 后, 任 何 外 部 事 件 都 不 能 打 擾 處 理 機 連 續 執 行 臨 界 區 程 序。?如 果 臨 界 區 程 序 本 身 并 不 包 含 使 它 的 進 程 轉 變 為 封 鎖 狀 態 的 因 素, 那 么 這 種 方 法 就 能 保 證 臨 界 區 作 為 一 個 整 體 執 行。?這 種 方 法 的 優 點 是 簡 單、 可 靠, 但 是 它 也 有 一 定 的 局 限 性 和 若 干 不 足 之 處。

(1) 它 不 能 用 于 多 處 理 機 系 統。 其 原 因 是: 由 于 該 系 統 中 的 多 個 處 理 機 都 有 其 各 自 的 中 斷 開 關, 因 此 一 個 處 理 機 并 不 能 阻 止 在 其 它 處 理 機 上 運 行 的 進 程 進 入 同 類 臨 界 區。

(2)?在 臨 界 區 中 如 果 包 含 有 使 執 行 它 的 進 程 有 可 能 進 入 封 鎖 狀 態 的 因 素, 則 也 不 能 使 用 這 種 方 法。 因 為 在 該 進 程 進 入 封 鎖 狀 態 后, 系 統 將 調 度 另 一 進 程 使 用 處 理 機, 如 果 需 要, 該 進 程 也 可 以 執 行 臨 界 區 程 序, 不 會 受 到 任 何 阻 攔, 所 以 在 這 種 情 況 下, 開、 關 中 斷 不 能 實 施 臨 界 區 互 斥。

(3) 如 果 臨 界 區 比 較 長, 則 本 法 會 降 低 中 斷 響 應 速 度。

(4) 這 是 一 把 鎖 處 理 各 類 臨 界 區, 不 必 要 地 擴 大 了 互 斥 范 圍。

“為什么關中斷開中斷可以作為互斥條件,而且是最粗暴的方式呢?”按上面的解釋,開關中斷是可以作為互斥條件的,但的確很粗暴。眾所周知,嵌入式實時操作系統最關鍵的性能指標之一便是中斷響應時間。中斷響應時間越短,實時性就越好。但很多嵌入式操作系統(包括uCos在內)的中斷響應時間都比較長。原因就是在這些操作系統中大量使用了關中斷這種“粗暴”的方式(OS_ENTER_CRITICAL),你可以看看uCos, FreeRTOS等操作系統的源碼,這樣的寫法比比皆是。當然,不用OS_ENTER_CRITICAL是不可能的,那會造成數據混亂,這是它們的系統結構所決定的。

如果能保證在中斷處理中不去寫共享數據(包括可能改變共享數據的系統調用),就可以不用關中斷了,但這需要改變系統結構,把中斷服務分為兩個部分,這就是所謂的“Top half 和 Bottom half”。如果想了解具體,你可以去網上查查。應用這種技術的操作系統有Linux, Windows, eCos等。

不用中斷來進行調度的操作系統,就是沒有搶占,說白了就是一個協作式操作系統,怎么會一定導致死鎖?難道搶占式操作系統就不會出現死鎖?

其實,死鎖是多個任務在企圖獲取多個獨占(exclusive)資源時,可能導致的一種所有參與任務全部被阻塞的狀態。這分明是屬于應用程序的邏輯概念,而調度則是屬于操作系統的邏輯概念,怎么能混為一談。

后記:

另外在查網絡的時候,還看到一本中國人的書(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 硬件方法中寫:“ 因為cpu只在發生中斷時引起進程切換,這樣禁止中斷就能保證當前運行進程將臨界區代碼順利執行完,從而保證了互斥的正確實現。”顯然也是錯的。我們可以當作練習把它改正了。哈哈。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542408.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542408.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Win10系統怎樣讓打開圖片方式為照片查看器

打開注冊表編輯器之后,我們雙擊左側的目錄,依次打開HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft目錄,如下圖所示。 在Microsoft目錄下,我們需要找到Windows Photo Viewer\Capabilities\FileAssociations目錄項,直到看到該子…

python爬蟲開發 從入門到實戰 pdf 謝乾坤_python字符串和整數相互轉換的實例分享...

python 字符串和整數的轉換方法數字轉成字符串方法一:使用格式化字符串:tt322tem%d %tttem即為tt轉換成的字符串常用的格式化字符串:%d 整數%f%F 浮點數%e%E 科學計數%g%G e 和%f/%E 和%F 的簡寫%% 輸出%格式化操作符輔助指令符號 作用* 定義寬度或者小數…

c語言插入排序算法_插入排序算法,流程圖和C,C ++代碼

c語言插入排序算法In the last article, we discussed about the bubble sort with algorithm, flowchart and code. In this article, we are going to discuss about another basic sorting technique i.e. insertion sort. 在上一篇文章中,我們討論了用算法&…

EF使用CodeFirst方式生成數據庫技巧經驗

前言 EF已經發布很久了,也有越來越多的人在使用EF。如果你已經能夠非常熟練的使用EF的功能,那么就不需要看了。本文意在將自己使用EF的方式記錄下來備忘,也是為了給剛剛入門的同學一些指導。看完此文,你應該就學會以CodeFirst的方…

java jar包示例_Java包getImplementationVersion()方法和示例

java jar包示例包類的getImplementationVersion()方法 (Package Class getImplementationVersion() method) getImplementationVersion() method is available in java.lang package. getImplementationVersion()方法在java.lang包中可用。 getImplementationVersion() method …

c語言中字母的定義,c語言字符串定義與初始化 - 且聽風吟

字符串的兩種定義方式char數組char sa[] “hello world”;char指針char *sp “hello world”;這兩種方式都產生了一個”hello world”的字符串常量,字符串常量存儲在靜態存儲區中,靜態存儲區中的內容在程序運行的整個過程中都存在,而且只存儲一份。數組…

python計算兩字符串中的位置_python – 計算兩個字符串之間距離的算法

是否有任何字符串距離算法沒有考慮到單詞的順序?以下算法未提供所需結果(在該示例中,所需結果應為1):import jarojaro.jaro_winkler_metric(uMichael Jordan,uJordan Michael)>>>0.47import LevenshteinLevenshtein.ratio(Michael Jordan,Jorda…

php unset函數_PHP | 使用unset()函數從數組中刪除元素

php unset函數Given an array and we have to remove an element from the array. 給定一個數組,我們必須從數組中刪除一個元素。 unset()函數 (unset() function) To remove an element from an array, we can use a PHP library unset() function, it accepts th…

vi顯示行號

vi顯示行號 :set nu 帶行號查看,并不改變文件內容:set nonu 取消帶行號查看在每個用戶的主目錄下,都有一個 vi 的配置文件".vimrc"或".exrc"用戶可以編輯它,使這些設置在每次啟動 vi 時,都有效.例如,加入如下設置行:set nu 顯示行號…

對象過濾某個屬性 循環 php_37道PHP面試題(附答案)

1、什么事面向對象?主要特征是什么?面向對象是程序的一種設計方式,它利于提高程序的重用性,使程序結構更加清晰。主要特征:封裝、繼承、多態。2、SESSION 與 COOKIE的區別是什么,請從協議,產生的…

項響琴C語言書籍在線瀏覽,電子琴 c語言程序

實用#include unsigned char code table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char temp;unsigned char key;unsigned char i,j;unsigned char STH0;unsigned char STL0;unsigned int code tab[]{64021,64103,64260,…

Java File類boolean createNewFile()方法(帶示例)

文件類布爾型createNewFile() (File Class boolean createNewFile()) This method is available in package java.io.File.createNewFile(). 軟件包java.io.File.createNewFile()中提供了此方法。 This method is used to create a new file by using createNewFile() method a…

oracle ? SQL執行過程

1.sql執行過程1>解析(判斷對象是否存在,是否有權限查詢,語義解析,檢查緩存中是否有相同的SQL等等)2>優化(CBO確定優化模式,確定訪問路徑,聯接順序,過程中通過很多綜…

vue-video-player修改src就會報錯_4、修改入口點代碼

在riscv上電時,會進行CPU自檢,然后跳轉到bootloader處執行。bootloader設置好kernel的運行環境后,從硬盤加載kernel到內存,最后再跳轉到kernel入口地址。我們采用的bootloader為OpenSBI,被加載到0x80000000地址&#x…

數碼管超聲波c語言黑51,51單片機開發板-超聲波測距-數碼管顯示

《51單片機開發板-超聲波測距-數碼管顯示》由會員分享,可在線閱讀,更多相關《51單片機開發板-超聲波測距-數碼管顯示(16頁珍藏版)》請在人人文庫網上搜索。1、計算機技術系項目工作報告課程名稱單片機開發板設計與制作實訓班級學號姓名項目名稱超聲波測距…

java 方法 示例_Java ArrayDeque帶有示例的removeFirstOccurrence()方法

java 方法 示例ArrayDeque類removeFirstOccurrence()方法 (ArrayDeque Class removeFirstOccurrence() method) removeFirstOccurrence() method is available in java.lang package. removeFirstOccurrence()方法在java.lang包中可用。 removeFirstOccurrence() method is use…

社交應用動態九宮格圖片的規則

這里主要以微信和QQ空間為作為研究對象,得到的結論如下。 QQ空間里的動態 iOS設備,以iPhone6為分界 iPhone6及以上分辨率的設備: 當寬且高同時 > 512px時,判斷 寬/高的比例值:大于 2時,以高度為基準&…

c語言實現鏈表結構6,用c語言實現的鏈表結構--數據結構實驗

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include"stdio.h"//使用new指針來將臨時變量重新初始化#include"stdio.h"typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;void InitList(LinkList &L)//…

splunk中 如何隱藏input_翻糖制作中,如何避免裂縫,如何隱藏裂縫,如何防粘?...

翻糖蛋糕 因精致的樣子和栩栩如生的各種造型深得人們的喜愛,它不僅滿足了人們對蛋糕口味及裝飾日益多樣化的需求,同時也在動手制作的過程中,享受到美食與生活的無窮樂趣。不過裂縫,不平整,干燥對翻糖作品來說無疑是噩夢…

Java DataInputStream readUnsignedByte()方法(帶示例)

DataInputStream類readUnsignedByte()方法 (DataInputStream Class readUnsignedByte() method) readUnsignedByte() method is available in java.io package. readUnsignedByte()方法在java.io包中可用。 readUnsignedByte() method is used to read 1 byte (i.e. 8 bit) of …