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

2021-10-16 13:37:53 字數 760 閱讀 1918

關於各種任務狀態的實質:

1.掛起:將任務掛起的實質就是1)將當前任務控制塊的狀態標誌改為掛起狀態2)將任務就緒表中的對應位置0

3)如果是事件型別,則還會將任務加入到當前的事件等待任務列表中(和就緒表一樣的點陣圖)。

4)執行任務排程,讓出cpu使用權。這裡需要注意的是,任務掛起後任務不是處於占用cpu的狀態,不占用cpu資源。以ucos處理為例,如果掛起的是自身任務,比如ostasksuspend()掛起自身,那麼ucos會執行一次任務排程,因為自身就緒表位置被取消,所以無論何時cpu都不會分配給自身掛起的任務,直到自身任務變為就緒態,任務排程才可能輪到自己。這個在ucos實現掛起的介面osmboxpend(),osqpend(),ossempend(),ostasksuspend(),ostimedly()原始碼都能體現,掛起自身的任務必然會伴隨著下面的任務排程,讓出已阻塞的任務,而osqpend()因可以掛起其他任務,因此當掛起其他任務時不需任務排程。//不要以為阻塞狀態下任務還會占用cpu,這個概念無論ucos還是linux是一致的

這裡我們也體會到了阻塞和死迴圈的的區別了:阻塞只在多工作業系統下能體現,阻塞狀態的任務是不會占用cpu的,而死迴圈這種類似while(1)或者while(條件)&&條件一直不滿足的下至少在任務排程之前是一直占有cpu,cpu的佔用率達到100%。(時間片輪轉比如linux還好些等待排程其他任務還能執行些時間,ucos這種基於優先順序的如果當前任務又是最高端就完全在這個任務上了)

2.就緒:將任務改為就緒狀態的實質就是將對應任務就緒表對應位置1並將任務控制塊狀態標誌改為就緒狀態。

阻塞和掛起的區別

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

程序的阻塞和掛起的區別

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

程序的阻塞和掛起的區別

作業系統中睡眠 阻塞 掛起的區別形象解釋 首先這些術語都是對於執行緒來說的。對執行緒的控制就好比你控制了乙個雇工為你幹活。你對雇工的控制是通過程式設計來實現的。掛起執行緒的意思就是你對主動對雇工說 你睡覺去吧,用著你的時候我主動去叫你,然後接著幹活 使執行緒睡眠的意思就是你主動對雇工說 你睡覺去吧,...