2017-02-10 77 views
0

我一直在研究unix/linux系統的基礎知識,特別是如何在現代計算機系統中處理任務或進程列表。Linux進程調度程序 - 它們自己是否使用CPU?

我發現了大量的資源,讓這似乎是內核不和如何信號(SIGXXX)被處理的context switching的標準解釋:

  • 一個過程,一組量運行的時間或直到中斷被接收到
  • 內核從運行內存中卸載進程 (緩存),將有關其上下文的數據存儲在其他位置以加載需要CPU時間的下一個進程。
  • 如果一個信號(SIGXXX)正在等待 的進程,內核會嘗試調用 這個進程中的相應處理程序。如果不存在,則該過程不會再被裝回 (殺死)。
  • 新進程被加載到內存中並運行;循環 繼續

(請讓我知道,如果這種認識是不正確的)

我一直在掙扎是的事情,如果這一切發生在一個單核單線程CPU ,物理上運行調度程序的是什麼?我錯過了一件非常簡單的事情,但我陷入了這種雞肉或雞蛋的思維。

此外,在具有多個內核,線程和大量可用CPU資源的現代系統中,調度程序是否自己消耗一個內核來運行?我已經閱讀了很多關於不同進程調度器,原始O(n),在2.6及更高版本中引入的較新O(1)以及CFS調度器(我認爲?)的文章現在大多數Linux。他們都談論他們如何優先排序和排隊進程,他們都沒有詳細說明調度程序如何以及何時實際運行以完成其所有任務。

調度程序是否共享CPU時間?以某種方式改變本身進出CPU的狀態?如果是這樣,CPU如何知道什麼時候停止進程並讓調度程序運行來做它的事情?

回答

2

如果這一切都發生在單核,單線程CPU上,物理上運行調度器的是什麼?

你認爲它需要是內核以外的東西,因爲當前線程忙於做東西併發出系統調用。關鍵的想法是內核在CPU內核中註冊了一個時鐘中斷,每個設備的確切實現方式各不相同,但是每當定時器間隔結束或發生內核信號時,CPU內核本身就會調用已註冊的interrupt handler (aka ISR)。 ISR實際上是一個指向你給內核的中斷函數的內存指針。在中斷函數返回到用戶空間(即當前工作線程)之前調度程序被調用(更多details here

調度的頻率取決於clock speed of the cpu

調度程序是否自己消耗一個內核來運行?

不,調度程序自己運行在每個內核上,也可以在另一個內核上調度線程。

一些進一步閱讀:

1

調度程序是內核的一部分,當然,它會消耗CPU。在最簡單的情況下,您可以將計時器連接到CPU,例如每10ms計數一次。在每個時鐘週期中,CPU都會'中斷',也就是說,它會跳轉到調度程序所在的某個預定義地址。然後調度程序將一些與進程相關的數據保存到某個內部結構中,選擇另一個進程,加載其數據並跳轉到進程正在執行的地址。這些O(n)和O(1)確實是調度程序的時間複雜性,這意味着調度程序需要多少時間來決定下一個要調度的任務。

+0

部分,我的問題是關於不是簡單的情況 - 在多核心處理器或多個處理器的情況。你是否說過CPU總是花費在特定任務上的時間總是有硬編碼的限制,並且中斷髮生在最大值並且CPU加載調度器?哪個CPU在12核心的情況下加載調度器?什麼決定了? – Locane

+0

調度程序必須在每個內核上運行,一個內核不能更改另一個內核的寄存器。而硬編碼限制取決於調度算法。其中一些給予每個進程最大時間片,並且如果進程不會自動「放棄」CPU,則該中斷會使上下文切換髮生 –