簡體   English   中英

什么是可重入內核

[英]what is a reentrant kernel

什么是可重入內核?

更簡單的答案:

內核重入

如果內核不可重入,則只能在用戶模式下暫停進程。 雖然它可以在內核模式下暫停,但仍會阻止所有其他進程上的內核模式執行。 原因是所有內核線程共享相同的內存。 如果執行會在它們之間任意跳轉,則可能會發生損壞。

重入內核使得進程(或者更確切地說,它們對應的內核線程)能夠在內核模式下放棄CPU。 它們不會阻礙其他進程進入內核模式。 典型的用例是IO等待。 該過程想要讀取文件。 它為此調用了一個內核函數。 在內核函數內,磁盤控制器被要求提供數據。 獲取數據需要一些時間,並且在此期間功能被阻止。 使用可重入內核,調度程序將CPU分配給另一個進程(內核線程),直到來自磁盤控制器的中斷指示數據可用並且我們的線程可以恢復。 此進程仍然可以訪問IO(需要內核函數),如用戶輸入。 系統保持響應,並且由於IO等待而浪費的CPU時間減少。

這是當今桌面操作系統的標准配置。

內核優先

內核搶占無助於系統的整體吞吐量。 相反,它尋求更好的響應能力。

這里的想法是,通常內核函數只會被硬件原因中斷:外部中斷或IO等待情況,它會自動放棄對調度程序的控制。 先發制人的內核也可以中斷和掛起內核函數,就像在用戶模式下中斷進程一樣。 系統響應更快,因為即使在內核內部進行大量工作時,也會喚醒進程,例如處理鼠標輸入。

內核級別的搶占使得內核開發人員更難:內核函數不能只是自願掛起,也不能由中斷處理程序(在某種程度上是受控環境)暫停,而是由於調度程序而導致的任何其他進程。 必須注意避免死鎖:線程鎖定資源A但是需要資源B被另一個鎖定資源B的線程中斷,但是需要資源A.

用一粒鹽解釋我的先發制人。 我很高興任何更正。

所有Unix內核都是可重入的。 這意味着可以在內核模式下同時執行多個進程。 當然,在單處理器系統上,只有一個進程可以進行,但是在等待CPU或完成某些I / O操作時,許多進程可以在內核模式下被阻塞。 例如,在代表進程向磁盤發出讀取之后,內核讓磁盤控制器處理它並繼續執行其他進程。 當設備滿足讀取時,中斷通知內核,因此前一個進程可以恢復執行。

提供重入的一種方法是編寫函數,以便它們只修改局部變量而不改變全局數據結構。 這些函數稱為可重入函數。 但是,可重入內核並不僅限於這種可重入函數(盡管這是實現某些實時內核的方式)。 相反,內核可以包含非重量函數並使用鎖定機制來確保一次只能有一個進程執行非重入函數。

如果發生硬件中斷,即使該進程處於內核模式,重入內核也能夠暫停當前正在運行的進程。 此功能非常重要,因為它可以提高發出中斷的設備控制器的吞吐量。 一旦設備發出中斷,它就會等待CPU確認。 如果內核能夠快速應答,則設備控制器將能夠在CPU處理中斷時執行其他任務。

現在讓我們看一下內核重入及其對內核組織的影響。 內核控制路徑表示內核為處理系統調用,異常或中斷而執行的指令序列。

在最簡單的情況下,CPU從第一條指令到最后一條指令順序執行內核控制路徑。 但是,當發生以下事件之一時,CPU會交錯內核控制路徑:

在用戶模式下執行的進程調用系統調用,相應的內核控制路徑驗證不能立即滿足請求; 然后它調用調度程序來選擇要運行的新進程。 結果,發生了過程切換。 第一個內核控制路徑未完成,CPU恢復執行其他一些內核控制路徑。 在這種情況下,兩個控制路徑代表兩個不同的進程執行。

CPU在運行內核控制路徑時檢測異常 - 例如,訪問RAM中不存在的頁面。 第一個控制路徑被掛起,CPU開始執行合適的過程。 在我們的示例中,此類過程可以為進程分配新頁面並從磁盤讀取其內容。 當過程終止時,可以恢復第一個控制路徑。 在這種情況下,兩個控制路徑代表相同的過程執行。

CPU正在運行啟用了中斷的內核控制路徑時發生硬件中斷。 第一個內核控制路徑未完成,CPU開始處理另一個內核控制路徑來處理中斷。 中斷處理程序終止時,第一個內核控制路徑恢復。 在這種情況下,兩個內核控制路徑在同一進程的執行上下文中運行,並且計算總系統CPU時間。 但是,中斷處理程序不一定代表進程運行。

CPU在運行並啟用內核搶占時發生中斷,並且可以運行更高優先級的進程。 在這種情況下,第一個內核控制路徑未完成,並且CPU代表優先級較高的進程繼續執行另一個內核控制路徑。 只有在使用內核搶占支持編譯內核時才會發生這種情況。

這些信息可在http://jno.glas.net/data/prog_books/lin_kern_2.6/0596005652/understandlk-CHP-1-SECT-6.html上找到

更多關於http://linux.omnipotent.net/article.php?article_id=12496&page=-1

內核是操作系統的核心部分,它直接與硬件連接並調度要運行的進程。

進程調用內核函數來執行訪問硬件或啟動新進程等任務。 因此,在某些時間段內,進程將執行內核代碼。 如果多個進程可以同時執行內核代碼,則內核稱為可重入 “同時”可能意味着兩個進程實際上同時執行內核代碼(在多處理器系統上)或者一個進程在執行內核代碼時被中斷(因為它等待硬件響應,例如)並且計划運行的另一個進程也調用了內核。

可重入內核提供更好的性能,因為內核沒有爭用 不可重入的內核需要使用來確保沒有兩個進程同時執行內核代碼。

可重入函數是可以由多個任務同時使用而不用擔心數據損壞的函數。 相反,非重入函數是一個不能由多個任務共享的函數,除非通過使用信號量或在代碼的關鍵部分禁用中斷來確保對函數的互斥。 可以在任何時間中斷可重入函數,並在以后恢復,而不會丟失數據。 可重入函數使用局部變量或在使用全局變量時保護其數據。

可重入函數:

Does not hold static data over successive calls
Does not return a pointer to static data; all data is provided by the caller of the function
Uses local data or ensures protection of global data by making a local copy of it
Must not call any non-reentrant functions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM