行程狀態模型(process state model)
想像服務台只有一位人員,一次只能服務一個人。任何時刻,一位顧客要嘛剛到、要嘛排隊等輪到自己、要嘛正在被服務、要嘛離開去拿文件(因此還沒準備好被服務)、要嘛辦完事正要離開。行程狀態模型為行程捕捉了這些相同的情境:任何一瞬間,行程都恰好處於一個明確定義的狀態,並沿著允許的轉換在狀態之間移動。
經典的狀態有:新建(行程正被建立)、就緒(它可以執行,只是在等一顆空閒的 CPU)、執行中(它正在某顆 CPU 上執行)、等待或阻塞(在某事件發生前它無法繼續,例如等磁碟送來資料)、以及終止(它已完成)。重要的轉換有:完成設置後,新建變就緒;排程器選中它時,就緒變執行中;時間配量用完或被搶佔時,執行中變就緒;它要求某個尚未備妥的東西時,執行中變等待;那個事件終於發生時,等待變就緒;它退出時,執行中變終止。注意一個阻塞的行程不會直接回到執行中:它的事件到來時,它回到就緒,必須重新被排程。
這個模型是作業系統如何同時調度眾多行程的骨幹。在單顆 CPU 上,任一時刻恰好有一個行程在執行;許多行程可以就緒(排著隊);許多行程可以等待(各自阻塞在自己的事件上)。一個常見的混淆是把就緒與等待當成同一種「沒在執行」的狀態。它們有關鍵差異:就緒的行程只缺一顆 CPU,可以立刻執行;而等待的行程無論 CPU 多空閒都不能執行,直到它的事件發生為止。
一個在 CPU 上執行的行程呼叫 read() 向磁碟取資料。資料到來前它無法繼續,於是從「執行中」移到「等待」。當磁碟完成時,它從「等待」移到「就緒」,稍後排程器再把它從「就緒」移回「執行中」。
因輸入輸出而阻塞會把行程送到等待,再到就緒,絕不會直接回到執行中。
就緒與等待不一樣。就緒的行程只缺一顆 CPU;等待(阻塞)的行程在它所等的事件發生前根本無法執行,無論 CPU 多麼空閒。