Kernel
核心調度程序如何知道如何搶占程序?
據我了解,核心不是一個程序,而是一組可以從另一個進度的執行時呼叫的處理程序(或者核心本身通過計時器或類似的東西?)
如果一個程序在它可以再次開始執行之前遇到一些需要長時間執行的同步處理的異常處理程序(例如,遇到需要讀取磁碟的頁面錯誤),核心如何辨識應該切換上下文?為了實現這一點,似乎需要執行另一個程序?
核心是否通過間歇性地檢查處於這種狀態的程序來產生一個處理這個問題的程序?呼叫長時間執行的同步處理程序的程序是否讓核心知道它應該切換上下文直到處理程序完成(例如磁碟讀取完成)?
- “核心不是一個程序。”
這是純粹的術語。(術語很重要。)核心不是一個程序,因為根據定義程序存在於使用者空間中。但是核心確實有執行緒。 2. “如果一個程序在它可以再次開始執行之前遇到一些需要長時間執行的同步處理的異常處理程序(例如,遇到需要讀取磁碟的頁面錯誤)”。
如果使用者態程序執行引用未映射記憶體頁的機器指令,則:
- 處理器生成一個陷阱並轉換到ring 0/supervisor mode。(這發生在硬體中。)
- 陷阱處理程序是核心的一部分。假設記憶體頁面確實必須從磁碟調入,它會將程序置於不間斷睡眠狀態(這意味著它將程序CPU狀態保存在程序表中,並修改了程序表中程序條目中的狀態欄位程序),找到受害者記憶體頁面,啟動 I/O 以分出受害者和請求頁面中的頁面,並呼叫調度程序(核心的另一部分)將使用者空間上下文切換到準備執行的另一個程序。
- 最終,I/O 完成。這會產生一個中斷。作為對中斷的響應,處理器呼叫一個處理程序並轉換到 ring 0/supervisor 模式。(這發生在硬體中。)
- 中斷處理程序是核心的一部分。它清除等待記憶體頁面的程序的等待 I/O 狀態,並將其標記為準備執行。然後它呼叫調度程序將使用者空間上下文切換到準備執行的程序。
一般來說,核心執行:
- 響應硬體陷阱或中斷;這包括定時器中斷。
- 響應來自使用者程序的顯式系統呼叫。
大多數時候,處理器處於 ring 3/使用者模式並執行來自某些使用者態程序的指令。當使用者態程序進行系統呼叫(例如,因為它想做一些輸入/輸出操作)或硬體生成陷阱(無效的記憶體訪問,除以零等)或從硬體接收到中斷請求(I/O 完成、定時器中斷、滑鼠移動、數據包到達網路介面等)
要回答標題中的問題,“核心調度程序如何知道如何搶占程序”:核心處理定時器中斷。如果,當定時器中斷到達時,調度器注意到目前正在執行的使用者態程序已經用盡了它的時間片,那麼該程序將被放在執行隊列的末尾並恢復另一個程序。(通常,調度程序會注意確保所有準備好執行的使用者態程序公平地接收處理器時間。)