掛起:一般是主動的,由系統或程序發出,甚至於輔存中去。(不釋放CPU,可能釋放內存,放在外存)
阻塞:一般是被動的,在搶占資源中得不到資源,被動的掛起在內存,等待某種資源或信號量(即有了資源)將他喚醒。(釋放CPU,不釋放內存)
另外,有一段話很形象:
掛 起 進程在操作系統中可以定義為暫時被淘汰出內存的進程,機器的資源是有限的,在資源不足的情況下,操作系統對在內存中的程序進行合理的安排,其中有的進程被暫時調離出內存,當條件允許的時候,會被操作系統再次調回內存,重新進入等待被執行的狀態即就緒態,系統在超過一定的時間沒有任何動作.
操作系統為什么要引入掛起狀態?掛起狀態涉及到中級調度,因為當內存中的某個程序需要大的內存空間來執行,但這時內存有沒有空余空間了,那么操作系統就回根據調度算法把一些進程放到外存中去,以騰出空間給正在執行的程序的數據和程序,所以引如了掛起狀態。引起掛起狀態的原因有如下幾方面:
(1)終端用戶的請求。當終端用戶在自己的程序運行期間發現有可疑問題時,希望暫停使自己的程序靜止下來。亦即,使正在執行的進程暫停執行;若此時用戶進程正處於就緒狀態而未執行,則該進程暫不接受調度,以便用戶研究其執行情況或對程序進行修改。我們把這種靜止狀態成為“掛起狀態”。
(2)父進程的請求。有時父進程希望掛起自己的某個子進程,以便考察和修改子進程,或者協調各子進程間的活動。
(3)負荷調節的需要。當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的進程掛起,以保證系統能正常運行。
(4)操作系統的需要。操作系統有時希望掛起某些進程,以便檢查運行中的資源使用情況或進行記賬。
(5)對換的需要。為了緩和內存緊張的情況,將內存中處於阻塞狀態的進程換至外存上。
下面再說下進程和線程的狀態:
進程:一般大家認為是三種狀態:運行、阻塞、就緒。也有分為五態的(多了創建和退出狀態)
線程:一般認為是四種狀態:New Thread(not alive)、Runnable Thread(alive)、Blocked Thread(alive)、Dead Thread(not alive)