0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

進(jìn)程、線程、多進(jìn)程與多線程的優(yōu)缺點(diǎn)

科技綠洲 ? 來(lái)源:Linux開(kāi)發(fā)架構(gòu)之路 ? 作者:Linux開(kāi)發(fā)架構(gòu)之路 ? 2023-11-08 15:18 ? 次閱讀

1、進(jìn)程

進(jìn)程是程序執(zhí)行時(shí)的一個(gè)實(shí)例,即它是程序已經(jīng)執(zhí)行到課中程度的數(shù)據(jù)結(jié)構(gòu)的匯集。從內(nèi)核的觀點(diǎn)看,進(jìn)程的目的就是擔(dān)當(dāng)分配系統(tǒng)資源(CPU時(shí)間、內(nèi)存等)的基本單位。

舉例說(shuō)明進(jìn)程:

想象一位有一手好廚藝的計(jì)算機(jī)科學(xué)家正在為他的女兒烘制生日蛋糕。他有做生日蛋糕的食譜,廚房里有所需的原料:面粉、雞蛋、糖、香草汁等。在這個(gè)比喻中,做蛋糕的食譜就是程序(即用適當(dāng)形式描述的算法)計(jì)算機(jī)科學(xué)家就是處理器(CPU),而做蛋糕的各種原料就是輸入數(shù)據(jù)。進(jìn)程就是廚師閱讀食譜、取來(lái)各種原料以及烘制蛋糕等一系列動(dòng)作的總和。現(xiàn)在假設(shè)計(jì)算機(jī)科學(xué)家的兒子哭著跑了進(jìn)來(lái),說(shuō)他的頭被一只蜜蜂蟄了。計(jì)算機(jī)科學(xué)家就記錄下他照著食譜做到哪兒了(保存進(jìn)程的當(dāng)前狀態(tài)),然后拿出一本急救手冊(cè),按照其中的指示處理蟄傷。這里,我們看到處理機(jī)制是從一個(gè)進(jìn)程(做蛋糕)切換到另一個(gè)高優(yōu)先級(jí)的進(jìn)程(實(shí)施醫(yī)療救治),每個(gè)進(jìn)程擁有各自的程序(食譜和急救手冊(cè))。當(dāng)蜜蜂蟄傷處理完之后,這位計(jì)算機(jī)科學(xué)家又回來(lái)做蛋糕,從他離開(kāi)時(shí)的那一步繼續(xù)做下去。

2、線程

線程是CPU調(diào)度的最小單位(程序執(zhí)行流的最小單元),它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單元。一條線程是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。

一個(gè)標(biāo)準(zhǔn)的線程有線程ID、當(dāng)前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單元,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源。一個(gè)線程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線程,同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運(yùn)行中呈現(xiàn)處間斷性。

線程也有就緒、阻塞和運(yùn)行三種基本狀態(tài)。就緒狀態(tài)是指線程具備運(yùn)行的所有條件,邏輯上可以運(yùn)行,在等待處理機(jī);運(yùn)行狀態(tài)是指線程占有處理機(jī)正在運(yùn)行;阻塞狀態(tài)是指線程在等待一個(gè)事件(如某個(gè)信號(hào)量),邏輯上不可執(zhí)行。每一個(gè)程序都至少有一個(gè)線程,若程序只有一個(gè)線程,那就是程序本身。

舉例說(shuō)明線程:

假設(shè),一個(gè)文本程序,需要接受鍵盤(pán)輸入,將內(nèi)容顯示在屏幕上,還需要保存信息到硬盤(pán)中。若只有一個(gè)進(jìn)程,勢(shì)必造成同一時(shí)間只能干一樣事的尷尬(當(dāng)保存時(shí),就不能通過(guò)鍵盤(pán)輸入內(nèi)容)。若有多個(gè)進(jìn)程,每個(gè)進(jìn)程負(fù)責(zé)一個(gè)任務(wù),進(jìn)程A負(fù)責(zé)接收鍵盤(pán)輸入的任務(wù),進(jìn)程B負(fù)責(zé)將內(nèi)容顯示在屏幕上的任務(wù),進(jìn)程C負(fù)責(zé)保存內(nèi)容到硬盤(pán)中的任務(wù)。這里進(jìn)程A,B,C間的協(xié)作涉及到了進(jìn)程通信問(wèn)題,而且有共同都需要擁有的東西——-文本內(nèi)容,不停的切換造成性能上的損失。若有一種機(jī)制,可以使任務(wù)A,B,C共享資源,這樣上下文切換所需要保存和恢復(fù)的內(nèi)容就少了,同時(shí)又可以減少通信所帶來(lái)的性能損耗,那就好了。這種機(jī)制就是線程。

總的來(lái)說(shuō):進(jìn)程有獨(dú)立的地址空間,線程沒(méi)有單獨(dú)的地址空間(同一進(jìn)程內(nèi)的線程共享進(jìn)程的地址空間)。

3、多進(jìn)程

進(jìn)程是程序在計(jì)算機(jī)上的一次執(zhí)行活動(dòng)。當(dāng)你運(yùn)行一個(gè)程序,你就啟動(dòng)了一個(gè)進(jìn)程。顯然,程序是死的(靜態(tài)的),進(jìn)程是活的(動(dòng)態(tài)的)。進(jìn)程可以分為系統(tǒng)進(jìn)程和用戶進(jìn)程。凡是用于完成操作系統(tǒng)的各種功能的進(jìn)程就是系統(tǒng)進(jìn)程,它們就是處于運(yùn)行狀態(tài)下的操作系統(tǒng)本身;所有由用戶啟動(dòng)的進(jìn)程都是用戶進(jìn)程。進(jìn)程是操作系統(tǒng)進(jìn)行資源分配的單位。進(jìn)程又被細(xì)化為線程,也就是一個(gè)進(jìn)程下有多個(gè)能獨(dú)立運(yùn)行的更小的單位。在同一個(gè)時(shí)間里,同一個(gè)計(jì)算機(jī)系統(tǒng)中如果允許兩個(gè)或兩個(gè)以上的進(jìn)程處于運(yùn)行狀態(tài),這便是多任務(wù)?,F(xiàn)代的操作系統(tǒng)幾乎都是多任務(wù)操作系統(tǒng),能夠同時(shí)管理多個(gè)進(jìn)程的運(yùn)行。

多任務(wù)帶來(lái)的好處是明顯的,比如你可以邊聽(tīng)網(wǎng)易云音樂(lè),一邊上網(wǎng),與此同時(shí)甚至可以將下載的文檔打印出來(lái),而這些任務(wù)之間絲毫不會(huì)相互干擾。那么這里就涉及到并行的問(wèn)題,俗話說(shuō),一心不能二用,這對(duì)計(jì)算機(jī)也一樣,原則上一個(gè)CPU只能分配給一個(gè)進(jìn)程,以便運(yùn)行這個(gè)進(jìn)程。我們通常使用的計(jì)算機(jī)中只有一個(gè)CPU,也就是說(shuō)只有一顆心,要讓它一心多用,同時(shí)運(yùn)行多個(gè)進(jìn)程,就必須使用并發(fā)技術(shù)。實(shí)現(xiàn)并發(fā)技術(shù)相當(dāng)復(fù)雜,最容易理解的是“時(shí)間片輪轉(zhuǎn)進(jìn)程調(diào)度算法”,它的思想簡(jiǎn)單介紹如下:在操作系統(tǒng)的管理下,所有正在運(yùn)行的進(jìn)程輪流使用CPU,每個(gè)進(jìn)程允許占用CPU的時(shí)間非常短(比如10毫秒),這樣用戶根本感覺(jué)不出來(lái) CPU是在輪流為多個(gè)進(jìn)程服務(wù),就好像所有的進(jìn)程都在不間斷地運(yùn)行一樣。但實(shí)際上在任何一個(gè)時(shí)間內(nèi)有且僅有一個(gè)進(jìn)程占有CPU。如果一臺(tái)計(jì)算機(jī)有多個(gè)CPU,情況就不同了,如果進(jìn)程數(shù)小于CPU數(shù),則不同的進(jìn)程可以分配給不同的CPU來(lái)運(yùn)行,這樣,多個(gè)進(jìn)程就是真正同時(shí)運(yùn)行的,這便是并行。

并行處理(Parallel Processing)是計(jì)算機(jī)系統(tǒng)中能同時(shí)執(zhí)行兩個(gè)或更多個(gè)處理的一種計(jì)算方法。并行處理可同時(shí)工作于同一程序的不同方面。并行處理的主要目的是節(jié)省大型和復(fù)雜問(wèn)題的解決時(shí)間。并發(fā)處理(concurrency Processing):指一個(gè)時(shí)間段中有幾個(gè)程序都處于已啟動(dòng)運(yùn)行到運(yùn)行完畢之間,且這幾個(gè)程序都是在同一個(gè)處理機(jī)(CPU)上運(yùn)行,但任一個(gè)時(shí)刻點(diǎn)上只有一個(gè)程序在處理機(jī)(CPU)上運(yùn)行

并發(fā)的關(guān)鍵是你有處理多個(gè)任務(wù)的能力,不一定要同時(shí)。并行的關(guān)鍵是你有同時(shí)處理多個(gè)任務(wù)的能力。所以說(shuō),并行是并發(fā)的子集。

圖片

4、多線程

線程是程序中一個(gè)單一的順序控制流程。進(jìn)程內(nèi)一個(gè)相對(duì)獨(dú)立的、可調(diào)度的執(zhí)行單元,是系統(tǒng)獨(dú)立調(diào)度和分派CPU的基本單元。在單一程序中同時(shí)運(yùn)行多個(gè)想成完成不同的工作,稱為多線程。

多線程是為了使得多個(gè)線程并行的工作以完成多項(xiàng)任務(wù),以提高系統(tǒng)的效率。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候被實(shí)現(xiàn)的。

打個(gè)比方:

多進(jìn)程是立體交通系統(tǒng)(近似于立交橋),雖然造價(jià)高,上坡下坡多耗點(diǎn)油,但是不堵車(chē)。

多線程是平面交通系統(tǒng),造價(jià)低,但紅綠燈太多,老堵車(chē)。

5、線程與進(jìn)程的關(guān)系

(1)一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程;

(2)資源分配給進(jìn)程,同一進(jìn)程內(nèi)的所有線程共享該進(jìn)程的所有資源;

(3)線程在執(zhí)行過(guò)程中需要協(xié)作同步。不同進(jìn)程中的線程之間要利用消息通信的方法實(shí)現(xiàn)同步;

(4)處理機(jī)分配給線程,即真正在處理機(jī)上運(yùn)行的是線程;

(5)線程是進(jìn)程的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)用實(shí)體。

圖片

6、線程與進(jìn)程的區(qū)別

(1)線程共享內(nèi)存空間;進(jìn)程的內(nèi)存是獨(dú)立的;

(2)同一個(gè)進(jìn)程的線程之間可以直接交流;兩個(gè)進(jìn)程想通信,必須通過(guò)一個(gè)中間代理來(lái)實(shí)現(xiàn);

(3)創(chuàng)建新進(jìn)程很簡(jiǎn)單;創(chuàng)建新進(jìn)程需要對(duì)其父進(jìn)程進(jìn)行一個(gè)克??;

(4)一個(gè)線程可以控制和操作同一進(jìn)程里的其他線程;但是進(jìn)程只能操作子進(jìn)程;

(5)改變注線程(如優(yōu)先權(quán)),可能會(huì)影響其他線程;改變父進(jìn)程,不影響子進(jìn)程。

(6)調(diào)度:線程作為分配和調(diào)度的基本單位,進(jìn)程作為擁有資源的基本單位

(7)并發(fā)性:不進(jìn)進(jìn)程之間可以并發(fā)執(zhí)行,同一進(jìn)程內(nèi)的線程也可以并發(fā)執(zhí)行

