引起進程調度的原因有以下幾類
進程調度發生在什麼時機呢?這與引起進程調度的原因以及進程調度的方式有關。
(1)正在執行的進程執行完畢。這時,如果不選擇新的就緒進程執行,將浪費處理機資源。
(2)執行中進程自己調用阻塞原語將自己阻塞起來進入睡眠等狀態。
(3)執行中進程調用了P原語操作,從而因資源不足而被阻塞;或調用了v原語操作激活了等待資源的進程隊列。
(4)執行中進程提出I/O請求後被阻塞。
(5)在分時系統中時間片已經用完。
(6)在執行完系統調用等系統程序後返回用戶進程時,這時可看作系統進程執行完畢,從而可調度選擇一新的用戶進程執行。
以上都是在可剝奪方式下的引起進程調度的原因。在CPU執行方式是可剝奪時.還有
(7)就緒隊列中的某進程的優先級變得高於當前執行進程的優先級,從而也將引發進程調度。
兩種占用CPU的方式
可剝奪式 (可搶占式preemptive):就緒隊列中一旦有優先級高於當前執行進程優先級的進程存在時,便立即發生進程調度,轉讓處理機。
不可剝奪式 (不可搶占式non_preemptive):即使在就緒隊列存在有優先級高於當前執行進程時,當前進程仍將占用處理機直到該進程自己因調用原語操作或等待I/O而進入阻塞、睡眠狀態,或時間片用完時才重新發生調度讓出處理機。
對內核線程來說,內核調度對象為線程;而對用戶線程,內核是以進程作為調度對象,而非用戶線程,用戶線程在用戶空間中實現,內核並沒有直接對用戶線程進程調度,內核的調度對象是進程,內核並不知道用戶線程的存在。
在linux內核中,內核線程通常也叫內核進程,一個內核線程處於阻塞狀態時不影響其他的內核線程或者說是內核進程),但在用戶空間時,用戶進程中的某一個用戶線程發生了阻塞,都會導致其所在進程的休眠。
補充:當進程阻塞時包括內核線程),進程掛起,掛起的進程進入休眠狀態。獲取自旋鎖失敗時,不會阻塞,而是在一個死循環中檢查資源是否可以得到,
循環等待並不代表阻塞。
阻塞操作是指,在執行設備操作時,若不能獲得資源,則進程掛起直到滿足可操作的條件再進行操作。
本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/1304572