并發的本質:并發并不是并行,尤其在單核處理器中使用多任務的程序構架,任務被交替的執行,表現出的一種現象仿佛是并行執行,實際是在進程間來回切換任務執行,雖然會有一定的開銷,但是交替執行在處理效率和程序結構上還是帶來了很大的好處。
搶占式的內核有它的優勢,但并不是所有的應用場景都必須選擇搶占式的內核,不選擇可搶占式內核的理由:
潘多拉魔盒之并發:
假如你先擇了搶占式內核,那么你在程序設計和調試的問題上,就會像是打開了潘多拉魔盒一樣。每個指令之間都可以互相搶占,由于CPU的資源是被共享的,最顯而易見的共享資源是誰--全局變量啊
所以引入了并發的問題。然而并不是所有的共享資源都這樣的顯而易見,有的也許比你想象的更具有偽裝性,例如:來自于標準庫或者其他源代碼的非可重入代碼。這是搶占式內核最大的問題,為了解決這一問題任務間引入了同步與通信機制來為解決這一問題提供工具。
吾之拙見:此處并發是一種病態,如何發現隱藏的資源共享,是解決并發問題的關鍵。
可搶占式內核的空間開銷:
需要更多的堆??臻g,因為所有的搶占處理都是在堆棧中進行,也就是要消耗更多的RAM。
可搶占式內核的時間開銷:
任務的切換,調度的啟用,更多的臨界區被設定,這些都需要額外的CPU時間開銷。
在程序設計中,開發者容易遇到的由于并發所引入的問題:
競爭條件:何為競爭,就是兩個優先級不同的任務同時對某一資源進行操作時,由于任務的優先級不同,當一個任務在操作到一半的時候,被另一個任務搶占然后操作該資源,最后而得到的一個異常的結果。
死鎖:兩個或兩個以上的進程因其中的每個進程都在等待其他進程做完某些事情而不能繼續執行,這種情形稱為死鎖,舉個栗子,任務A持有小a資源,在運行過程中要申請B任務持有小b的資源,因為得不到而被阻塞,這時候B任務開始運行, 由于需要申請A任務的小a資源因為得不到,而被阻塞,這時候雙方都在等待對方釋放資源而被阻塞,都得不到運行,形成了死鎖。
優先級倒置:這也是因為資源的持有導致的,任務的本質也就是資源管理,當高優先級的任務搶占運行時,由于需要申請低優先級的任務中的資源而被阻塞,這時候,按道理會啟用低優先級的任務進行執行,突然來了一個中優先級的任務,結果低優先級任務被強占,高優先級任務被阻塞,只有中優先級任務被運行。
饑餓:這個最好理解,就是由于優先級任務設置的不合適,高優先級任務長時間霸占CPU,導致低優先級任務無法運行。
不確定性:當系統內核從合作式變為搶占式內核,任務的執行就變得異常復雜,某一時刻發生的一個事件可能會系統任務發生強占,由于事件的發生存在不確定性,所以任務的運行順序也就變得越來越模糊,只能通過運行的結果,任務被切換的順序去分析某個事件在某個時刻的發生是否合理。