(8)擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單位,線程不擁有系統(tǒng)資源,但是可以訪問(wèn)隸屬于進(jìn)程的系統(tǒng)資源

(9)系統(tǒng)開(kāi)銷(xiāo):在創(chuàng)建和撤銷(xiāo)進(jìn)程的時(shí)候,系統(tǒng)都要分配和回收資源,導(dǎo)致系統(tǒng)的明顯大于創(chuàng)建和撤銷(xiāo)線程時(shí)的開(kāi)銷(xiāo)。但進(jìn)程有獨(dú)立的地址空間,進(jìn)程崩潰后,在保護(hù)模式的下不會(huì)對(duì)其他進(jìn)程造成影響,而線程只是進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒(méi)有獨(dú)立的地址空間,一個(gè)線程死后就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程程序要比多線程程序健壯,但是在進(jìn)程切換的時(shí)候消耗的資源較大,效率差。

根本區(qū)別就一點(diǎn):用多進(jìn)程每個(gè)進(jìn)程有自己的地址空間(address space),線程則共享地址空間。

總結(jié):多線程執(zhí)行效率高; 多進(jìn)程耗資源,安全。

7、進(jìn)程的優(yōu)點(diǎn)

7.1 進(jìn)程的優(yōu)點(diǎn)

1)順序程序的特點(diǎn):具有封閉性和可再現(xiàn)性;

2)程序的并發(fā)執(zhí)行和資源共享。多道程序設(shè)計(jì)出現(xiàn)后,實(shí)現(xiàn)了程序的并發(fā)執(zhí)行和資源共享,提高了系統(tǒng)的效率和系統(tǒng)的資源利用率。

7.2 進(jìn)程的缺點(diǎn)

操作系統(tǒng)調(diào)度切換多個(gè)線程要比切換調(diào)度進(jìn)程在速度上快的多。而且進(jìn)程間內(nèi)存無(wú)法共享,通訊也比較麻煩。線程之間由于共享進(jìn)程內(nèi)存空間,所以交換數(shù)據(jù)非常方便;在創(chuàng)建或撤消進(jìn)程時(shí),由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開(kāi)銷(xiāo)明顯大于創(chuàng)建或撤消線程時(shí)的開(kāi)銷(xiāo)。

8、線程的優(yōu)缺點(diǎn)

8.1 線程的優(yōu)點(diǎn)

1)它是一種非常"節(jié)儉"的多任務(wù)操作方式。在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來(lái)維護(hù)它的代碼 段、堆棧段和數(shù)據(jù)段,這是一種"昂貴"的多任務(wù)工作方式。而運(yùn)行于一個(gè)進(jìn)程中的多個(gè)線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線程 所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間,而且,線程間彼此切換所需的時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時(shí)間。當(dāng)然,在具體的系統(tǒng)上,這個(gè)數(shù)據(jù)可能 會(huì)有較大的區(qū)別;

2)線程間方便的通信機(jī)制,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便;

3)使多CPU系統(tǒng)更加有效。操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于CPU數(shù)目時(shí),不同的線程運(yùn)行于不同的CPU上;

4)改善程序結(jié)構(gòu)。一個(gè)既長(zhǎng)又復(fù)雜的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序會(huì)利于理解和修改。

8.2 線程的缺點(diǎn)

1)調(diào)度時(shí), 要保存線程狀態(tài),頻繁調(diào)度,需要占用大量的機(jī)時(shí);

2)程序設(shè)計(jì)上容易出錯(cuò)(線程同步問(wèn)題)。

9、多線程的優(yōu)缺點(diǎn)

9.1 多線程的優(yōu)點(diǎn)

1)無(wú)需跨進(jìn)程邊界;程序邏輯和控制方式簡(jiǎn)單;

2)所有線程可以直接共享內(nèi)存和變量等;

3)線程方式消耗的總資源比進(jìn)程方式好。

9.2 多線程的缺點(diǎn)

1)每個(gè)線程與主程序共用地址空間,受限于2GB地址空間;

2)線程之間的同步和加鎖控制比較麻煩;一個(gè)線程的崩潰可能影響到整個(gè)程序的穩(wěn)定性;

3)到達(dá)一定的線程數(shù)程度后,即使再增加CPU也無(wú)法提高性能,例如Windows Server 2003,大約是1500個(gè)左右的線程數(shù)就快到極限了(線程堆棧設(shè)定為1M),如果設(shè)定線程堆棧為2M,還達(dá)不到1500個(gè)線程總數(shù);

4)線程能夠提高的總性能有限,而且線程多了之后,線程本身的調(diào)度也是一個(gè)麻煩事兒,需要消耗較多的CPU 。

10、多進(jìn)程的優(yōu)缺點(diǎn)

10.1 多進(jìn)程的優(yōu)點(diǎn)

1)每個(gè)進(jìn)程互相獨(dú)立,不影響主程序的穩(wěn)定性,子進(jìn)程崩潰沒(méi)關(guān)系;

2)通過(guò)增加CPU,就可以容易擴(kuò)充性能;

3)可以盡量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程運(yùn)行的模塊算法效率低也沒(méi)關(guān)系;

4)每個(gè)子進(jìn)程都有2GB地址空間和相關(guān)資源,總體能夠達(dá)到的性能上限非常大。

10.2 多進(jìn)程的缺點(diǎn)

1)邏輯控制復(fù)雜,需要和主程序交互;

2)需要跨進(jìn)程邊界,如果有大數(shù)據(jù)量傳送,就不太好,適合小數(shù)據(jù)量傳送、密集運(yùn)算 多進(jìn)程調(diào)度開(kāi)銷(xiāo)比較大。

總結(jié):最好是多進(jìn)程和多線程結(jié)合,即根據(jù)實(shí)際的需要,每個(gè)CPU開(kāi)啟一個(gè)子進(jìn)程,這個(gè)子進(jìn)程開(kāi)啟多線程可以為若干同類(lèi)型的數(shù)據(jù)進(jìn)行處理。當(dāng)然你也可以利用多線程+CPU+輪詢方式來(lái)解決問(wèn)題……方法和手段是多樣的,關(guān)鍵是自己看起來(lái)實(shí)現(xiàn)方便有能夠滿足要求,代價(jià)也合適。

按照多個(gè)不同的維度(類(lèi)別),來(lái)看看多線程和多進(jìn)程的對(duì)比(注:因?yàn)槭歉行缘谋容^,因此都是相對(duì)的,不是說(shuō)一個(gè)好得不得了,另外一個(gè)差的無(wú)法忍受)。

圖片

其實(shí)沒(méi)有絕對(duì)的好與壞,只有哪個(gè)更加合適的問(wèn)題。我們來(lái)看實(shí)際應(yīng)用中究竟如何判斷更加合適。

1)需要頻繁創(chuàng)建銷(xiāo)毀的優(yōu)先用線程

這種原則最常見(jiàn)的應(yīng)用就是Web服務(wù)器了,來(lái)一個(gè)連接建立一個(gè)線程,斷了就銷(xiāo)毀線程,要是用進(jìn)程,創(chuàng)建和銷(xiāo)毀的代價(jià)是很難承受的

2)需要進(jìn)行大量計(jì)算的優(yōu)先使用線程

所謂大量計(jì)算,當(dāng)然就是要耗費(fèi)很多CPU,切換頻繁了,這種情況下線程是最合適的。這種原則最常見(jiàn)的是圖像處理、算法處理。

3)強(qiáng)相關(guān)的處理用線程,弱相關(guān)的處理用進(jìn)程

什么叫強(qiáng)相關(guān)、弱相關(guān)?理論上很難定義,給個(gè)簡(jiǎn)單的例子就明白了。

