非搶佔式

非搶佔式

非搶佔式(進程調度)是一種進程調度的方式,與其相對的是搶佔式(進程調度)。

非搶佔式讓原來正在運行的進程繼續運行,直至該進程完成或發生某種事件(如I/O請求),才主動放棄處理機。

兩者的對比


非搶佔式(Nonpreemptive)
讓進程運行直到結束或阻塞的調度方式
容易實現
適合專用系統,不適合通用系統
搶佔式(Preemptive)
允許將邏輯上可繼續運行的在運行過程暫停的調度方式
可防止單一進程長時間獨佔CPU
系統開銷大(降低途徑:硬體實現進程切換,或擴充主存以貯存大部分程序)

兩者的區分


一個新創建的進程首先被放置在Ready隊列,它一直等待執行的機會。一旦內核調度器將CPU分配給它開始執行時,有四種可能:
(1)進程主動發起I/O請求,但I/O設備還沒有準備好,所以會發生I/O阻塞,進程進入Wait狀態。
(2)內核分配給進程的時間片已經耗盡了,進程進入Ready狀態,等待內核重新分配時間片后的執行機會。
(3)進程創建了子進程,並調用wait()等待子進程執行完畢,進程就重新進入Ready狀態等待阻塞結束。
(4)I/O設備可以在任意時刻發生中斷,CPU會停下當前正在執行的進程去處理中斷,因此進程進入Ready狀態。
區分一個多任務分時系統是搶佔式的還是非搶佔式的,則要看進程調度能否在(4)發生中斷,CPU停止當前手頭的工作(正在執行的進程),保存下當前工作的現場后,轉入中斷處理程序。如果在中斷處理程序的執行中能否發生調度,即中斷處理程序還沒有執行完,又切換到其他進程。這裡要說明的是,系統調用也是通過中斷機制來實現的。所以,也就是說要看系統調用的執行過程中,或者中斷處理程序的執行過程中能否發生調度(搶佔)。