天天看點

嵌入式開發中多程序與多線程的選擇

嵌入式開發

中,程序是程式執行時的一個執行個體,即它是程式已經執行到課中程度的資料結構的彙集。從核心的觀點看,程序的目的就是擔當配置設定系統資源(CPU時間、記憶體等)的基本機關。

線程是程序的一個執行流,是CPU排程和分派的基本機關,它是比程序更小的能獨立運作的基本機關。一個程序由幾個線程組成(擁有很多相對獨立的執行流的使用者程式共享應用程式的大部分資料結構),線程與同屬一個程序的其他的線程共享程序所擁有的全部資源。

"程序——資源配置設定的最小機關,線程——程式執行的最小機關"

程序有獨立的位址空間,一個程序崩潰後,在保護模式下不會對其它程序産生影響,而線程隻是一個程序中的不同執行路徑。線程有自己的堆棧和局部變量,但線程沒有單獨的位址空間,一個線程死掉就等于整個程序死掉,是以多程序的程式要比多線程的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,隻能用線程,不能用程序。

總的來說就是:程序有獨立的位址空間,線程沒有單獨的位址空間(同一程序内的線程共享程序的位址空間)。

使用多線程的理由之一是和程序相比,它是一種非常"節儉"的多任務操作方式。我們知道,在Linux系統下,啟動一個新的程序必須配置設定給它獨立的位址空間,建立衆多的資料表來維護它的代碼段、堆棧段和資料段,這是一種"昂貴"的多任務工作方式。而運作于一個程序中的多個線程,它們彼此之間使用相同的位址空間,共享大部分資料,啟動一個線程所花費的空間遠遠小于啟動一個程序所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于程序間切換所需要的時間。據統計,總的說來,一個程序的開銷大約是一個線程開銷的30倍左右,當然,在具體的系統上,這個資料可能會有較大的差別。

使用多線程的理由之二是線程間友善的通信機制。對不同程序來說,它們具有獨立的資料空間,要進行資料的傳遞隻能通過通信的方式進行,這種方式不僅費時,而且很不友善。線程則不然,由于同一程序下的線程之間共享資料空間,是以一個線程的資料可以直接為其它線程所用,這不僅快捷,而且友善。當然,資料的共享也帶來其他一些問題,有的變量不能同時被兩個線程所修改,有的子程式中聲明為static的資料更有可能給多線程程式帶來災難性的打擊,這些正是編寫多線程程式時最需要注意的地方。

除了以上所說的優點外,不和程序比較,多線程程式作為一種多任務、并發的工作方式,當然有以下的優點:

提高應用程式響應。這對圖形界面的程式尤其有意義,當一個操作耗時很長時,整個系統都會等待這個操作,此時程式不會響應鍵盤、滑鼠、菜單的操作,而使用多線程技術,将耗時長的操作(time consuming)置于一個新的線程,可以避免這種尴尬的情況。

使多CPU系統更加有效。作業系統會保證當線程數不大于CPU數目時,不同的線程運作于不同的CPU上。

改善程式結構。一個既長又複雜的程序可以考慮分為多個線程,成為幾個獨立或半獨立的運作部分,這樣的程式會利于了解和修改。

我們按照多個不同的次元,做一個對比标看看多線程和多程序的具體差別:

嵌入式開發中多程序與多線程的選擇.jpg

看起來比較簡單,優勢對比上是“線程 3.5 v 2.5 程序”,我們隻管選線程就是了?

如果有這麼簡單,今天就不用在這裡浪費口舌了,還是那句話,沒有絕對的好與壞,隻有哪個更加合适的問題。

繼續閱讀