當前位置:生活全書館 >

綜合知識

> linux多執行緒和多程序的區別

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

希望我的回答你能理解

  • 文章版權屬於文章作者所有,轉載請註明 https://shqsg.com/zonghezhishi/rng635.html