首先,從定義開始,先看一下教科書上 進程和線程定義:
進程:資源分配的最小單位。
線程:程序執(zhí)行的最小單位。
心中默念,啥啥啥,寫的這是啥。
1
進程
進程是程序執(zhí)行時的一個實例,即它是程序已經(jīng)執(zhí)行到課中程度的數(shù)據(jù)結(jié)構(gòu)的匯集。從內(nèi)核的觀點看,進程的目的就是擔(dān)當(dāng)分配系統(tǒng)資源(CPU時間、內(nèi)存等)的基本單位。
舉例說明進程:
想象一位有一手好廚藝的計算機科學(xué)家正在為他的女兒烘制生日蛋糕。他有做生日蛋糕的食譜,廚房里有所需的原料:面粉、雞蛋、糖、香草汁等。在這個比喻中,做蛋糕的食譜就是程序(即用適當(dāng)形式描述的算法)計算機科學(xué)家就是處理器(CPU),而做蛋糕的各種原料就是輸入數(shù)據(jù)。進程就是廚師閱讀食譜、取來各種原料以及烘制蛋糕等一系列動作的總和?,F(xiàn)在假設(shè)計算機科學(xué)家的兒子哭著跑了進來,說他的頭被一只蜜蜂蟄了。計算機科學(xué)家就記錄下他照著食譜做到哪兒了(保存進程的當(dāng)前狀態(tài)),然后拿出一本急救手冊,按照其中的指示處理蟄傷。這里,我們看到處理機制是從一個進程(做蛋糕)切換到另一個高優(yōu)先級的進程(實施醫(yī)療救治),每個進程擁有各自的程序(食譜和急救手冊)。當(dāng)蜜蜂蟄傷處理完之后,這位計算機科學(xué)家又回來做蛋糕,從他離開時的那一步繼續(xù)做下去。
2
線程
線程是CPU調(diào)度的最小單位(程序執(zhí)行流的最小單元),它被包含在進程之中,是進程中的實際運作單元。一條線程是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。
一個標準的線程有線程ID、當(dāng)前指令指針(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)容顯示在屏幕上,還需要保存信息到硬盤中。若只有一個進程,勢必造成同一時間只能干一樣事的尷尬(當(dāng)保存時,就不能通過鍵盤輸入內(nèi)容)。若有多個進程,每個進程負責(zé)一個任務(wù),進程A負責(zé)接收鍵盤輸入的任務(wù),進程B負責(zé)將內(nèi)容顯示在屏幕上的任務(wù),進程C負責(zé)保存內(nèi)容到硬盤中的任務(wù)。這里進程A,B,C間的協(xié)作涉及到了進程通信問題,而且有共同都需要擁有的東西——-文本內(nèi)容,不停的切換造成性能上的損失。若有一種機制,可以使任務(wù)A,B,C共享資源,這樣上下文切換所需要保存和恢復(fù)的內(nèi)容就少了,同時又可以減少通信所帶來的性能損耗,那就好了。這種機制就是線程。
總的來說:進程有獨立的地址空間,線程沒有單獨的地址空間(同一進程內(nèi)的線程共享進程的地址空間)。
3
多線程
進程是程序在計算機上的一次執(zhí)行活動。當(dāng)你運行一個程序,你就啟動了一個進程。顯然,程序是死的(靜態(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ù)相當(dāng)復(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ù),啟動一個線程 所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。當(dāng)然,在具體的系統(tǒng)上,這個數(shù)據(jù)可能 會有較大的區(qū)別;
2)線程間方便的通信機制,由于同一進程下的線程之間共享數(shù)據(jù)空間,所以一個線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便;
3)使多CPU系統(tǒng)更加有效。操作系統(tǒng)會保證當(dā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ù)進行處理。當(dāng)然你也可以利用多線程+CPU+輪詢方式來解決問題……方法和手段是多樣的,關(guān)鍵是自己看起來實現(xiàn)方便有能夠滿足要求,代價也合適。
按照多個不同的維度(類別),來看看多線程和多進程的對比(注:因為是感性的比較,因此都是相對的,不是說一個好得不得了,另外一個差的無法忍受)。
其實沒有絕對的好與壞,只有哪個更加合適的問題。我們來看實際應(yīng)用中究竟如何判斷更加合適。
1)需要頻繁創(chuàng)建銷毀的優(yōu)先用線程
這種原則最常見的應(yīng)用就是Web服務(wù)器了,來一個連接建立一個線程,斷了就銷毀線程,要是用進程,創(chuàng)建和銷毀的代價是很難承受的
2)需要進行大量計算的優(yōu)先使用線程
所謂大量計算,當(dāng)然就是要耗費很多CPU,切換頻繁了,這種情況下線程是最合適的。這種原則最常見的是圖像處理、算法處理。
3)強相關(guān)的處理用線程,弱相關(guān)的處理用進程
什么叫強相關(guān)、弱相關(guān)?理論上很難定義,給個簡單的例子就明白了。
一般的Server需要完成如下任務(wù):消息收發(fā)、消息處理?!跋⑹瞻l(fā)”和“消息處理”就是弱相關(guān)的任務(wù),而“消息處理”里面可能又分為“消息解碼”、“業(yè)務(wù)處理”,這兩個任務(wù)相對來說相關(guān)性就要強多了。因此“消息收發(fā)”和“消息處理”可以分進程設(shè)計,“消息解碼”、“業(yè)務(wù)處理”可以分線程設(shè)計。當(dāng)然這種劃分方式不是一成不變的,也可以根據(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)。
由于每個進程至少要干一件事,所以,一個進程至少有一個線程。當(dāng)然,像Word這種復(fù)雜的進程可以有多個線程,多個線程可以同時執(zhí)行,多線程的執(zhí)行方式和多進程是一樣的,也是由操作系統(tǒng)在多個線程之間快速切換,讓每個線程都短暫地交替運行,看起來就像同時執(zhí)行一樣。當(dāng)然,真正地同時執(zhí)行多線程需要多核CPU才可能實現(xiàn)。
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19100瀏覽量
228813 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
590瀏覽量
27315 -
多線程
+關(guān)注
關(guān)注
0文章
277瀏覽量
19897
原文標題:線程、進程、多線程、多進程和多任務(wù)之間的關(guān)系?
文章出處:【微信號:單片機與嵌入式,微信公眾號:單片機與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論