- 理解一:掛起是一種主動行為,因此恢復也應該要主動完成,而阻塞則是一種被動行為,是在等待事件或資源時任務的表現,你不知道他什么時候被阻塞(pend),也就不能確切 的知道他什么時候恢復阻塞。而且掛起隊列在操作系統里可以看成一個,而阻塞隊列則是不同的事件或資源(如信號量)就有自己的隊列。
- 理解二:阻塞(pend)就是任務釋放CPU,其他任務可以運行,一般在等待某種資源或信號量的時候出現。掛起(suspend)不釋放CPU,如果任務優先級高就永遠輪不到其他任務運行,一般掛起用於程序調試中的條件中斷,當出現某個條件的情況下掛起,然后進行單步調試。
- 理解三:pend是task主動去等一個事件,或消息.suspend是直接懸掛task,以后這個task和你沒任何關系,任何task間的通信或者同步都和這個suspended task沒任何關系了,除非你resume task;
- 理解四:任務調度是操作系統來實現的,任務調度時,直接忽略掛起狀態的任務,但是會顧及處於pend下的任務,當pend下的任務等待的資源就緒后,就可以轉為ready了。ready只需要等待CPU時間,當然,任務調度也占用開銷,但是不大,可以忽略。可以這樣理解,只要是掛起狀態,操作系統就不在管理這個任務了。
- 理解五:掛起是主動的,一般需要用掛起函數進行操作,若沒有resume的動作,則此任務一直不會ready。而阻塞是因為資源被其他任務搶占而處於休眠態。兩者的表現方式都是從就緒態里“清掉”,即對應標志位清零,只不過實現方式不一樣。
操作系統中睡眠、阻塞、掛起的區別形象解釋:
首先這些術語都是對於線程來說的。對線程的控制就好比你控制了一個雇工為你干活。你對雇工的控制是通過編程來實現的。
掛起線程的意思就是你對主動對雇工說:“你睡覺去吧,用着你的時候我主動去叫你,然后接着干活”。
使線程睡眠的意思就是你主動對雇工說:“你睡覺去吧,某時某刻過來報到,然后接着干活”。
線程阻塞的意思就是,你突然發現,你的雇工不知道在什么時候沒經過你允許,自己睡覺呢,但是你不能怪雇工,肯定你 這個雇主沒注意,本來你讓雇工掃地,結果掃帚被偷了或被鄰居家借去了,你又沒讓雇工繼續干別的活,他就只好睡覺了。至於掃帚回來后,雇工會不會知道,會不會繼續干活,你不用擔心,雇工一旦發現掃帚回來了,他就會自己去干活的。因為雇工受過良好的培訓。這個培訓機構就是操作系統。
