Linux
Linux CFS 調度程序:任務如何停止?
據我通過閱讀一些 SO 問題和核心文件了解到,在 Linux 中,一個任務(執行緒、程序甚至一組任務)可以在最短的時間內(根據我的筆記型電腦中的 3 毫秒)不間斷地執行到 /proc/sys/kernel/sched_min_granularity_ns),之後如果負載高可以隨時停止。如果不是這種情況並且已經超過 CPU 時間,則必須停止任務以允許其他任務繼續進行。
但在我的理解中,一旦 CPU 執行一個任務,沒有什麼可以阻止它,這自然會產生兩個非常相關的問題:
- 如何停止任務?我唯一能想到的就是作業系統發送某種簡單的 CPU 中斷,還是這裡涉及到更複雜的事情?
- 如果 CPU 是單執行緒的,一次只能執行一個任務,任務可以完全停止嗎?因為如果 CPU 目前正在執行一個任務,Linux 怎麼可能執行自己的管理常式來檢查該任務是否必須停止?
只要核心獲得控制權,就可以進行調度。發生這種情況有兩種方法,即使使用單個 CPU,這兩種方法也可能發生:
- 中斷,其中硬體事件導致 CPU 切換到相應的中斷處理程序(在核心中);
- 系統呼叫,正在執行的任務呼叫核心為其執行一些工作。
在這兩種情況下,在核心將控制權返回給使用者空間之前,它會確定哪個可執行任務應該獲得控制權——這可以是最初被中斷的任務,但不一定是。
即使沒有太多的硬體活動,定時器中斷也能確保核心定期獲得控制權。