<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何向純潔的女朋友解釋并發(fā)與并行的區(qū)別?

          共 2244字,需瀏覽 5分鐘

           ·

          2020-08-19 17:47


          點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。

          現(xiàn)在我們都說(shuō)設(shè)計(jì)可并行、高并發(fā)的程序,而且我們很多時(shí)候會(huì)在潛意識(shí)里覺(jué)得自己對(duì)并行(Parallelism)和并發(fā)(Concurrency)的區(qū)別很清楚,但如果要明確地說(shuō)出二者的區(qū)別,又感覺(jué)沒(méi)辦法給出一個(gè)非常清晰的描述。

          那么什么是并發(fā)?什么又是并行呢?

          并行的概念比較簡(jiǎn)單,并行總是和執(zhí)行(executions)相關(guān),很多東西同時(shí)執(zhí)行就是并行;而并發(fā)則是通過(guò)一些方式組織你的程序,讓它可以分成多個(gè)模塊去獨(dú)立地執(zhí)行。并行必然是需要多核的,一個(gè)處理器是無(wú)法并行的;但并發(fā)和處理器并沒(méi)有什么必然聯(lián)系,在一個(gè)處理器上面,我們的程序也可以是并發(fā)的。

          舉個(gè)簡(jiǎn)單的例子,華羅庚泡茶,必須有燒水、洗杯子、拿茶葉等步驟?,F(xiàn)在我們想盡快做完這件事,也就是“一共要處理很多事情”,有很多方法可以實(shí)現(xiàn)并發(fā),例如請(qǐng)多個(gè)人同時(shí)做,這就是并行。并行是實(shí)現(xiàn)并發(fā)的一種方式,但不是唯一的方式。我們一個(gè)人也可以實(shí)現(xiàn)并發(fā),例如先燒水、然后不用等水燒開(kāi)就去洗杯子,所以通過(guò)調(diào)整程序運(yùn)行方式也可以實(shí)現(xiàn)并發(fā)。

          如果你覺(jué)得以上的講解還是太抽象了,下面通過(guò)一個(gè)小故事來(lái)講解,故事原型來(lái)自 Go 語(yǔ)言創(chuàng)始人之一 Rob Pike 的一篇演講。

          故事的開(kāi)始有一個(gè)需求:有一群地鼠要把一堆廢棄的說(shuō)明書(shū)用小推車推到火爐去燒毀。

          剛開(kāi)始只有一只地鼠,使用一輛推車,將書(shū)裝到車上,運(yùn)輸?shù)交馉t旁,將書(shū)卸到火爐。完成任務(wù)必然需要比較長(zhǎng)的時(shí)間。



          此時(shí)如果再增加一只地鼠,那也沒(méi)什么用,因?yàn)橐恢坏厥笤诟苫睿硪恢坏厥笾荒艿却#ó?dāng)然有人說(shuō)兩只地鼠輪流使用一輛推車,這樣可以讓地鼠得到休息,這樣它們干活更快,也可以提高效率。)



          再找一輛推車來(lái),兩只地鼠分別使用各自的推車,將書(shū)裝到車上,運(yùn)輸?shù)交馉t旁,將書(shū)卸到火爐。這樣會(huì)提高運(yùn)輸效率,但它們會(huì)在裝書(shū)和卸書(shū)時(shí)進(jìn)行排隊(duì),降低了效率。



          這樣雖然比之前快了,但還是有瓶頸的。因?yàn)闀?shū)只有一堆,火爐也只有一個(gè),所以我們還必須通過(guò)消息來(lái)協(xié)調(diào)兩只地鼠的行動(dòng)。好吧,那我們?cè)侔褧?shū)分成兩堆,再增加一個(gè)火爐。



          這樣就比之前的效率高差不多一倍了?,F(xiàn)在這個(gè)模型就是并發(fā)的,因?yàn)閮芍坏厥罂梢元?dú)立完成一件事了,這樣提高了運(yùn)輸效率,而且在裝書(shū)和卸書(shū)時(shí)不會(huì)進(jìn)行排隊(duì),提高了裝卸的效率。但這個(gè)模型不一定是并行的,比如同一時(shí)刻可能只有一只地鼠在干活。

          上面就是第一種并發(fā)模型,我們還可以設(shè)計(jì)更多的并發(fā)模型,繼續(xù)看漫畫(huà)。

          這次找了 3 只地鼠,一只負(fù)責(zé)把書(shū)裝到車上,一只負(fù)責(zé)運(yùn)輸,一只負(fù)責(zé)把書(shū)卸到火爐焚燒。每只地鼠做一個(gè)獨(dú)立的任務(wù),當(dāng)然三只地鼠之間需要使用一些諸如消息通信之類的手段進(jìn)行協(xié)調(diào)。



          裝書(shū)和燒書(shū)的兩只地鼠都很輕松,負(fù)責(zé)運(yùn)輸?shù)倪@只地鼠卻很累,系統(tǒng)出現(xiàn)了瓶頸。那我們?cè)僬乙恢坏厥髞?lái),專門負(fù)責(zé)運(yùn)回空推車。



          我們?cè)谝粋€(gè)已有的設(shè)計(jì)(指三個(gè)地鼠的那個(gè)設(shè)計(jì))中添加一個(gè)并發(fā)的步驟(第四只地鼠)增強(qiáng)了系統(tǒng)的性能。這樣一來(lái),兩只地鼠去搞運(yùn)輸,如果協(xié)調(diào)得好,理論情況下工作效率將是一只地鼠的 4 倍。

          總共有 4 個(gè)并發(fā)的步驟:

          1. 把書(shū)裝到車上;
          2. 把推車運(yùn)到火爐旁;
          3. 把書(shū)卸到火爐里;
          4. 運(yùn)回空推車。

          可以再增加一個(gè)分組,將這個(gè)并發(fā)模型并行化。



          下面我們?cè)賮?lái)看另外一種并發(fā)模型。負(fù)責(zé)運(yùn)輸?shù)牡厥蟊г拐f(shuō)運(yùn)輸路程太長(zhǎng),那我們就增加一個(gè)中轉(zhuǎn)站。



          然后再增加一個(gè)分組,將這個(gè)并發(fā)模型并行化,兩個(gè)分組并行執(zhí)行。



          可以把上面的并發(fā)模型再改進(jìn)一下。增加中轉(zhuǎn)站的同時(shí),再增加兩只地鼠,一只負(fù)責(zé)將從書(shū)堆運(yùn)過(guò)來(lái)的書(shū)卸到中轉(zhuǎn)站,另一只負(fù)責(zé)將書(shū)從中轉(zhuǎn)站裝到推車?yán)铮僮尯竺娴牡厥筮\(yùn)輸?shù)交馉t旁。



          然后再增加一個(gè)分組,將這個(gè)并發(fā)模型并行化。



          畫(huà)到這里就結(jié)束了,總共介紹了三種并發(fā)模型,每種模型都可以很容易地并行化。可以看到上面的并發(fā)模型每改進(jìn)一次,其實(shí)就是將任務(wù)拆的更細(xì)了,一旦分解了問(wèn)題,并發(fā)就自然而然產(chǎn)生了,每個(gè)人只專注于一個(gè)任務(wù)。

          回到程序中,書(shū)就代表著數(shù)據(jù),地鼠就是 CPU,而車可能就是序列化、反序列化、網(wǎng)絡(luò)等設(shè)施,火爐就是代理、瀏覽器或其他的消費(fèi)者。而上面的并發(fā)模型就是一個(gè)可擴(kuò)展的 Web Service。

          參考鏈接

          該演講題目為《Concurrency is not Parallelism》:

          • 演講幻燈片:https://talks.golang.org/2012/waza.slide
          • 演講視頻:https://www.youtube.com/watch?v=cN_DpYBzKso&t=550s


          其他參考鏈接:

          • https://my.oschina.net/3233123/blog/1047239
          • https://blog.csdn.net/claram/article/details/52094587

          良許個(gè)人微信


          添加良許個(gè)人微信即送3套程序員必讀資料


          → 精選技術(shù)資料共享

          → 高手如云交流社群





          本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)里回復(fù)「m」獲?。?/span>

          推薦閱讀:

          如何設(shè)置與查看Linux系統(tǒng)中的環(huán)境變量?

          機(jī)房布線的最高境界 | 最后的暗黑系,真是亮瞎眼

          Linux后臺(tái)開(kāi)發(fā)必看!


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲?。?!


          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  香蕉久久天天 | 台湾午夜成人免费影院在线看 | 婷婷丁香五月天色 | 亚洲黄色在线 | 9无码|