1必怜。單進(jìn)程單線程:一個(gè)人在一個(gè)桌子上吃菜。
2蜻展。單進(jìn)程多線程:多個(gè)人在同一個(gè)桌子上一起吃菜虚吟。
3。多進(jìn)程單線程:多個(gè)人每個(gè)人在自己的桌子上吃菜怠肋。
多線程的問題是多個(gè)人同時(shí)吃一道菜的時(shí)候容易發(fā)生爭(zhēng)搶敬鬓,例如兩個(gè)人同時(shí)夾一個(gè)菜,一個(gè)人剛伸出筷子笙各,結(jié)果伸到的時(shí)候已經(jīng)被夾走菜了钉答。。杈抢。此時(shí)就必須等一個(gè)人夾一口之后数尿,在還給另外一個(gè)人夾菜,也就是說資源共享就會(huì)發(fā)生沖突爭(zhēng)搶惶楼。
1右蹦。對(duì)于 Windows 系統(tǒng)來說,【開桌子】的開銷很大歼捐,因此 Windows 鼓勵(lì)大家在一個(gè)桌子上吃菜何陆。因此 Windows 多線程學(xué)習(xí)重點(diǎn)是要大量面對(duì)資源爭(zhēng)搶與同步方面的問題。
2豹储。對(duì)于 Linux 系統(tǒng)來說贷盲,【開桌子】的開銷很小,因此 Linux 鼓勵(lì)大家盡量每個(gè)人都開自己的桌子吃菜剥扣。這帶來新的問題是:坐在兩張不同的桌子上巩剖,說話不方便。因此钠怯,Linux 下的學(xué)習(xí)重點(diǎn)大家要學(xué)習(xí)進(jìn)程間通訊的方法佳魔。
--
補(bǔ)充:有人對(duì)這個(gè)開桌子的開銷很有興趣。我把這個(gè)問題推廣說開一下呻疹。
開桌子的意思是指創(chuàng)建進(jìn)程吃引。開銷這里主要指的是時(shí)間開銷筹陵。
可以做個(gè)實(shí)驗(yàn):創(chuàng)建一個(gè)進(jìn)程,在進(jìn)程中往內(nèi)存寫若干數(shù)據(jù)镊尺,然后讀出該數(shù)據(jù)朦佩,然后退出。此過程重復(fù) 1000 次庐氮,相當(dāng)于創(chuàng)建/銷毀進(jìn)程 1000 次语稠。在我機(jī)器上的測(cè)試結(jié)果是:
UbuntuLinux:耗時(shí) 0.8 秒
Windows7:耗時(shí) 79.8 秒
兩者開銷大約相差一百倍。
這意味著弄砍,在 Windows 中仙畦,進(jìn)程創(chuàng)建的開銷不容忽視。換句話說就是音婶,Windows 編程中不建議你創(chuàng)建進(jìn)程慨畸,如果你的程序架構(gòu)需要大量創(chuàng)建進(jìn)程,那么最好是切換到 Linux 系統(tǒng)衣式。
大量創(chuàng)建進(jìn)程的典型例子有兩個(gè)寸士,一個(gè)是 gnu autotools 工具鏈,用于編譯很多開源代碼的碴卧,他們?cè)?Windows 下編譯速度會(huì)很慢弱卡,因此軟件開發(fā)人員最好是避免使用 Windows。另一個(gè)是服務(wù)器住册,某些服務(wù)器框架依靠大量創(chuàng)建進(jìn)程來干活婶博,甚至是對(duì)每個(gè)用戶請(qǐng)求就創(chuàng)建一個(gè)進(jìn)程,這些服務(wù)器在 Windows 下運(yùn)行的效率就會(huì)很差荧飞。這"可能"也是放眼全世界范圍凡人,Linux? 服務(wù)器遠(yuǎn)遠(yuǎn)多于 Windows 服務(wù)器的原因。
--
再次補(bǔ)充:如果你是寫服務(wù)器端應(yīng)用的垢箕,其實(shí)在現(xiàn)在的網(wǎng)絡(luò)服務(wù)模型下划栓,開桌子的開銷是可以忽略不計(jì)的兑巾,因?yàn)楝F(xiàn)在一般流行的是按照 CPU 核心數(shù)量開進(jìn)程或者線程条获,開完之后在數(shù)量上一直保持,進(jìn)程與線程內(nèi)部使用協(xié)程或者異步通信來處理多個(gè)并發(fā)連接蒋歌,因而開進(jìn)程與開線程的開銷可以忽略了帅掘。
另外一種新的開銷被提上日程:核心切換開銷。
現(xiàn)代的體系堂油,一般 CPU 會(huì)有多個(gè)核心修档,而多個(gè)核心可以同時(shí)運(yùn)行多個(gè)不同的線程或者進(jìn)程。
當(dāng)每個(gè) CPU 核心運(yùn)行一個(gè)進(jìn)程的時(shí)候府框,由于每個(gè)進(jìn)程的資源都獨(dú)立吱窝,所以 CPU 核心之間切換的時(shí)候無需考慮上下文。
當(dāng)每個(gè) CPU 核心運(yùn)行一個(gè)線程的時(shí)候,由于每個(gè)線程需要共享資源院峡,所以這些資源必須從 CPU 的一個(gè)核心被復(fù)制到另外一個(gè)核心兴使,才能繼續(xù)運(yùn)算,這占用了額外的開銷照激。換句話說发魄,在 CPU 為多核的情況下,多線程在性能上不如多進(jìn)程俩垃。
因而励幼,當(dāng)前面向多核的服務(wù)器端編程中,需要習(xí)慣多進(jìn)程而非多線程口柳。