線程的阻塞與掛起


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

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

另外,有一段話很形象:

     首先這些術語都是對於線程來說的。對線程的控制就好比你控制了一個雇工為你干活。你對雇工的控制是通過編程來實現的。
     掛起線程的意思就是你對主動對雇工說:“你睡覺去吧,用着你的時候我主動去叫你,然后接着干活”。
     使線程睡眠的意思就是你主動對雇工說:“你睡覺去吧,某時某刻過來報到,然后接着干活”。
     線程阻塞的意思就是,你突然發現,你的雇工不知道在什么時候沒經過你允許,自己睡覺呢,但是你不能怪雇工,肯定你         這個雇主沒注意,本來你讓雇工掃地,結果掃帚被偷了或被鄰居家借去了,你又沒讓雇工繼續干別的活,他就只好睡覺了。至於掃帚回來后,雇工會不會知道,會不會繼續干活,你不用擔心,雇工一旦發現掃帚回來了,他就會自己去干活的。因為雇工受過良好的培訓。這個培訓機構就是操作系統。

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

操作系統為什么要引入掛起狀態?掛起狀態涉及到中級調度,因為當內存中的某個程序需要大的內存空間來執行,但這時內存有沒有空余空間了,那么操作系統就回根據調度算法把一些進程放到外存中去,以騰出空間給正在執行的程序的數據和程序,所以引如了掛起狀態。引起掛起狀態的原因有如下幾方面: 

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

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

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

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

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

 

下面再說下進程和線程的狀態:

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

線程:一般認為是四種狀態:New Thread(not alive)、Runnable Thread(alive)、Blocked Thread(alive)、Dead Thread(not alive)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM