天天看點

程序、線程、多程序、多線程的優缺點和差別

程序:是并發執行的程式在執行過程中配置設定和管理資源的基本機關,是一個動态概念,競争計算機系統資源的基本機關。

線程:是程序的一個執行單元,是程序内科排程實體。比程序更小的獨立運作的基本機關。線程也被稱為輕量級程序。

一個程式至少一個程序,一個程序至少一個線程。

為什麼會有線程?

  每個程序都有自己的位址空間,即程序空間,在網絡或多使用者換機下,一個伺服器通常需要接收大量不确定數量使用者的并發請求,為每一個請求都建立一個程序顯然行不通(系統開銷大響應使用者請求效率低),是以作業系統中線程概念被引進。

  • 線程的執行過程是線性的,盡管中間會發生中斷或者暫停,但是程序所擁有的資源隻為改線狀執行過程服務,一旦發生線程切換,這些資源需要被保護起來。
  • 程序分為單線程程序和多線程程序,單線程程序宏觀來看也是線性執行過程,微觀上隻有單一的執行過程。多線程程序宏觀是線性的,微觀上多個執行操作。

線程的改變隻代表CPU的執行過程的改變,而沒有發生程序所擁有的資源的變化。 

程序線程的差別:

  • 位址空間:同一程序的線程共享本程序的位址空間,而程序之間則是獨立的位址空間。
  • 資源擁有:同一程序内的線程共享本程序的資源如記憶體、I/O、cpu等,但是程序之間的資源是獨立的。

     一個程序崩潰後,在保護模式下不會對其他程序産生影響,但是一個線程崩潰整個程序都死掉。是以多程序要比多線程健壯。

     程序切換時,消耗的資源大,效率高。是以涉及到頻繁的切換時,使用線程要好于程序。同樣如果要求同時進行并且又要共享某些變量的并發操作,隻能用線程不能用程序

  • 執行過程:每個獨立的程序程有一個程式運作的入口、順序執行序列和程式入口。但是線程不能獨立執行,必須依存在應用程式中,由應用程式提供多個線程執行控制。
  • 線程是處理器排程的基本機關,但是程序不是。
  • 兩者均可并發執行。

優缺點:

  線程執行開銷小,但是不利于資源的管理和保護。線程适合在SMP機器(雙CPU系統)上運作。

  程序執行開銷大,但是能夠很好的進行資源管理和保護。程序可以跨機器前移。

何時使用多程序,何時使用多線程?

對資源的管理和保護要求高,不限制開銷和效率時,使用多程序。

要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多線程。

一. 在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了解最為深刻的,他們的意見應該具有很大的參考意義。

二. 程序

1. 程序的優點

  • 順序程式的特點:具有封閉性和可再現性;
  • 程式的并發執行和資源共享。多道程式設計出現後,實作了程式的并發執行和資源共享,提高了系統的效率和系統的資源使用率。

2. 程序的缺點

  • 作業系統排程切換多個線程要比切換排程程序在速度上快的多。而且程序間記憶體無法共享,通訊也比較麻煩。
  • 線程之間由于共享程序記憶體空間,是以交換資料非常友善;在建立或撤消程序時,由于系統都要為之配置設定和回收資源,導緻系統的開銷明顯大于建立或撤消線程時的開銷。

三. 線程

1. 線程的優點

  • 它是一種非常”節儉”的多任務操作方式。在Linux系統下,啟動一個新的程序必須配置設定給它獨立的位址空間,建立衆多的資料表來維護它的代碼段、堆棧段和資料段,這是一種”昂貴”的多任務工作方式。而運作于一個程序中的多個線程,它們彼此之間使用相同的位址空間,共享大部分資料,啟動一個線程所花費的空間遠遠小于啟動一個程序所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于程序間切換所需要的時間。當然,在具體的系統上,這個資料可能會有較大的差別;
  • 線程間友善的通信機制,由于同一程序下的線程之間共享資料空間,是以一個線程的資料可以直接為其它線程所用,這不僅快捷,而且友善;
  • 使多CPU系統更加有效。作業系統會保證當線程數不大于CPU數目時,不同的線程運作于不同的CPU上;

2. 線程的缺點

  • 排程時, 要儲存線程狀态,頻繁排程, 需要占用大量的機時;
  • 程式設計上容易出錯(線程同步問題)。

四. 多程序

1. 多程序優點

  • 每個程序互相獨立,不影響主程式的穩定性,子程序崩潰沒關系;
  • 通過增加CPU,就可以容易擴充性能;
  • 可以盡量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程運作的子產品算法效率低也沒關系;
  • 每個子程序都有2GB位址空間和相關資源,總體能夠達到的性能上限非常大

2. 多程序缺點

  • 邏輯控制複雜,需要和主程式互動;
  • 需要跨程序邊界,如果有大資料量傳送,就不太好,适合小資料量傳送、密集運算
  • 多程序排程開銷比較大;

五. 多線程

  • 無需跨程序邊界;
  • 程式邏輯和控制方式簡單;
  • 所有線程可以直接共享記憶體和變量等;
  • 線程方式消耗的總資源比程序方式好;
  • 每個線程與主程式共用位址空間,受限于2GB位址空間;
  • 線程之間的同步和加鎖控制比較麻煩;
  • 一個線程的崩潰可能影響到整個程式的穩定性;
  • 到達一定的線程數程度後,即使再增加CPU也無法提高性能,例如Windows Server 2003,大約是1500個左右的線程數就快到極限了(線程堆棧設定為1M),如果設定線程堆棧為2M,還達不到1500個線程總數;
  • 線程能夠提高的總性能有限,而且線程多了之後,線程本身的排程也是一個麻煩事兒,需要消耗較多的CPU

繼續閱讀