linux多線程和多進程的區別

linux多線程和多進程的區別

1.區別:

2.1、多進程中數據共享複雜、同步簡單,而多線程中數據共享簡單、同步複雜;

3.2、多進程佔用內存多、切換複雜、速度慢、CPU利用率低,而多線程佔用內存少、切換簡單、CPU利用率高;

4.3、多進程的編程簡單、調試簡單,而多線程的編程複雜、調試複雜。

小編還爲您整理了以下內容,可能對您也有幫助:

Linux下多線程和多進程程序的優缺點,各個適合什麼樣的業務場景

多進程比較安全,因爲默認情況下不同進程之間的內存是的(如果需要共享內存則需要進行進程間通信)。而多線程下,內存是共享的,這時就比較危險了,你要自己使用鎖、信號量等機制來解決內存塊的同時讀寫和同步等等。如果兩個功能沒有數據需要共享,或只有前後遞進關係,建議使用多進程。如果兩個功能需要同時對一塊數據進行處理(例如需要對資源進行創建和老化刪除),則需要使用多線程,這時可能需要使用鎖等機制來控制線程衝突。

什麼是進程?和線程區別?

1、本質不同

進程是資源的分配和調度的一個單元,而線程是CPU調度的基本單元。

2、數量不同

同一個進程中可以包括多個線程,並且線程共享整個進程的資源(寄存器、堆棧、上下文),一個進行至少包括一個線程。

3、過程不同

進程的創建調用fork或者vfork,而線程的創建調用pthread_create,進程結束後它擁有的所有線程都將銷燬,而線程的結束不會影響同個進程中的其他線程的結束。

4、屬性不同

線程有自己的私有屬性TCB,線程id,寄存器、硬件上下文,而進程也有自己的私有屬性進程控制塊PCB,這些私有屬性是不被共享的,用來標示一個進程或一個線程的標誌。

1、功能不同

進程是計算機中的程序關於某數據集合上的一次執行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。

線程是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。

2、工作原理不同

在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。

線程是調度和分派的基本單位。線程可以爲操作系統內核調度的內核線程,如Win32線程;由用戶進程自行調度的用戶線程,如Linux平臺的POSIX Thread;或者由內核與用戶進程,如Windows 7的線程,進行混合調度。

3、作用不同

進程是操作系統中最基本、重要的概念。是多道程序系統出現後,爲了刻畫系統內部出現的動態情況,描述系統內部各道程序的活動規律引進的一個概念,所有多道程序設計操作系統都建立在進程的基礎上。

通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源。在引入線程的操作系統中,通常都是把進程作爲分配資源的基本單位,而把線程作爲執行和調度的基本單位。

進程的特徵:

1、動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的。

2、併發性:任何進程都可以同其他進程一起併發執行

3、性:進程是一個能執行的基本單位,同時也是系統分配資源和調度的單位;

4、異步性:由於進程間的相互制約,使進程具有執行的間斷性,即進程按各自的、不可預知的速度向前推進

5、結構特徵:進程由程序、數據和進程控制塊三部分組成。

多個不同的進程可以包含相同的程序:一個程序在不同的數據集裏就構成不同的進程,能得到不同的結果;但是執行過程中,程序不能發生改變。

linux中多進程程序和多線程程序的區別

IBM有個傢伙做了個測試,發現切換線程context的時候,windows比linux快一倍多。進出最快的鎖(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。當然這並不是說linux不好,而且在經過實際編程之後,綜合來看我覺得linux更適合做high performance server,不過在多線程這個具體的領域內,linux還是稍遜windows一點。這應該是情有可原的,畢竟unix家族都是從多進程過來的,而 windows從頭就是多線程的。

如果是UNIX/linux環境,採用多線程沒必要。

多線程比多進程性能高?誤導!

應該說,多線程比多進程成本低,但性能更低。

在UNIX環境,多進程調度開銷比多線程調度開銷,沒有顯著區別,就是說,UNIX進程調度效率是很高的。內存消耗方面,二者只差全局數據區,現在內存都很便宜,服務器內存動輒若干G,根本不是問題。

多進程是立體交通系統,雖然造價高,上坡下坡多耗點油,但是不堵車。

多線程是平面交通系統,造價低,但紅綠燈太多,老堵車。

我們現在都開跑車,油(主頻)有的是,不怕上坡下坡,就怕堵車。

高性能交易服務器中間件,如TUXEDO,都是主張多進程的。實際測試表明,TUXEDO性能和併發效率是非常高的。TUXEDO是貝爾實驗室的,與UNIX同宗,應該是對UNIX理解最爲深刻的,他們的意見應該具有很大的參考意義。

多線程的優點:

無需跨進程邊界;

程序邏輯和控制方式簡單;

所有線程可以直接共享內存和變量等;

線程方式消耗的總資源比進程方式好;

多線程缺點:

每個線程與主程序共用地址空間,受限於2GB地址空間;

線程之間的同步和加鎖控制比較麻煩;

一個線程的崩潰可能影響到整個程序的穩定性;

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

線程能夠提高的總性能有限,而且線程多了之後,線程本身的調度也是一個麻煩事兒,需要消耗較多的CPU

多進程優點:

每個進程互相,不影響主程序的穩定性,子進程崩潰沒關係;

透過增加CPU,就可以容易擴充性能;

可以儘量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程執行的模組算法效率低也沒關係;

每個子進程都有2GB地址空間和相關資源,總體能夠達到的性能上限非常大

多線程缺點:

邏輯控制複雜,需要和主程序交互;

需要跨進程邊界,如果有大數據量傳送,就不太好,適合小數據量傳送、密集運算

多進程調度開銷比較大;

最好是多進程和多線程結合,即根據實際的需要,每個CPU開啓一個子進程,這個子進程開啓多線程可以爲若干同類型的數據進行處理。當然你也可以利用多線程+多CPU+輪詢方式來解決問題……

方法和手段是多樣的,關鍵是自己看起來實現方便有能夠滿足要求,代價也合適。

麻煩解釋一下linux下進程和線程有什麼區別和聯繫,linux下多線程和多進程通信的實現方法,請通俗解釋

兄弟看到你這麼高的分我就找了些資料:也算是對昨天學的知識總結一下吧

一、先說概念不管是windows還是linux下的進程和線程概念都是一樣的,只是管理進程和線程的方式不一樣,這個是前提,到時候你可別問我windows下進程和線程啊。這個涉及到操作系統原理。下面給你解答。

說道進程不得不提作業這個名詞 ,我想兄弟你電腦裏不會有一個程序吧對不?當你的系統啓動完畢後你看看你的任務管理器裏是不是有很多進程呢?那麼多程序是怎麼調如內存呢?能理解嗎?這裏要明白程序和進程的關係,程序是你磁盤上的一個檔案,當你需要它時進入內存後才成爲進程,好比QQ在磁盤上就是一個檔案而已,只有進入了內存才成爲進程,進程是活動的。QQ要掃描你檔案啊,記錄你聊天記錄啊,偷偷上傳個啥東西什麼的你也不知道對不,他是活動的。這個能明白嗎?

再看作業,這個作業可不是你寫作業的那個作業啊。系統一看好傢伙你個QQ那麼大的傢伙你想一下子進入內存啊?沒門!慢慢來嘛,系統就把QQ程序分爲好幾塊,這幾塊不能亂分的,要符合自然結構就是循環啦選擇啦這樣的結構,你把人家循環結構咔嚓截斷了,怎麼讓人家QQ執行啊?這就是作業要一塊一塊的進入內存,同時要爲作業產生JCB(JOB CONTROL BLOCK)作業控制塊,你進入內存不能亂跑啊,要聽系統的話,你要是進入系統自己的內存。框一下,內存不能讀寫 對話框就出來了,嚴重點直接藍臉給你!你懂得。這是window下的,linux下直接給你報錯!沒事了就!所一系統透過jcb控制進程。JCB包含了進程號優先級好多內容,你開啟你的windows任務管理器看看進程是不是有好多屬性啊?那就是PCB(PRCESS,CONTROL BLOCK)同理作業也包含那些內容只是多少而已。下面寫出進程特點:

1、進程是分配計算機資源最小的單位。你想啊人是要用程序幹活的吧?你把程序調入內存成了就成了進程,所以說進程是分配資源的最小單位。你在linux下開啟終端輸入top命令看是不是有好多進程?

2、進程有操作系統爲作業產生。有“父進程”產生“子進程”之間是父子關係,並可以繼續向下產生“子進程”。還拿QQ來說,你雙擊QQ.exe。QQ啓動了輸入賬號密碼開啟主介面了。這時候你要聊天,QQ進程趕緊產生個“兒子”說 “兒子你去陪主人聊天去吧。這樣子進程產生了。突然你想看美女要傳照片這時候那個”兒子“有”生“了一個”兒子“說”兒子“你去傳照片。那個“兒子領到任務去傳照片了。這時你想關了QQ,QQ提示你說”你還有個“兒子”和“孫子”還在幹活呢你真要結束嗎?你蒽了確定。QQ對他“兒子”(你聊天視窗)說:”兒子啊對不起了,主人要關閉我你也不能活啊“咔嚓一下”兒子“死了,兒子死之前對他兒子說:“兒子啊你爺爺不讓我活了,你也別活了咔嚓孫子也死了。最後世界安靜了。這就是進程的父子關係。能明白嗎?記住:進程之活動在內存中。不能使用CPU,只管分配資源。

再說線程:線程也產生在內存中並且在內存中存在相當長的時間,但它的活動區域主要在CPU中,並且執行和滅亡都存在於CPU中,可以這麼說,線程是程序中能被系統調度進入CPU中最小程序單位,它能直接使用進程分配的CPU的資源。

還拿QQ來說當你要傳檔案時QQ總要判斷一下檔案的副檔名吧,ok這時那個”兒子“趕緊對它爸爸說我需要一個線程判斷副檔名QQ趕緊對一個管這個的線程說:”快點去CPU裏計算下那個副檔名是什麼然後向主人報告計算完了就“死了”消亡了,但是它的線程還在內存中!還等着你下一次傳檔案然後計算然後消亡!

線程之間是相互的。一個在CPU,一個在內存裏還能有關係嗎對不?CPU在每一個瞬間只能進入一個線程,當線程進入CPU時立即產生一個新的線程,新線程仍停留在內存中,就好比上面那個傳檔案還會等着你再傳檔案再計算副檔名。

線程相對線程是的,但它在內存中並不是的,這就好比你不開QQ能用QQ傳輸檔案嗎?它只存在與進程分配的資源中,也就是說計算副檔名這個線程只能停留在QQ這個進程中,不能跑到別的進程裏!!相當於程序產生了新的進程和線程,進程向CPU申請資源,再有線程來使用,他們都是爲程序服務的只是分工不同!

因爲你沒提問linux下是怎麼管理進程和線程的所以我就不回答了,這個問題我建議你還是看看《笨兔兔的故事》裏面講到了linux是怎麼管理進程和線程的。挺幽默的比我說得還好。

你第二個問題說實話我回答不了你!我想你現在連進程和線程還沒理解第二個你更理解不了了你說對不?我猜的其實你用C/C++不管是在windows下編程還是在Linux下編程思想都是一樣的對吧,如果你理解了在windows下線程間通信,在linux更沒問題了!

參考資料:黑客手冊2009合訂本非安全第一二季244頁,245頁,328頁,329頁,398頁,399頁

淺談操作系統原理 (一 二三)

ubuntu中文論壇 笨兔兔的故事

http://forum.ubuntu.org.cn/viewtopic.php?f=120&t=267518

希望我的回答你能理解