非同步,多線程和並行的區別?


非專業人員,就用非專業的語言解釋下吧,比喻不夠貼切,但大概是那麼個意思,

先聽我講一個故事:

那還是10年前,還沒有12306的年代,大家買票只能去火車站買。

因為大家都要過年回家,都還不想等,火車站只有一個,窗口只有那麼多,頭疼啊。

更頭疼的是,排到窗口的那個人,各種挑剔,不要貴的,不要晚上的,不要站票......跟售票員各種墨跡,後面的人更加著急,一個個義憤填膺,罵爹罵娘。

現在假設整個城市就只有1個火車,1個售票員,每個乘客諮詢售票員後需要思考1分鐘再決定買哪趟車的票。

1.非同步 :

在買票的人諮詢後,需要思考1分鐘,馬上靠邊站,但不用重新排隊,什麼時候想清楚可以立馬去跟售票員去買票。在該人站在旁邊思考的時候,後面的人趕緊上去接著買。這時候隊伍是很快的挪動的,沒有阻塞,售票員的最大化的效率。

2.多線程:

火車站開n個窗口(但還是只有一個人售票),外面同時排n個隊,售票員回答諮詢者問題後,立馬馬上去下個窗口,然後繼續輪換到下個窗口.....哪個窗口的人決定好了,售票員立馬過去買給他。這個時候乘客比較簡單,但萬一那個隊伍有人思考半天糾結,後面的人就悲劇了。

3.並行:

複製n個火車站,同時賣票,買票能力大大增強。大家也可以哪個火車站人少,就去那個買票。

可見:

在只有一個火車站,且只有一個售票員的情況下,賣完一個再賣一個就會導致資源浪費,效率低下,隊伍卡死,很難往前挪動。1,2優化的辦法都解決了隊伍不動,售票率低下的問題。但增加火車站,增加窗口,增加售票員才是好辦法。

========================================================

結論:

1.非同步和多線程其實效率差不多,但是開的窗口不多例如3個,同時有很多人都是去花5分鐘,而不是1分鐘去糾結的時候,多線程效率實際是低於非同步的,因為售票員還是常遇到3個隊伍同時卡在那糾結不能買票的時候。

2. 這2個概念拿來對比也有點不合適,因為他們不是一個概念,多線程的目的還是為了實現非同步,多線程應該是一種實現非同步的手段。非同步應該去跟同步比較才對。

3. 多線程比較簡單,但需要增設窗口,增加成本,且售票員比較累這類似apache下php,和node.js下javascript的關係,一個是多線程,但是是阻塞的,另外一個是單線程非同步非阻塞的。php的方案比較符合常規思維,但比較費內存,node.js非阻塞,用較少的資源就能完成同樣的任務,但編程比較費神。

4.並行,類似同時利用多核cpu的各個核去計算。

並發可分為偽並發、真並發。前者例如單核處理器的並發,後者發是指多核處理器的並發。

5.終極辦法是並行計算,並且每個cpu下進行非同步計算,這樣你的每個核都充分利用。只不過對編程要求太高了太高了,如果不是密集型計算,例如大型有限元計算(多採用並發),或者伺服器同時處理上千的訪問(多採用非同步或者多線程),還是老老實實的用傳統的辦法吧,畢竟常規程序的計算量對現在的硬體來說,問題都不大。


這學期選了偏理論坑爹的Parallel and Multicore Computing, 就試試說說區別。

首先, Asynchronized (非同步)和 Synchronised (同步)是相對應的。

非同步就好像去郵局發信一樣,你希望把信發到A家,你把信交給郵局工作人員就可以回家了,不用等著A收到在回家,這個就是非同步. 同步是,你給A打電話,如果打通了, 你一言我一語的就開始交流,這就是同步。

多線程是你同時給A,B,C...打電話。

並行其實不能簡單的理解為好多個Processor同時干好多的事這麼簡單。或者樓上說的什麼複製n個火車什麼的,那個只是Job distribution的一種,具體到OpenMP是Dynamic的指令。還有諸如Static,guided這主要的兩種。

因為並行演算法的實現和Parallel architecture 密切相關, (原諒我下文用好多英文,真不是裝逼,因為我真不知道怎麼翻譯,用的英文教材),比如OpenMP是在Multiprocessor shared memory machine上運行,如果運行在Cluster上運行,只在一個Node上運行。如果是MPI,則是在Message passing machine上面,如果是在Cluster上面運行,至少分配兩個Node。

更具體些:

OpenMP把一個job分成若干個部分,分給不同的Processor去做,每個Processor又可以多線程去完成任務。

MPI則是Master node, 將一個job分成若干部分,發給其他slave和自己去run。而且涉及到了node 之間的message passing。比如說這個node A 要等著 node B 完成了再開始。

All in all, Parallel computing 和其演算法還是很有意思,有興趣可以看看。

PS. 還有幾天就考並行了。。。。。


說個跑步的例子:

非同步:訓練的時候,運動員在各自的跑道上跑自己的步

多線程:有很多條跑道,運動員看到哪裡有空的跑道就去跑

並行:兩人三足跑步,這兩個人就是並行

補充:

同步:所有跑道只剩一條的時候,運動員在一條跑道上跑完一個到一個

並發:一組運動員一起跑,隔一段時間下一組運動員


推薦閱讀:

對於單核cpu而言,開多線程的目的難倒只能是為了防止阻塞么?
linux:多線程進程比單線程進程的性能要差?
多線程無並發用到共享資源,還需要加鎖嗎?
單線程中加鎖代碼的性能如何?

TAG:非同步 | 並行編程 | 多線程 |