所有的進程部分運行與用戶態,部分運行于系統態。底層的硬件如何支持這些狀態各不相同但是通常有一個安全機制從用戶態轉入系統態并轉回來。用戶態比系統態的權限低了很多。每一次進程執行一個系統調用,它都從用戶態切換到系統態并繼續執行。這時讓核心執行這個進程。 linux 中,進程不是互相爭奪成為當前運行的進程,它們無法停止正在運行的其它進程然后執行自身。每一個進程在它必須等待一些系統事件的時候會放棄 CPU 。例如,一個進程可能不得不等待從一個文件中讀取一個字符。這個等待發生在系統態的系統調用中。進程使用了庫函數打開并讀文件,庫函數又執行系統調用從打開的文件中讀入字節。這時,等候的進程會被掛起,另一個更加值得的進程將會被選擇執行。進程經常調用系統調用,所以經常需要等待。即使進程執行到需要等待也有可能會用去不均衡的 CPU 事件,所以 Linux 使用搶先式的調度。用這種方案,每一個進程答應運行少量一段時間, 200 毫秒,當這個時間過去,選擇另一個進程運行,原來的進程等待一段時間直到它又重新運行。這個時間段叫做時間片。
需要調度程序選擇系統中所有可以運行的進程中最值得的進程。一個可以運行的進程是一個只等待 CPU 的進程。 Linux 使用合理而簡單的基于優先級的調度算法在系統當前的進程中進行選擇。當它選擇了預備運行的新進程,它就保存當前進程的狀態、和處理器相關的寄存器和其他需要保存的上下文信息到進程的 task_strUCt 數據結構中。然后恢復要運行的新的進程的狀態(又和處理器相關),把系統的控制交給這個進程。為了公平地在系統中所有可以運行( runnable )的進程之間分配 CPU 時間,調度程序在每一個進程的 task_struct 結構中保存了信息:
參見 kernel/sched.c schedule()
policy 進程的調度策略。 Linux 有兩種類型的進程:普通和實時。實時進程比所有其它進程的優先級高。假如有一個實時的進程預備運行,那么它總是先被運行。實時進程有兩種策略:環或先進先出( round robin and first in first out )。在環的調度策略下,每一個實時進程依次運行,而在先進先出的策略下,每一個可以運行的進程按照它在調度隊列中的順序運行,這個順序不會改變。