一. 在linux下編程多用多進(jìn)程編程少用多線程編程
IBM有個(gè)家伙做了個(gè)測(cè)試,發(fā)現(xiàn)切換線程context的時(shí)候,windows比linux快一倍多。進(jìn)出最快的鎖(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。當(dāng)然這并不是說linux不好,而且在經(jīng)過實(shí)際編程之后,綜合來看我覺得linux更適合做high performance server,不過在多線程這個(gè)具體的領(lǐng)域內(nèi),linux還是稍遜windows一點(diǎn)。這應(yīng)該是情有可原的,畢竟unix家族都是從多進(jìn)程過來的,而 windows從頭就是多線程的。
如果是UNIX/linux環(huán)境,采用多線程沒必要。多線程比多進(jìn)程性能高?誤導(dǎo)!應(yīng)該說,多線程比多進(jìn)程成本低,但性能更低。在UNIX環(huán)境,多進(jìn)程調(diào)度開銷比多線程調(diào)度開銷,沒有顯著區(qū)別,就是說,UNIX進(jìn)程調(diào)度效率是很高的。內(nèi)存消耗方面,二者只差全局?jǐn)?shù)據(jù)區(qū),現(xiàn)在內(nèi)存都很便宜,服務(wù)器內(nèi)存動(dòng)輒若干G,根本不是問題。
多進(jìn)程是立體交通系統(tǒng),雖然造價(jià)高,上坡下坡多耗點(diǎn)油,但是不堵車。多線程是平面交通系統(tǒng),造價(jià)低,但紅綠燈太多,老堵車。就比如我們都開跑車,油(主頻)不是問題,也不怕上坡下坡,但就怕堵車。
高性能交易服務(wù)器中間件,如TUXEDO,都是主張多進(jìn)程的。實(shí)際測(cè)試表明,TUXEDO性能和并發(fā)效率是非常高的。TUXEDO是貝爾實(shí)驗(yàn)室的,與UNIX同宗,應(yīng)該是對(duì)UNIX理解最為深刻的,他們的意見應(yīng)該具有很大的參考意義。
二. 進(jìn)程
1. 進(jìn)程的優(yōu)點(diǎn)
順序程序的特點(diǎn):具有封閉性和可再現(xiàn)性;
程序的并發(fā)執(zhí)行和資源共享。多道程序設(shè)計(jì)出現(xiàn)后,實(shí)現(xiàn)了程序的并發(fā)執(zhí)行和資源共享,提高了系統(tǒng)的效率和系統(tǒng)的資源利用率。
2. 進(jìn)程的缺點(diǎn)
操作系統(tǒng)調(diào)度切換多個(gè)線程要比切換調(diào)度進(jìn)程在速度上快的多。而且進(jìn)程間內(nèi)存無法共享,通訊也比較麻煩。
線程之間由于共享進(jìn)程內(nèi)存空間,所以交換數(shù)據(jù)非常方便;在創(chuàng)建或撤消進(jìn)程時(shí),由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時(shí)的開銷。
三. 線程
1. 線程的優(yōu)點(diǎn)
它是一種非?!惫?jié)儉”的多任務(wù)操作方式。在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(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ū)別;
線程間方便的通信機(jī)制,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便;
使多CPU系統(tǒng)更加有效。操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于CPU數(shù)目時(shí),不同的線程運(yùn)行于不同的CPU上;
2. 線程的缺點(diǎn)
調(diào)度時(shí), 要保存線程狀態(tài),頻繁調(diào)度, 需要占用大量的機(jī)時(shí);
程序設(shè)計(jì)上容易出錯(cuò)(線程同步問題)。
四. 多進(jìn)程
1. 多進(jìn)程優(yōu)點(diǎn)
每個(gè)進(jìn)程互相獨(dú)立,不影響主程序的穩(wěn)定性,子進(jìn)程崩潰沒關(guān)系;
通過增加CPU,就可以容易擴(kuò)充性能;
可以盡量減少線程加鎖/解鎖的影響,極大提高性能,就算是線程運(yùn)行的模塊算法效率低也沒關(guān)系;
每個(gè)子進(jìn)程都有2GB地址空間和相關(guān)資源,總體能夠達(dá)到的性能上限非常大
2. 多進(jìn)程缺點(diǎn)
邏輯控制復(fù)雜,需要和主程序交互;
需要跨進(jìn)程邊界,如果有大數(shù)據(jù)量傳送,就不太好,適合小數(shù)據(jù)量傳送、密集運(yùn)算
多進(jìn)程調(diào)度開銷比較大;
五. 多線程
1. 多線程的優(yōu)點(diǎn)
無需跨進(jìn)程邊界;
程序邏輯和控制方式簡(jiǎn)單;
所有線程可以直接共享內(nèi)存和變量等;
線程方式消耗的總資源比進(jìn)程方式好;
2. 多線程缺點(diǎn)
每個(gè)線程與主程序共用地址空間,受限于2GB地址空間;
線程之間的同步和加鎖控制比較麻煩;
一個(gè)線程的崩潰可能影響到整個(gè)程序的穩(wěn)定性;
到達(dá)一定的線程數(shù)程度后,即使再增加CPU也無法提高性能,例如Windows Server 2003,大約是1500個(gè)左右的線程數(shù)就快到極限了(線程堆棧設(shè)定為1M),如果設(shè)定線程堆棧為2M,還達(dá)不到1500個(gè)線程總數(shù);
線程能夠提高的總性能有限,而且線程多了之后,線程本身的調(diào)度也是一個(gè)麻煩事兒,需要消耗較多的CPU
在開發(fā)中,最好是多進(jìn)程和多線程結(jié)合,即根據(jù)實(shí)際的需要,每個(gè)CPU開啟一個(gè)子進(jìn)程,這個(gè)子進(jìn)程開啟多線程可以為若干同類型的數(shù)據(jù)進(jìn)行處理。當(dāng)然你也可以利用多線程+多CPU+輪詢方式來解決問題。方法和手段是多樣的,關(guān)鍵是自己看起來實(shí)現(xiàn)方便有能夠滿足要求,代價(jià)也合適。
1.《進(jìn)程和線程 一文講解進(jìn)程、線程、多進(jìn)程、多線程的優(yōu)缺點(diǎn)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。
2.《進(jìn)程和線程 一文講解進(jìn)程、線程、多進(jìn)程、多線程的優(yōu)缺點(diǎn)》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/keji/346172.html