1

按我的理解,調度就以下項目:如何搶先工作?

  1. 計算任務的時間片(這可能是算法依賴)。
  2. 交換機任務 - 一個理想的調度程序喜歡做O(1)。一個好的調度算法提供了O(logN)的複雜性。選擇新任務的標準依賴於調度算法。

我的問題是預emptiom。例如,創建一個新任務,它需要馬上運行(並且它確實滿足條件 - 例如它具有比當前正在運行的任務更高的優先級)。

將如何調度器知道更高優先級的新任務是提供和運行所需。我們需要在內核實現中有一些控制代碼來檢測這樣的任務條目,並調用Scheduler來保存當前正在運行的任務的狀態並重新安排新的任務。我想知道更多關於這種軟件實體的細節。

而且我預計要安排此代碼在運行CPU控制「調度」,使調度切換任務。

請告知這是如何實現的,也可以是我在我的理解有些差距。

在此先感謝

回答

1

理解這一點的最好辦法是讀一本書像「X操作系統的設計」,其中X爲{UNIX,LINUX,BSD ...}之一。你應該找到關於上下文切換的章節和關於調度程序的一章。你也可以看看https://en.wikipedia.org/wiki/Context_switchhttps://en.wikipedia.org/wiki/Scheduling_%28computing%29#Linux,但這本書可能會更好。基本上,當用戶代碼執行一個系統調用(例如創建一個新進程,釋放一個信號或...),或者當你得到一個時鐘中斷,或者當你得到某種其他中斷時,用戶進程的運行狀態總是被轉儲到內存中,這樣內核代碼就可以運行而不會搞亂用戶進程。完成此操作後,正在運行的用戶進程與其他任何可運行的用戶進程沒有太大區別。

作爲服務系統調用或中斷或其他任務所需工作的一部分,系統可以注意到有一個新的可運行進程,或者其他一些以前不可運行的進程現在可以運行,調度程序來更新其最高優先級可運行進程的概念。它也許會注意到一個調度量已經過期,並要求調度器運行一個完整的重新調度。

一旦內核代碼完成了它的工作,它可能會看到調度程序標記了最高優先級的可運行進程,並且內核代碼將讀取該進程的內存不足狀態並返回給它,而不用擔心它是否會是在系統調用之前運行的進程,或者其他什麼。

例外:從前擔心傾銷和恢復浮點寄存器,其內核模式並不真正需要的成本,因爲它可能被編寫,以便它從來沒有浮點時間機器。在這種情況下,可能會寫入保存/恢復代碼,以便它不會保存浮點寄存器,除非必須執行此操作,並且內核可能會檢查其是否作爲還原的一部分來查看它是否切換到新進程,以及需要轉儲出來並恢復浮點寄存器。據我所知,東西可能仍然會這樣做,或者可能會有一些更現代化的狀態,只有當過程真正發生變化時纔會被保存和恢復。但這只是兩個案例中的一個細節。

+0

你對書的建議是我同意的。 +1。當然還有很好的詳細答案。 –

+0

感謝您的詳細解釋。這對我有意義。我也會閱讀你所建議的書和文章。 – Zoolander