可能學習嵌入式開發(fā)的讀者都聽說過這些專業(yè)名詞,但又多少人理解了? 首先,從定義開始,先看一下教科書上進程和線程定義:進程:資源分配的最小單位。線程:程序執(zhí)行的最小單位。 心中默念,啥啥啥,寫的這是啥。
1
進程
進程是程序執(zhí)行時的一個實例,即它是程序已經(jīng)執(zhí)行到課中程度的數(shù)據(jù)結(jié)構(gòu)的匯集。從內(nèi)核的觀點看,進程的目的就是擔當分配系統(tǒng)資源(CPU時間、內(nèi)存等)的基本單位。 舉例說明進程: 想象一位有一手好廚藝的計算機科學家正在為他的女兒烘制生日蛋糕。他有做生日蛋糕的食譜,廚房里有所需的原料:面粉、雞蛋、糖、香草汁等。在這個比喻中,做蛋糕的食譜就是程序(即用適當形式描述的算法)計算機科學家就是處理器(CPU),而做蛋糕的各種原料就是輸入數(shù)據(jù)。進程就是廚師閱讀食譜、取來各種原料以及烘制蛋糕等一系列動作的總和?,F(xiàn)在假設(shè)計算機科學家的兒子哭著跑了進來,說他的頭被一只蜜蜂蟄了。計算機科學家就記錄下他照著食譜做到哪兒了(保存進程的當前狀態(tài)),然后拿出一本急救手冊,按照其中的指示處理蟄傷。這里,我們看到處理機制是從一個進程(做蛋糕)切換到另一個高優(yōu)先級的進程(實施醫(yī)療救治),每個進程擁有各自的程序(食譜和急救手冊)。當蜜蜂蟄傷處理完之后,這位計算機科學家又回來做蛋糕,從他離開時的那一步繼續(xù)做下去。
2
線程
線程是CPU調(diào)度的最小單位(程序執(zhí)行流的最小單元),它被包含在進程之中,是進程中的實際運作單元。一條線程是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。 一個標準的線程有線程ID、當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單元,線程自己不擁有系統(tǒng)資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤銷另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運行中呈現(xiàn)處間斷性。 線程也有就緒、阻塞和運行三種基本狀態(tài)。就緒狀態(tài)是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機;運行狀態(tài)是指線程占有處理機正在運行;阻塞狀態(tài)是指線程在等待一個事件(如某個信號量),邏輯上不可執(zhí)行。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。 舉例說明線程: 假設(shè),一個文本程序,需要接受鍵盤輸入,將內(nèi)容顯示在屏幕上,還需要保存信息到硬盤中。若只有一個進程,勢必造成同一時間只能干一樣事的尷尬(當保存時,就不能通過鍵盤輸入內(nèi)容)。若有多個進程,每個進程負責一個任務(wù),進程A負責接收鍵盤輸入的任務(wù),進程B負責將內(nèi)容顯示在屏幕上的任務(wù),進程C負責保存內(nèi)容到硬盤中的任務(wù)。這里進程A,B,C間的協(xié)作涉及到了進程通信問題,而且有共同都需要擁有的東西——-文本內(nèi)容,不停的切換造成性能上的損失。若有一種機制,可以使任務(wù)A,B,C共享資源,這樣上下文切換所需要保存和恢復(fù)的內(nèi)容就少了,同時又可以減少通信所帶來的性能損耗,那就好了。這種機制就是線程。 總的來說:進程有獨立的地址空間,線程沒有單獨的地址空間(同一進程內(nèi)的線程共享進程的地址空間)。
3
多線程
進程是程序在計算機上的一次執(zhí)行活動。當你運行一個程序,你就啟動了一個進程。顯然,程序是死的(靜態(tài)的),進程是活的(動態(tài)的)。進程可以分為系統(tǒng)進程和用戶進程。凡是用于完成操作系統(tǒng)的各種功能的進程就是系統(tǒng)進程,它們就是處于運行狀態(tài)下的操作系統(tǒng)本身;所有由用戶啟動的進程都是用戶進程。進程是操作系統(tǒng)進行資源分配的單位。進程又被細化為線程,也就是一個進程下有多個能獨立運行的更小的單位。在同一個時間里,同一個計算機系統(tǒng)中如果允許兩個或兩個以上的進程處于運行狀態(tài),這便是多任務(wù)。現(xiàn)代的操作系統(tǒng)幾乎都是多任務(wù)操作系統(tǒng),能夠同時管理多個進程的運行。多任務(wù)帶來的好處是明顯的,比如你可以邊聽網(wǎng)易云音樂,一邊上網(wǎng),與此同時甚至可以將下載的文檔打印出來,而這些任務(wù)之間絲毫不會相互干擾。那么這里就涉及到并行的問題,俗話說,一心不能二用,這對計算機也一樣,原則上一個CPU只能分配給一個進程,以便運行這個進程。我們通常使用的計算機中只有一個CPU,也就是說只有一顆心,要讓它一心多用,同時運行多個進程,就必須使用并發(fā)技術(shù)。實現(xiàn)并發(fā)技術(shù)相當復(fù)雜,最容易理解的是“時間片輪轉(zhuǎn)進程調(diào)度算法”,它的思想簡單介紹如下:在操作系統(tǒng)的管理下,所有正在運行的進程輪流使用CPU,每個進程允許占用CPU的時間非常短(比如10毫秒),這樣用戶根本感覺不出來 CPU是在輪流為多個進程服務(wù),就好像所有的進程都在不間斷地運行一樣。但實際上在任何一個時間內(nèi)有且僅有一個進程占有CPU。如果一臺計算機有多個CPU,情況就不同了,如果進程數(shù)小于CPU數(shù),則不同的進程可以分配給不同的CPU來運行,這樣,多個進程就是真正同時運行的,這便是并行。 并行處理(Parallel Processing)是計算機系統(tǒng)中能同時執(zhí)行兩個或更多個處理的一種計算方法。并行處理可同時工作于同一程序的不同方面。并行處理的主要目的是節(jié)省大型和復(fù)雜問題的解決時間。并發(fā)處理(concurrency Processing):指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機(CPU)上運行,但任一個時刻點上只有一個程序在處理機(CPU)上運行 并發(fā)的關(guān)鍵是你有處理多個任務(wù)的能力,不一定要同時。并行的關(guān)鍵是你有同時處理多個任務(wù)的能力。所以說,并行是并發(fā)的子集。
4
多線程
線程是程序中一個單一的順序控制流程。進程內(nèi)一個相對獨立的、可調(diào)度的執(zhí)行單元,是系統(tǒng)獨立調(diào)度和分派CPU的基本單元。在單一程序中同時運行多個想成完成不同的工作,稱為多線程。 多線程是為了使得多個線程并行的工作以完成多項任務(wù),以提高系統(tǒng)的效率。線程是在同一時間需要完成多項任務(wù)的時候被實現(xiàn)的。 打個比方: 多進程是立體交通系統(tǒng)(近似于立交橋),雖然造價高,上坡下坡多耗點油,但是不堵車。 多線程是平面交通系統(tǒng),造價低,但紅綠燈太多,老堵車。
5
線程與進程的關(guān)系
(1)一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程; (2)資源分配給進程,同一進程內(nèi)的所有線程共享該進程的所有資源; (3)線程在執(zhí)行過程中需要協(xié)作同步。不同進程中的線程之間要利用消息通信的方法實現(xiàn)同步; (4)處理機分配給線程,即真正在處理機上運行的是線程; (5)線程是進程的一個執(zhí)行單元,也是進程內(nèi)的可調(diào)用實體。
6
線程和進程的區(qū)別
(1)線程共享內(nèi)存空間;進程的內(nèi)存是獨立的; (2)同一個進程的線程之間可以直接交流;兩個進程想通信,必須通過一個中間代理來實現(xiàn); (3)創(chuàng)建新進程很簡單;創(chuàng)建新進程需要對其父進程進行一個克??; (4)一個線程可以控制和操作同一進程里的其他線程;但是進程只能操作子進程; (5)改變注線程(如優(yōu)先權(quán)),可能會影響其他線程;改變父進程,不影響子進程。 (6)調(diào)度:線程作為分配和調(diào)度的基本單位,進程作為擁有資源的基本單位 (7)并發(fā)性:不進進程之間可以并發(fā)執(zhí)行,同一進程內(nèi)的線程也可以并發(fā)執(zhí)行 (8)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統(tǒng)資源,但是可以訪問隸屬于進程的系統(tǒng)資源 (9)系統(tǒng)開銷:在創(chuàng)建和撤銷進程的時候,系統(tǒng)都要分配和回收資源,導(dǎo)致系統(tǒng)的明顯大于創(chuàng)建和撤銷線程時的開銷。但進程有獨立的地址空間,進程崩潰后,在保護模式的下不會對其他進程造成影響,而線程只是進程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有獨立的地址空間,一個線程死后就等于整個進程死掉,所以多進程程序要比多線程程序健壯,但是在進程切換的時候消耗的資源較大,效率差。 根本區(qū)別就一點:用多進程每個進程有自己的地址空間(address space),線程則共享地址空間。 總結(jié):多線程執(zhí)行效率高; 多進程耗資源,安全。
7
進程的優(yōu)缺點
7.1 進程的優(yōu)點
1)順序程序的特點:具有封閉性和可再現(xiàn)性; 2)程序的并發(fā)執(zhí)行和資源共享。多道程序設(shè)計出現(xiàn)后,實現(xiàn)了程序的并發(fā)執(zhí)行和資源共享,提高了系統(tǒng)的效率和系統(tǒng)的資源利用率。
7.2 進程的缺點
操作系統(tǒng)調(diào)度切換多個線程要比切換調(diào)度進程在速度上快的多。而且進程間內(nèi)存無法共享,通訊也比較麻煩。線程之間由于共享進程內(nèi)存空間,所以交換數(shù)據(jù)非常方便;在創(chuàng)建或撤消進程時,由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時的開銷。
8
線程的優(yōu)缺點
8.1 線程的優(yōu)點
1)它是一種非常"節(jié)儉"的多任務(wù)操作方式。在Linux系統(tǒng)下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數(shù)據(jù)表來維護它的代碼 段、堆棧段和數(shù)據(jù)段,這是一種"昂貴"的多任務(wù)工作方式。而運行于一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數(shù)據(jù),啟動一個線程 所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。當然,在具體的系統(tǒng)上,這個數(shù)據(jù)可能 會有較大的區(qū)別; 2)線程間方便的通信機制,由于同一進程下的線程之間共享數(shù)據(jù)空間,所以一個線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便; 3)使多CPU系統(tǒng)更加有效。操作系統(tǒng)會保證當線程數(shù)不大于CPU數(shù)目時,不同的線程運行于不同的CPU上; 4)改善程序結(jié)構(gòu)。一個既長又復(fù)雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和修改。
8.2 線程的缺點
1)調(diào)度時, 要保存線程狀態(tài),頻繁調(diào)度,需要占用大量的機時; 2)程序設(shè)計上容易出錯(線程同步問題)。
9
多線程的優(yōu)缺點
9.1 多線程的優(yōu)點
1)無需跨進程邊界;程序邏輯和控制方式簡單; 2)所有線程可以直接共享內(nèi)存和變量等; 3)線程方式消耗的總資源比進程方式好。
9.2 多線程的缺點
1)每個線程與主程序共用地址空間,受限于2GB地址空間; 2)線程之間的同步和加鎖控制比較麻煩;一個線程的崩潰可能影響到整個程序的穩(wěn)定性; 3)到達一定的線程數(shù)程度后,即使再增加CPU也無法提高性能,例如Windows Server 2003,大約是1500個左右的線程數(shù)就快到極限了(線程堆棧設(shè)定為1M),如果設(shè)定線程堆棧為2M,還達不到1500個線程總數(shù); 4)線程能夠提高的總性能有限,而且線程多了之后,線程本身的調(diào)度也是一個麻煩事兒,需要消耗較多的CPU 。
10
多進程的優(yōu)缺點
10.1 多進程的優(yōu)點
1)每個進程互相獨立,不影響主程序的穩(wěn)定性,子進程崩潰沒關(guān)系; 2)通過增加CPU,就可以容易擴充性能; 3)可以盡量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程運行的模塊算法效率低也沒關(guān)系; 4)每個子進程都有2GB地址空間和相關(guān)資源,總體能夠達到的性能上限非常大。
10.2 多進程的缺點
1)邏輯控制復(fù)雜,需要和主程序交互; 2)需要跨進程邊界,如果有大數(shù)據(jù)量傳送,就不太好,適合小數(shù)據(jù)量傳送、密集運算 多進程調(diào)度開銷比較大。 總結(jié):最好是多進程和多線程結(jié)合,即根據(jù)實際的需要,每個CPU開啟一個子進程,這個子進程開啟多線程可以為若干同類型的數(shù)據(jù)進行處理。當然你也可以利用多線程+CPU+輪詢方式來解決問題……方法和手段是多樣的,關(guān)鍵是自己看起來實現(xiàn)方便有能夠滿足要求,代價也合適。 按照多個不同的維度(類別),來看看多線程和多進程的對比(注:因為是感性的比較,因此都是相對的,不是說一個好得不得了,另外一個差的無法忍受)。
對比類別 | 多進程 | 多線程 | 總結(jié) |
數(shù)據(jù)共享、同步 | 數(shù)據(jù)共享復(fù)雜,需要用IPC;數(shù)據(jù)是分開的,同步簡單 | 因為共享進程數(shù)據(jù),數(shù)據(jù)共享簡單,但也是因為這個原因?qū)е峦綇?fù)雜 | 各有優(yōu)勢 |
內(nèi)存、CPU | 占用內(nèi)存多,切換復(fù)雜,CPU利用率低 | 占用內(nèi)存少,切換簡單,CPU利用率高 | 線程占優(yōu) |
創(chuàng)建銷毀、切換 | 創(chuàng)建銷毀、切換復(fù)雜,速度慢 | 創(chuàng)建銷毀、切換簡單,速度很快 | 線程占優(yōu) |
編程、調(diào)試 | 編程簡單,調(diào)試簡單 | 編程復(fù)雜,調(diào)試復(fù)雜 | 進程占優(yōu) |
可靠性 | 進程間不會互相影響 | 一個線程掛掉將導(dǎo)致整個進程掛掉 | 進程占優(yōu) |
分布式 | 適應(yīng)于多核、多機分布式;如果一臺機器不夠,擴展到多臺機器比較簡單 | 適應(yīng)于多核分布式 | 進程占優(yōu) |
其實沒有絕對的好與壞,只有哪個更加合適的問題。我們來看實際應(yīng)用中究竟如何判斷更加合適。 1)需要頻繁創(chuàng)建銷毀的優(yōu)先用線程 這種原則最常見的應(yīng)用就是Web服務(wù)器了,來一個連接建立一個線程,斷了就銷毀線程,要是用進程,創(chuàng)建和銷毀的代價是很難承受的 2)需要進行大量計算的優(yōu)先使用線程 所謂大量計算,當然就是要耗費很多CPU,切換頻繁了,這種情況下線程是最合適的。這種原則最常見的是圖像處理、算法處理。 3)強相關(guān)的處理用線程,弱相關(guān)的處理用進程 什么叫強相關(guān)、弱相關(guān)?理論上很難定義,給個簡單的例子就明白了。 一般的Server需要完成如下任務(wù):消息收發(fā)、消息處理。“消息收發(fā)”和“消息處理”就是弱相關(guān)的任務(wù),而“消息處理”里面可能又分為“消息解碼”、“業(yè)務(wù)處理”,這兩個任務(wù)相對來說相關(guān)性就要強多了。因此“消息收發(fā)”和“消息處理”可以分進程設(shè)計,“消息解碼”、“業(yè)務(wù)處理”可以分線程設(shè)計。當然這種劃分方式不是一成不變的,也可以根據(jù)實際情況進行調(diào)整。 4)可能要擴展到多機分布的用進程,多核分布的用線程 5)都滿足需求的情況下,用你最熟悉、最拿手的方式 至于“數(shù)據(jù)共享、同步”、“編程、調(diào)試”、“可靠性”這幾個維度的所謂的“復(fù)雜、簡單”應(yīng)該怎么取舍,我只能說:沒有明確的選擇方法。但我可以告訴你一個選擇原則:如果多進程和多線程都能夠滿足要求,那么選擇你最熟悉、最拿手的那個。需要提醒的是:雖然我給了這么多的選擇原則,但實際應(yīng)用中基本上都是“進程+線程”的結(jié)合方式,千萬不要真的陷入一種非此即彼的誤區(qū)。
11
多任務(wù)(多進程)
現(xiàn)代操作系統(tǒng)比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任務(wù)”的操作系統(tǒng)。 什么叫“多任務(wù)”呢?簡單地說,就是操作系統(tǒng)可以同時運行多個任務(wù)。打個比方,你一邊在用瀏覽器上網(wǎng),一邊在聽MP3,一邊在用Word寫論文,這就是多任務(wù),至少同時有3個任務(wù)正在運行。還有很多任務(wù)悄悄地在后臺同時運行著,只是桌面上沒有顯示而已。 現(xiàn)在,多核CPU已經(jīng)非常普及了,但是,即使過去的單核CPU,也可以執(zhí)行多任務(wù)。由于CPU執(zhí)行代碼都是順序執(zhí)行的,那么,單核CPU是怎么執(zhí)行多任務(wù)的呢? 其實操作系統(tǒng)輪流讓各個任務(wù)交替執(zhí)行,任務(wù)1執(zhí)行0.01秒,切換到任務(wù)2,任務(wù)2執(zhí)行0.01秒,再切換到任務(wù)3,執(zhí)行0.01秒……這樣反復(fù)執(zhí)行下去。表面上看,每個任務(wù)都是交替執(zhí)行的,但是,由于CPU的執(zhí)行速度實在是太快了,我們感覺就像所有任務(wù)都在同時執(zhí)行一樣。 真正的并行執(zhí)行多任務(wù)只能在多核CPU上實現(xiàn),但是,由于任務(wù)數(shù)量遠遠多于CPU的核心數(shù)量,所以,操作系統(tǒng)也會自動把很多任務(wù)輪流調(diào)度到每個核心上執(zhí)行。 對于操作系統(tǒng)來說,一個任務(wù)就是一個進程(Process),比如打開一個瀏覽器就是啟動一個瀏覽器進程,打開一個記事本就啟動了一個記事本進程,打開兩個記事本就啟動了兩個記事本進程,打開一個Word就啟動了一個Word進程。 有些進程還不止同時干一件事,比如Word,它可以同時進行打字、拼寫檢查、打印等事情。在一個進程內(nèi)部,要同時干多件事,就需要同時運行多個“子任務(wù)”,我們把進程內(nèi)的這些 “子任務(wù)” 稱為線程(Thread)。 由于每個進程至少要干一件事,所以,一個進程至少有一個線程。當然,像Word這種復(fù)雜的進程可以有多個線程,多個線程可以同時執(zhí)行,多線程的執(zhí)行方式和多進程是一樣的,也是由操作系統(tǒng)在多個線程之間快速切換,讓每個線程都短暫地交替運行,看起來就像同時執(zhí)行一樣。當然,真正地同時執(zhí)行多線程需要多核CPU才可能實現(xiàn)。
責任編輯:lq
-
cpu
+關(guān)注
關(guān)注
68文章
10863瀏覽量
211797 -
多線程
+關(guān)注
關(guān)注
0文章
278瀏覽量
19964 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40132
原文標題:線程、進程、多線程、多進程 和 多任務(wù) 它們有啥關(guān)系
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論