亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

先舉例子來(lái)理解這2個(gè)概念的區(qū)別。

老師讓兩個(gè)同學(xué)去辦公室談話。如果這兩同學(xué)(進(jìn)程)是并列跨過(guò)辦公室門(mén)(CPU)的,那么就是并行。如果同學(xué)A先進(jìn)同學(xué)B后進(jìn)入(或者先B后A),或者兩人并列同時(shí)進(jìn)入,但是在辦公室外的路人甲(用戶)看來(lái),同學(xué)A和同學(xué)B同時(shí)都在辦公室內(nèi),這是并發(fā)。

不懂并行和并發(fā)?一文徹底搞懂并行和并發(fā)的區(qū)別

 

其實(shí)這個(gè)例子不合理,因?yàn)檎嬲牟⑿惺嵌嗪薈PU下的概念,但上面這個(gè)簡(jiǎn)單的例子非常有助于理解。

如果舉例要精確一點(diǎn),那么大概是這樣的:進(jìn)辦公室有兩個(gè)門(mén)(兩CPU),如果兩同學(xué)分別從不同的門(mén)進(jìn)入,不管先后性,兩者互相獨(dú)立,那么是并行;如果兩同學(xué)不管以什么方式進(jìn)入,在路人甲看來(lái),他兩同時(shí)都在辦公室內(nèi),就是并發(fā)。

不懂并行和并發(fā)?一文徹底搞懂并行和并發(fā)的區(qū)別

 

我不信到現(xiàn)在還不理解并發(fā)和并行。

并發(fā)和并行的理論性解釋

為什么操作系統(tǒng)上可以同時(shí)運(yùn)行多個(gè)程序而用戶感覺(jué)不出來(lái)?

這是因?yàn)闊o(wú)論是單CPU還是多CPU,操作系統(tǒng)都營(yíng)造出了可以同時(shí)運(yùn)行多個(gè)程序的假象。實(shí)際的過(guò)程操作系統(tǒng)對(duì)進(jìn)程的調(diào)度以及CPU的快速上下文切換實(shí)現(xiàn)的:每個(gè)進(jìn)程執(zhí)行一會(huì)就先停下來(lái),然后CPU切換到下個(gè)被操作系統(tǒng)調(diào)度到的進(jìn)程上使之運(yùn)行。因?yàn)榍袚Q的很快,使得用戶認(rèn)為操作系統(tǒng)一直在服務(wù)自己的程序。

再來(lái)解釋并發(fā)就容易理解多了。

并發(fā)(concurrent)指的是多個(gè)程序可以同時(shí)運(yùn)行的現(xiàn)象,更細(xì)化的是多進(jìn)程可以同時(shí)運(yùn)行或者多指令可以同時(shí)運(yùn)行。但這不是重點(diǎn),在描述并發(fā)的時(shí)候也不會(huì)去扣這種字眼是否精確,并發(fā)的重點(diǎn)在于它是一種現(xiàn)象。并發(fā)描述的是多進(jìn)程同時(shí)運(yùn)行的現(xiàn)象。但實(shí)際上,對(duì)于單核心CPU來(lái)說(shuō),同一時(shí)刻只能運(yùn)行一個(gè)進(jìn)程。所以,這里的"同時(shí)運(yùn)行"表示的不是真的同一時(shí)刻有多個(gè)進(jìn)程運(yùn)行的現(xiàn)象,這是并行的概念,而是提供一種功能讓用戶看來(lái)多個(gè)程序同時(shí)運(yùn)行起來(lái)了,但實(shí)際上這些程序中的進(jìn)程不是一直霸占CPU的,而是執(zhí)行一會(huì)停一會(huì)。

所以,并發(fā)和并行的區(qū)別就很明顯了。它們雖然都說(shuō)是"多個(gè)進(jìn)程同時(shí)運(yùn)行",但是它們的"同時(shí)"不是一個(gè)概念。并行的"同時(shí)"是同一時(shí)刻可以多個(gè)進(jìn)程在運(yùn)行(處于running),并發(fā)的"同時(shí)"是經(jīng)過(guò)上下文快速切換,使得看上去多個(gè)進(jìn)程同時(shí)都在運(yùn)行的現(xiàn)象,是一種OS欺騙用戶的現(xiàn)象。

實(shí)際上,當(dāng)程序中寫(xiě)下多進(jìn)程或多線程代碼時(shí),這意味著的是并發(fā)而不是并行。并發(fā)是因?yàn)槎噙M(jìn)程/多線程都是需要去完成的任務(wù),不并行是因?yàn)椴⑿信c否由操作系統(tǒng)的調(diào)度器決定,可能會(huì)讓多個(gè)進(jìn)程/線程被調(diào)度到同一個(gè)CPU核心上。只不過(guò)調(diào)度算法會(huì)盡量讓不同進(jìn)程/線程使用不同的CPU核心,所以在實(shí)際使用中幾乎總是會(huì)并行,但卻不能以100%的角度去保證會(huì)并行。也就是說(shuō),并行與否程序員無(wú)法控制,只能讓操作系統(tǒng)決定。

