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

2021-09-07 13:44:01 字數 1146 閱讀 4069

阻塞 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秒。

阻塞和掛起的區別

阻塞 如果乙個任務當前正在等待某個外部事件的話就說它處於阻塞態,比如說如果某個任務調 用了函式 vtaskdelay 的話就會進入阻塞態,直到延時週期完成。任務在等待佇列 訊號量 事 件組 通知或互斥訊號量的時候也會進入阻塞態。任務進入阻塞態會有乙個超時時間,當超過 這個超時時間任務就會退出阻塞態,...

linux 區別 掛起 阻塞 阻塞和死迴圈的區別

關於各種任務狀態的實質 1.掛起 將任務掛起的實質就是1 將當前任務控制塊的狀態標誌改為掛起狀態2 將任務就緒表中的對應位置0 3 如果是事件型別,則還會將任務加入到當前的事件等待任務列表中 和就緒表一樣的點陣圖 4 執行任務排程,讓出cpu使用權。這裡需要注意的是,任務掛起後任務不是處於占用cpu...

程序的阻塞和掛起的區別

程序的阻塞和掛起的區別 理解一 掛起是一種主動行為,因此恢復也應該要主動完成,而阻塞則是一種被動行為,是在等待事件或資源時任務的表現,你不知道他什麼時候被阻塞 pend 也就不能確切 的知道他什麼時候恢復阻塞。而且掛起佇列在作業系統裡可以看成乙個,而阻塞佇列則是不同的事件或資源 如訊號量 就有自己的...