一般的Server需要完成如下任務(wù):消息收發(fā)、消息處理。“消息收發(fā)”和“消息處理”就是弱相關(guān)的任務(wù),而“消息處理”里面可能又分為“消息解碼”、“業(yè)務(wù)處理”,這兩個(gè)任務(wù)相對(duì)來(lái)說(shuō)相關(guān)性就要強(qiáng)多了。因此“消息收發(fā)”和“消息處理”可以分進(jìn)程設(shè)計(jì),“消息解碼”、“業(yè)務(wù)處理”可以分線程設(shè)計(jì)。當(dāng)然這種劃分方式不是一成不變的,也可以根據(jù)實(shí)際情況進(jìn)行調(diào)整。

4)可能要擴(kuò)展到多機(jī)分布的用進(jìn)程,多核分布的用線程

5)都滿足需求的情況下,用你最熟悉、最拿手的方式

至于“數(shù)據(jù)共享、同步”、“編程、調(diào)試”、“可靠性”這幾個(gè)維度的所謂的“復(fù)雜、簡(jiǎn)單”應(yīng)該怎么取舍,我只能說(shuō):沒(méi)有明確的選擇方法。但我可以告訴你一個(gè)選擇原則:如果多進(jìn)程和多線程都能夠滿足要求,那么選擇你最熟悉、最拿手的那個(gè)。需要提醒的是:雖然我給了這么多的選擇原則,但實(shí)際應(yīng)用中基本上都是“進(jìn)程+線程”的結(jié)合方式,千萬(wàn)不要真的陷入一種非此即彼的誤區(qū)。

11、多任務(wù)(多進(jìn)程)

現(xiàn)代操作系統(tǒng)比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任務(wù)”的操作系統(tǒng)。

什么叫“多任務(wù)”呢?簡(jiǎn)單地說(shuō),就是操作系統(tǒng)可以同時(shí)運(yùn)行多個(gè)任務(wù)。打個(gè)比方,你一邊在用瀏覽器上網(wǎng),一邊在聽(tīng)MP3,一邊在用Word寫(xiě)論文,這就是多任務(wù),至少同時(shí)有3個(gè)任務(wù)正在運(yùn)行。還有很多任務(wù)悄悄地在后臺(tái)同時(shí)運(yùn)行著,只是桌面上沒(méi)有顯示而已。

現(xiàn)在,多核CPU已經(jīng)非常普及了,但是,即使過(guò)去的單核CPU,也可以執(zhí)行多任務(wù)。由于CPU執(zhí)行代碼都是順序執(zhí)行的,那么,單核CPU是怎么執(zhí)行多任務(wù)的呢?

其實(shí)操作系統(tǒng)輪流讓各個(gè)任務(wù)交替執(zhí)行,任務(wù)1執(zhí)行0.01秒,切換到任務(wù)2,任務(wù)2執(zhí)行0.01秒,再切換到任務(wù)3,執(zhí)行0.01秒……這樣反復(fù)執(zhí)行下去。表面上看,每個(gè)任務(wù)都是交替執(zhí)行的,但是,由于CPU的執(zhí)行速度實(shí)在是太快了,我們感覺(jué)就像所有任務(wù)都在同時(shí)執(zhí)行一樣。

真正的并行執(zhí)行多任務(wù)只能在多核CPU上實(shí)現(xiàn),但是,由于任務(wù)數(shù)量遠(yuǎn)遠(yuǎn)多于CPU的核心數(shù)量,所以,操作系統(tǒng)也會(huì)自動(dòng)把很多任務(wù)輪流調(diào)度到每個(gè)核心上執(zhí)行。

對(duì)于操作系統(tǒng)來(lái)說(shuō),一個(gè)任務(wù)就是一個(gè)進(jìn)程(Process),比如打開(kāi)一個(gè)瀏覽器就是啟動(dòng)一個(gè)瀏覽器進(jìn)程,打開(kāi)一個(gè)記事本就啟動(dòng)了一個(gè)記事本進(jìn)程,打開(kāi)兩個(gè)記事本就啟動(dòng)了兩個(gè)記事本進(jìn)程,打開(kāi)一個(gè)Word就啟動(dòng)了一個(gè)Word進(jìn)程。