再次注明,并發(fā)是一種現(xiàn)象,之所以能有這種現(xiàn)象的存在,和CPU的多少無(wú)關(guān),而是和進(jìn)程調(diào)度以及上下文切換有關(guān)的。

理解了概念,再來(lái)深入擴(kuò)展下。

 

串行、并行和并發(fā)

任務(wù)描述

如圖:

不懂并行和并發(fā)?一文徹底搞懂并行和并發(fā)的區(qū)別

 

任務(wù)是將左邊的一堆柴全部搬到右邊燒掉,每個(gè)任務(wù)包括三個(gè)過(guò)程:取柴,運(yùn)柴,放柴燒火。

這三個(gè)過(guò)程分別對(duì)應(yīng)一個(gè)函數(shù):

func get { geting }
func carry { carrying }
func unload { unloading }

串行模式

串行表示所有任務(wù)都一一按先后順序進(jìn)行。串行意味著必須先裝完一車(chē)柴才能運(yùn)送這車(chē)柴,只有運(yùn)送到了,才能卸下這車(chē)柴,并且只有完成了這整個(gè)三個(gè)步驟,才能進(jìn)行下一個(gè)步驟。

和稍后所解釋的并行相對(duì)比,串行是一次只能取得一個(gè)任務(wù),并執(zhí)行這個(gè)任務(wù)。

假設(shè)這堆柴需要運(yùn)送4次才能運(yùn)完,那么當(dāng)寫(xiě)下的代碼類(lèi)似于下面這種時(shí),那么就是串行非并發(fā)的模式:

for(i=0;i<4;i++){
    get()
    carry()
    unload()
}

或者,將三個(gè)過(guò)程的代碼全部集中到一個(gè)函數(shù)中也是如此:

func task {
    geting
    carrying
    unloading
}

for(i=0;i<4;i++){
    task()
}

這兩種都是串行的代碼模式。畫(huà)圖描述:

不懂并行和并發(fā)?一文徹底搞懂并行和并發(fā)的區(qū)別

 

并行模式

并行意味著可以同時(shí)取得多個(gè)任務(wù),并同時(shí)去執(zhí)行所取得的這些任務(wù)。并行模式相當(dāng)于將長(zhǎng)長(zhǎng)的一條隊(duì)列,劃分成了多條短隊(duì)列,所以并行縮短了任務(wù)隊(duì)列的長(zhǎng)度。

正如前面所舉的兩同學(xué)進(jìn)辦公室的例子,串行的方式下,必須1個(gè)同學(xué)進(jìn)入后第二個(gè)同學(xué)才進(jìn)入,隊(duì)列長(zhǎng)度為2,而并行方式下可以同時(shí)進(jìn)入,隊(duì)列長(zhǎng)度減半了。

并行的效率從代碼層次上強(qiáng)依賴于多進(jìn)程/多線程代碼,從硬件角度上則依賴于多核CPU。

對(duì)于單進(jìn)程/單線程,由于只有一個(gè)進(jìn)程/線程在執(zhí)行,所以盡管同時(shí)執(zhí)行所取得的多個(gè)任務(wù),但實(shí)際上這個(gè)進(jìn)程/線程是不斷的在多任務(wù)之間切換,一會(huì)執(zhí)行一下這個(gè),一會(huì)執(zhí)行一下那個(gè),就像是一個(gè)人在不同地方之間來(lái)回奔波。所以,單進(jìn)程/線程的并行,效率比串行更低。

對(duì)于多進(jìn)程/多線程,各進(jìn)程/線程都可以執(zhí)行各自所取得的任務(wù),這是真正的并行。

但是,還需要考慮硬件層次上CPU核心數(shù),如果只有單核CPU,那么在硬件角度上這單核CPU一次也只能執(zhí)行一個(gè)任務(wù),上面多進(jìn)程/多線程的并行也并非真正意義上的并行。只有多核CPU,并且多進(jìn)程/多線程并行,才是真正意義上的并行。

如下圖,是多進(jìn)程/多線程(2個(gè)工作者)的并行:

不懂并行和并發(fā)?一文徹底搞懂并行和并發(fā)的區(qū)別

 

并發(fā)

并發(fā)表示多個(gè)任務(wù)同時(shí)都要執(zhí)行的現(xiàn)象,更詳細(xì)的概念前面已經(jīng)說(shuō)面的夠具體了。

其實(shí),很多場(chǎng)景下都會(huì)使用并發(fā)的概念。比如同時(shí)500個(gè)http請(qǐng)求涌向了web服務(wù)器,比如有時(shí)候說(shuō)并發(fā)數(shù)是1000等。

有時(shí)候也將并發(fā)當(dāng)成任務(wù),比如500并發(fā)數(shù)意味著500個(gè)任務(wù),表示的是在一個(gè)特定的時(shí)間段內(nèi)(約定俗成的大家認(rèn)為是1秒)可以完成500個(gè)任務(wù)。這500個(gè)任務(wù)可以是單進(jìn)程/單線程方式處理的,這時(shí)表示的是并發(fā)不并行的模式(coroutine就是典型的并發(fā)不并行),即先執(zhí)行完一個(gè)任務(wù)后才執(zhí)行另一個(gè)任務(wù),也可以是多進(jìn)程/多線程方式處理的,這時(shí)表示的是并發(fā)且并行模式。

