我一直在研究unix/linux系統的基礎知識,特別是如何在現代計算機系統中處理任務或進程列表。Linux進程調度程序 - 它們自己是否使用CPU?
我發現了大量的資源,讓這似乎是內核不和如何信號(SIGXXX)被處理的context switching的標準解釋:
- 一個過程,一組量運行的時間或直到中斷被接收到
- 內核從運行內存中卸載進程 (緩存),將有關其上下文的數據存儲在其他位置以加載需要CPU時間的下一個進程。
- 如果一個信號(SIGXXX)正在等待 的進程,內核會嘗試調用 這個進程中的相應處理程序。如果不存在,則該過程不會再被裝回 (殺死)。
- 新進程被加載到內存中並運行;循環 繼續
(請讓我知道,如果這種認識是不正確的)
我一直在掙扎是的事情,如果這一切發生在一個單核單線程CPU ,物理上運行調度程序的是什麼?我錯過了一件非常簡單的事情,但我陷入了這種雞肉或雞蛋的思維。
此外,在具有多個內核,線程和大量可用CPU資源的現代系統中,調度程序是否自己消耗一個內核來運行?我已經閱讀了很多關於不同進程調度器,原始O(n),在2.6及更高版本中引入的較新O(1)以及CFS調度器(我認爲?)的文章現在大多數Linux。他們都談論他們如何優先排序和排隊進程,他們都沒有詳細說明調度程序如何以及何時實際運行以完成其所有任務。
調度程序是否共享CPU時間?以某種方式改變本身進出CPU的狀態?如果是這樣,CPU如何知道什麼時候停止進程並讓調度程序運行來做它的事情?
部分,我的問題是關於不是簡單的情況 - 在多核心處理器或多個處理器的情況。你是否說過CPU總是花費在特定任務上的時間總是有硬編碼的限制,並且中斷髮生在最大值並且CPU加載調度器?哪個CPU在12核心的情況下加載調度器?什麼決定了? – Locane
調度程序必須在每個內核上運行,一個內核不能更改另一個內核的寄存器。而硬編碼限制取決於調度算法。其中一些給予每個進程最大時間片,並且如果進程不會自動「放棄」CPU,則該中斷會使上下文切換髮生 –