Linux

Linux如何實現搶占式調度?

  • April 19, 2020

我正在閱讀 Linux 文件項目中的 Linux 程序: https ://www.tldp.org/LDP/tlk/kernel/processes.html

程序總是在進行系統呼叫,因此可能經常需要等待。即便如此,如果一個程序一直執行到它等待,那麼它仍然可能使用不成比例的 CPU 時間,因此 Linux 使用搶先式調度。在這個方案中,每個程序被允許執行一小段時間,200ms,當這個時間到期時,另一個程序被選擇執行,並且原來的程序等待一段時間,直到它可以再次執行。這少量的時間被稱為時間片。

我的問題是,如何跟踪這個時間?如果程序是目前唯一佔用 CPU 的程序,那麼實際上並沒有檢查時間是否已過期,對吧?

我知道程序會跳轉到系統呼叫,而那些會跳轉回調度程序,因此在這方面如何“交換”程序是有意義的。但是 Linux 是如何跟踪一個程序在 CPU 上佔用了多少時間的呢?只能通過硬體定時器嗎?

簡短的回答是肯定的。所有實際的搶占方法都將使用某種 CPU 中斷來跳回特權模式,即 linux 核心調度程序。

如果你看看你的,/proc/interrupts你會發現系統中使用的中斷,包括定時器。

請注意,linux 有幾種不同類型的調度程序,並且很少使用經典的定期計時器樣式 - 來自完全公平調度程序 (CFS) 文件

CFS 使用納秒粒度記帳,不依賴任何 jiffies 或其他 HZ 細節。因此,CFS 調度器沒有像以前的調度器那樣的“時間片”概念,也沒有任何啟發式方法。

此外,當程序發出系統呼叫(通常通過軟體中斷 - “陷阱”)時,核心也能夠搶占呼叫程序,這在系統呼叫等待來自其他程序的數據時尤其明顯。

引用自:https://unix.stackexchange.com/questions/581183