程序的掛起與阻塞

2021-07-13 18:59:23 字數 2233 閱讀 7786

阻塞是由於程序所需資源得不到滿足,並會最終導致程序被掛起

程序掛起的原因並不一定是由於阻塞,也有可能是時間片得不到滿足,掛起狀態是程序從記憶體排程到外存中的一種狀態,若在就緒態時,從記憶體調出到外存中,就是就緒掛起態,若在阻塞態時,從記憶體調出到外存中,就轉換成了阻塞掛起態

掛起:一般是主動的,由系統或程式發出,甚至於輔存中去。(不釋放cpu,可能釋放記憶體,放在外存)

阻塞:一般是被動的,在搶占資源中得不到資源,被動的掛起在記憶體,等待某種資源或訊號量(即有了資源)將他喚醒。(釋放cpu,不釋放記憶體)

作業系統中睡眠、阻塞、掛起的區別形象解釋:

首先這些術語都是對於執行緒來說的。對執行緒的控制就好比你控制了乙個雇工為你幹活。你對雇工的控制是通過程式設計來實現的。

掛起執行緒的意思就是你對主動對雇工說:「你睡覺去吧,用著你的時候我主動去叫你,然後接著幹活」。

使執行緒睡眠的意思就是你主動對雇工說:「你睡覺去吧,某時某刻過來報到,然後接著幹活」。

執行緒阻塞的意思就是,你突然發現,你的雇工不知道在什麼時候沒經過你允許,自己睡覺呢,但是你不能怪雇工,肯定你         這個雇主沒注意,本來你讓雇工掃地,結果掃帚被偷了或被鄰居家借去了,你又沒讓雇工繼續幹別的活,他就只好睡覺了。至於掃帚回來後,雇工會不會知道,會不會繼續幹活,你不用擔心,雇工一旦發現掃帚回來了,他就會自己去幹活的。因為雇工受過良好的培訓。這個培訓機構就是作業系統。

掛 起 程序在作業系統中可以定義為暫時被淘汰出記憶體的程序,機器的資源是有限的,在資源不足的情況下,作業系統對在記憶體中的程式進行合理的安排,其中有的程序被暫時調離出記憶體,當條件允許的時候,會被作業系統再次調回記憶體,重新進入等待被執行的狀態即就緒態,系統在超過一定的時間沒有任何動作.

作業系統為什麼要引入掛起狀態?掛起狀態涉及到中級排程,因為當記憶體中的某個程式需要大的記憶體空間來執行,但這時記憶體有沒有空餘空間了,那麼作業系統就回根據排程演算法把一些程序放到外存中去,以騰出空間給正在執行的程式的資料和程式,所以引如了掛起狀態。引起掛起狀態的原因有如下幾方面: 

(1)終端使用者的請求。當終端使用者在自己的程式執行期間發現有可疑問題時,希望暫停使自己的程式靜止下來。亦即,使正在執行的程序暫停執行;若此時使用者程序正處於就緒狀態而未執行,則該程序暫不接受排程,以便使用者研究其執**況或對程式進行修改。我們把這種靜止狀態成為「掛起狀態」。 

(2)父程序的請求。有時父程序希望掛起自己的某個子程序,以便考察和修改子程序,或者協調各子程序間的活動。 

(3)負荷調節的需要。當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的程序掛起,以保證系統能正常執行。 

(4)作業系統的需要。作業系統有時希望掛起某些程序,以便檢查執行中的資源使用情況或進行記賬。 

(5)對換的需要。為了緩和記憶體緊張的情況,將記憶體中處於阻塞狀態的程序換至外存上。

下面再說下程序和執行緒的狀態:

程序:一般大家認為是三種狀態:執行、阻塞、就緒。也有分為五態的(多了建立和退出狀態)

執行緒:一般認為是四種狀態:new thread(not alive)、runnable thread(alive)、blocked thread(alive)、dead thread(not alive)

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

理解二:阻塞(pend)就是任務釋放cpu,其他任務可以執行,一般在等待某種資源或訊號量的時候出現。掛起(suspend)不釋放cpu,如果任務優先順序高就永遠輪不到其他任務執行,一般掛起用於程式除錯中的條件中斷,當出現某個條件的情況下掛起,然後進行單步除錯。

理解三:pend是task主動去等乙個事件,或訊息.suspend是直接懸掛task,以後這個task和你沒任何關係,任何task間的通訊或者同步都和這個suspended task沒任何關係了,除非你resume task;

理解四:任務排程是作業系統來實現的,任務排程時,直接忽略掛起狀態的任務,但是會顧及處於pend下的任務,當pend下的任務等待的資源就緒後,就可以轉為ready了。ready只需要等待cpu時間,當然,任務排程也占用開銷,但是不大,可以忽略。可以這樣理解,只要是掛起狀態,作業系統就不在管理這個任務了。

理解五:掛起是主動的,一般需要用掛起函式進行操作,若沒有resume的動作,則此任務一直不會ready。而阻塞是因為資源被其他任務搶占而處於休眠態。兩者的表現方式都是從就緒態裡「清掉」,即對應標誌位清零,只不過實現方式不一樣。

程序 執行緒 阻塞 掛起

阻塞與掛起 非同步訊息對列讀取 object 類中 wait,notify 與 notifyall 方法可以用來實現執行緒之間的排程,比如在阻塞佇列 blockingqueue 的實現中,如果隊列為空,則所有消費者執行緒進行阻塞 wait 如果某乙個時刻佇列中新新增了乙個元素,則需要喚醒某個或所有阻...

程序的阻塞 喚醒 掛起 啟用

程序控制的一些概念 程序控制是程序管理中最基本的功能。建立 終止 可負責程序執行中的狀態轉換。程序控制一般是由os的核心中的原語來實現的。原語 primitive 是由若干條指令組成的,用於完成一定功能的乙個過程。它與一般過程的區別在於 它們是 原子操作 action operation 即不可分割...

程序的掛起 阻塞和睡眠

要說掛起 阻塞 睡眠難免讓人想到程序生命週期中的阻塞態或者等待狀態,而掛起和睡眠卻沒有出現在程序生命週期中,說明這三個其實在本質上區別並不那麼大,但是既然稱呼不同,應該就有不同的道理。先說阻塞,既然它能出現在程序生命週期,必然是每個程序都會經歷的乙個階段,眾所周知,程序在執行過程中必然要獲取資源,暫...