有些進(jìn)程還不止同時(shí)干一件事,比如Word,它可以同時(shí)進(jìn)行打字、拼寫(xiě)檢查、打印等事情。在一個(gè)進(jìn)程內(nèi)部,要同時(shí)干多件事,就需要同時(shí)運(yùn)行多個(gè)“子任務(wù)”,我們把進(jìn)程內(nèi)的這些 “子任務(wù)” 稱為線程(Thread)。

由于每個(gè)進(jìn)程至少要干一件事,所以,一個(gè)進(jìn)程至少有一個(gè)線程。當(dāng)然,像Word這種復(fù)雜的進(jìn)程可以有多個(gè)線程,多個(gè)線程可以同時(shí)執(zhí)行,多線程的執(zhí)行方式和多進(jìn)程是一樣的,也是由操作系統(tǒng)在多個(gè)線程之間快速切換,讓每個(gè)線程都短暫地交替運(yùn)行,看起來(lái)就像同時(shí)執(zhí)行一樣。當(dāng)然,真正地同時(shí)執(zhí)行多線程需要多核CPU才可能實(shí)現(xiàn)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7174

    瀏覽量

    87156
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    275

    瀏覽量

    19850
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    568

    瀏覽量

    40030
  • 多進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    2603
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    進(jìn)程線程區(qū)別

    )。不管是多進(jìn)程還是多線程,最終目標(biāo)都是實(shí)現(xiàn)并行執(zhí)行。 2、多線程的優(yōu)勢(shì)前些年多進(jìn)程多一些,近些年多線程開(kāi)始用得多?,F(xiàn)代操作系統(tǒng)設(shè)計(jì)時(shí)考慮到
    發(fā)表于 11-30 14:06

    多線程多進(jìn)程的區(qū)別

    6.你的數(shù)據(jù)庫(kù)一會(huì)又500個(gè)連接數(shù),一會(huì)有10個(gè),你分析一下情況7.udp和tcp的區(qū)別8.多線程多進(jìn)程的區(qū)別9.有一臺(tái)web服務(wù)器,你選擇用多線程還是多進(jìn)程,...
    發(fā)表于 07-19 07:21

    淺談多進(jìn)程多線程的選擇

    魚(yú)還是熊掌:淺談多進(jìn)程多線程的選擇關(guān)于多進(jìn)程多線程,教科書(shū)上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,
    發(fā)表于 08-24 07:38

    嵌入式的進(jìn)程線程具有哪些優(yōu)缺點(diǎn)

    :①進(jìn)程擁有自己的PID和變量,獨(dú)立的內(nèi)存單元進(jìn)行調(diào)度,執(zhí)行(幾乎)獨(dú)立于父進(jìn)程。②新線程擁有自己獨(dú)立的棧(eg.局部變量),但與創(chuàng)建者共享全局變量、文件描述符、信號(hào)句柄、當(dāng)前目錄狀態(tài)。③獨(dú)立
    發(fā)表于 10-28 09:24

    進(jìn)程有幾種狀態(tài)?

    文章目錄操作系統(tǒng)進(jìn)程線程什么是進(jìn)程?什么是線程?進(jìn)程線程有什么區(qū)別?何時(shí)使用
    發(fā)表于 12-24 07:16

    python多線程多進(jìn)程對(duì)比

    電視邊吃飯邊聊天。這就是我們的 多進(jìn)程 才能做的事了。2. 單線程VS多線程VS多進(jìn)程文字總是蒼白無(wú)力的,不如用代碼直接來(lái)測(cè)試一下。開(kāi)始對(duì)比之前,首先定義四種類(lèi)型的場(chǎng)景 - CPU計(jì)算
    發(fā)表于 03-15 16:42

    LINUX系統(tǒng)下多線程多進(jìn)程性能分析

    采用多進(jìn)程處理多個(gè)任務(wù),會(huì)占用很多系統(tǒng)資源(主要是CPU 和內(nèi)存的使用)。在LINUX 中,則對(duì)這種弊端進(jìn)行了改進(jìn),在用戶態(tài)實(shí)現(xiàn)了多線程處理多任務(wù)。本文系統(tǒng)論述了多線程
    發(fā)表于 08-13 08:31 ?20次下載

    如何選好多線程多進(jìn)程

    關(guān)于多進(jìn)程多線程,教科書(shū)上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類(lèi)似的選擇問(wèn)題,那就沒(méi)有這么簡(jiǎn)單了,選
    的頭像 發(fā)表于 05-11 16:16 ?2887次閱讀
    如何選好<b class='flag-5'>多線程</b>和<b class='flag-5'>多進(jìn)程</b>

    多進(jìn)程多線程的深度比較

    嵌入式Linux中文站,關(guān)于多進(jìn)程多線程,教科書(shū)上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”。這句話應(yīng)付考試基本上夠了,但如果在工作中遇
    發(fā)表于 04-02 14:42 ?427次閱讀

    多進(jìn)程多線程的基本概念

    stack),自己的寄存器環(huán)境(register context),自己的線程本地存儲(chǔ)(thread-local storage)。一個(gè)進(jìn)程可以有很多線程,每條線程并行執(zhí)行不同的任務(wù)
    發(fā)表于 04-02 14:49 ?711次閱讀

    進(jìn)程線程的區(qū)別以及優(yōu)缺點(diǎn)

    執(zhí)行,多核 CPU 可以同一時(shí)間點(diǎn)有多個(gè)進(jìn)程在執(zhí)行。 2、多進(jìn)程、多線程優(yōu)缺點(diǎn) 一個(gè)進(jìn)程進(jìn)程
    的頭像 發(fā)表于 07-21 11:02 ?1219次閱讀

    淺談Linux網(wǎng)絡(luò)編程中的多進(jìn)程多線程

    在Linux網(wǎng)絡(luò)編程中,我們應(yīng)該見(jiàn)過(guò)很多網(wǎng)絡(luò)框架或者server,有多進(jìn)程的處理方式,也有多線程處理方式,孰好孰壞并沒(méi)有可比性,首先選擇多進(jìn)程還是多線程我們需要考慮業(yè)務(wù)場(chǎng)景,其次結(jié)合當(dāng)
    發(fā)表于 08-08 16:56 ?719次閱讀
    淺談Linux網(wǎng)絡(luò)編程中的<b class='flag-5'>多進(jìn)程</b>和<b class='flag-5'>多線程</b>

    關(guān)于Python多進(jìn)程多線程詳解

    進(jìn)程(process)和線程(thread)是操作系統(tǒng)的基本概念,但是它們比較抽象,不容易掌握。關(guān)于多進(jìn)程多線程,教科書(shū)上最經(jīng)典的一句話是“進(jìn)程
    的頭像 發(fā)表于 11-06 14:46 ?687次閱讀
    關(guān)于Python<b class='flag-5'>多進(jìn)程</b>和<b class='flag-5'>多線程</b>詳解

    Linux系統(tǒng)上多線程多進(jìn)程的運(yùn)行效率

    關(guān)于多進(jìn)程多線程,教科書(shū)上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類(lèi)似的選擇問(wèn)題,那就沒(méi)有這么簡(jiǎn)單了,選
    的頭像 發(fā)表于 11-10 10:54 ?1059次閱讀
    Linux系統(tǒng)上<b class='flag-5'>多線程</b>和<b class='flag-5'>多進(jìn)程</b>的運(yùn)行效率

    你還是分不清多進(jìn)程多線程嗎?一文搞懂!

    你還是分不清多進(jìn)程多線程嗎?一文搞懂! 多進(jìn)程多線程是并發(fā)編程中常見(jiàn)的兩個(gè)概念,它們都可以用于提高程序的性能和效率。但是它們的實(shí)現(xiàn)方式和使用場(chǎng)景略有不同。 1.
    的頭像 發(fā)表于 12-19 16:07 ?445次閱讀