1. 程式人生 > >掛起和阻塞區別以及sleep和wait的區別

掛起和阻塞區別以及sleep和wait的區別

阻塞 VS 掛起

阻塞與掛起都是程序的狀態,但他們有一些相似之處,也有一些區別,下面先對他們進行概述,再進行比較

阻塞:正在執行的程序由於發生某時間(如I/O請求、申請緩衝區失敗等)暫時無法繼續執行。此時引起程序排程,OS把處理機分配給另一個就緒程序,而讓受阻程序處於暫停狀態,一般將這種狀態稱為阻塞狀態。

掛起:由於系統和使用者的需要引入了掛起的操作,程序被掛起意味著該程序處於靜止狀態。如果程序正在執行,它將暫停執行,若原本處於就緒狀態,則該程序此時暫不接受排程。

共同點:
1. 程序都暫停執行
2. 程序都釋放CPU,即兩個過程都會涉及上下文切換

不同點:
1. 對系統資源佔用不同:雖然都釋放了CPU,但阻塞的程序仍處於記憶體中,而掛起的程序通過“對換”技術被換出到外存(磁碟)中。
2. 發生時機不同:阻塞一般在程序等待資源(IO資源、訊號量等)時發生;而掛起是由於使用者和系統的需要,例如,終端使用者需要暫停程式研究其執行情況或對其進行修改、OS為了提高記憶體利用率需要將暫時不能執行的程序(處於就緒或阻塞佇列的程序)調出到磁碟
3. 恢復時機不同:阻塞要在等待的資源得到滿足(例如獲得了鎖)後,才會進入就緒狀態,等待被排程而執行;被掛起的程序由將其掛起的物件(如使用者、系統)在時機符合時(除錯結束、被排程程序選中需要重新執行)將其主動啟用

 

掛起和阻塞區別:
(1)掛起是一種主動行為,因此恢復也應該要主動完成。而阻塞是一種被動行為,是在等待事件或者資源任務的表現,你不知道它什麼時候被阻塞,也不清楚它什麼時候會恢復阻塞。
(2)阻塞(pend)就是任務釋放CPU,其他任務可以執行,一般在等待某種資源或者訊號量的時候出現。掛起(suspend)不釋放CPU,如果任務優先順序高,就永遠輪不到其他任務執行。一般掛起用於程式除錯中的條件中斷,當出現某個條件的情況下掛起,然後進行單步除錯。

sleep()和wait()函式的區別:
(1)兩者比較的共同之處是:兩個方法都是使程式等待多少毫秒。
(2)最主要區別是:sleep()方法沒有釋放鎖。而wait()方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。
(3)sleep()指執行緒被呼叫時,佔著CPU不工作,形象的說明為“佔著CPU”睡覺。
sleep(2000)表示:佔用CPU,程式休眠2秒。
wait(2000)表示:不佔用CPU,程式等待2秒。