要解決大并發(fā)問(wèn)題,通常是將大任務(wù)分解成多個(gè)小任務(wù)。很典型的一個(gè)例子是處理客戶端的請(qǐng)求任務(wù),這個(gè)大任務(wù)里面包含了監(jiān)聽(tīng)并建立客戶端的連接、處理客戶端的請(qǐng)求、響應(yīng)客戶端。但基本上所有這類(lèi)程序,都將這3部分任務(wù)分開(kāi)了:在執(zhí)行任何一個(gè)小任務(wù)的時(shí)候,都可以通過(guò)一些手段使得可以執(zhí)行其它小任務(wù),比如在處理請(qǐng)求的時(shí)候,可以繼續(xù)保持監(jiān)聽(tīng)狀態(tài)。

由于操作系統(tǒng)對(duì)進(jìn)程的調(diào)度是隨機(jī)的,所以切分成多個(gè)小任務(wù)后,可能會(huì)從任一小任務(wù)處執(zhí)行。這可能會(huì)出現(xiàn)一些現(xiàn)象:

  • 可能出現(xiàn)一個(gè)小任務(wù)執(zhí)行了多次,還沒(méi)開(kāi)始下個(gè)任務(wù)的情況。這時(shí)一般會(huì)采用隊(duì)列或類(lèi)似的數(shù)據(jù)結(jié)構(gòu)來(lái)存放各個(gè)小任務(wù)的成果。比如負(fù)責(zé)監(jiān)聽(tīng)的進(jìn)程已經(jīng)執(zhí)行了多次,建立了多個(gè)連接,但是還沒(méi)有調(diào)度到處理請(qǐng)求的進(jìn)程去處理任何一個(gè)請(qǐng)求。
  • 可能出現(xiàn)還沒(méi)準(zhǔn)備好第一步就執(zhí)行第二步的可能。這時(shí),一般采用多路復(fù)用或異步的方式,比如只有準(zhǔn)備好產(chǎn)生了事件通知才執(zhí)行某個(gè)任務(wù)。比如還沒(méi)有和任何一個(gè)客戶端建立連接時(shí),就去執(zhí)行了處理請(qǐng)求的進(jìn)程。
  • 可以多進(jìn)程/多線程的方式并行執(zhí)行這些小任務(wù)。也可以單進(jìn)程/單線程執(zhí)行這些小任務(wù),這時(shí)很可能要配合多路復(fù)用才能達(dá)到較高的效率

看圖非常容易理解:

不懂并行和并發(fā)?一文徹底搞懂并行和并發(fā)的區(qū)別

 

上圖中將一個(gè)任務(wù)中的三個(gè)步驟取柴、運(yùn)柴、卸柴劃分成了獨(dú)立的小任務(wù),有取柴的老鼠,有運(yùn)柴的老鼠,有卸柴燒火的老鼠。

如果上圖中所有的老鼠都是同一只,那么是串行并發(fā)的,如果是不同的多只老鼠,那么是并行并發(fā)的。

總結(jié)

并行和串行:

串行:一次只能取得一個(gè)任務(wù)并執(zhí)行這一個(gè)任務(wù)

并行:可以同時(shí)通過(guò)多進(jìn)程/多線程的方式取得多個(gè)任務(wù),并以多進(jìn)程或多線程的方式同時(shí)執(zhí)行這些任務(wù)

注意點(diǎn):

  • 如果是單進(jìn)程/單線程的并行,那么效率比串行更差
  • 如果只有單核cpu,多進(jìn)程并行并沒(méi)有提高效率
  • 從任務(wù)隊(duì)列上看,由于同時(shí)從隊(duì)列中取得多個(gè)任務(wù)并執(zhí)行,相當(dāng)于將一個(gè)長(zhǎng)任務(wù)隊(duì)列變成了短隊(duì)列

并發(fā):

并發(fā)是一種現(xiàn)象:同時(shí)運(yùn)行多個(gè)程序或多個(gè)任務(wù)需要被處理的現(xiàn)象

這些任務(wù)可能是并行執(zhí)行的,也可能是串行執(zhí)行的,和CPU核心數(shù)無(wú)關(guān),是操作系統(tǒng)進(jìn)程調(diào)度和CPU上下文切換達(dá)到的結(jié)果

解決大并發(fā)的一個(gè)思路是將大任務(wù)分解成多個(gè)小任務(wù):

  • 可能要使用一些數(shù)據(jù)結(jié)構(gòu)來(lái)避免切分成多個(gè)小任務(wù)帶來(lái)的問(wèn)題
  • 可以多進(jìn)程/多線程并行的方式去執(zhí)行這些小任務(wù)達(dá)到高效率
  • 或者以單進(jìn)程/單線程配合多路復(fù)用執(zhí)行這些小任務(wù)來(lái)達(dá)到高效率

分享到:
標(biāo)簽:并發(fā)
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定