天天看點

并行與并發的差別

轉載自:https://www.cnblogs.com/goloving/p/9391074.html

很多人不是特别明白并發程式設計和并行程式設計的差別所在,有很多人很容易搞混淆,覺得二者近似相等,本文将用幾個淺顯易懂的例子,來說明一下什麼是并發和并行。

1、任務與多任務

       關于什麼是程序,什麼是線程,這裡不打算多說,關于每一種開發語言的多線程處理技術文法上有所差別,原理很多類似,可以查閱相關的參考書。什麼是任務呢?其實很簡單,在我們生活中,比如我今天要學一首歌,要在操場上散步1000米,然後還要向老師電話彙報研究成果,這是今天的三個任務。在程式設計語言中,實作某一個任務的一般單元就是“函數”。

2、順序執行

      上面三個任務,如果在一般的單線程執行的程式裡面,分别定義三個函數,然後依次順序執行,即執行完第一個在執行第二個,然後執行第三個,即我先把一首歌學會,然後在操場上散步1000米,然後再給老師彙報,這樣做效率低下。

  我們可以有一個更加高效的辦事方法,我在散步的時候,順便打電話給老說彙報一下今天的成果,然後邊散步邊聽歌,便跟着學,這樣效果就高很多,這裡的是“并行執行”。

3、并發和并行的一些了解——concurrency  and  parallellism

      并發和并行都是完成多任務更加有效率的方式,但還是有一些差別的,并發(concurrency),并行(parallellism),可見他們的确是有差別的。下面通過一些具體的例子進行說明。

  例子一:

  假設一個有三個學生需要輔導作業,幫每個學生輔導完作業是一個任務

  順序執行:老師甲先幫學生A輔導,輔導完之後再取給B輔導,最後再去給C輔導,效率低下 ,很久才完成三個任務

  并發:老師甲先給學生A去講思路,A聽懂了自己書寫過程并且檢查,而甲老師在這期間直接去給B講思路,講完思路再去給C講思路,讓B自己整理步驟。這樣老師就沒有空着,一直在做事情,很快就完成了三個任務。與順序執行不同的是,順序執行,老師講完思路之後學生在寫步驟,這在這期間,老師是完全空着的,沒做事的,是以效率低下。

  并行:直接讓三個老師甲、乙、丙三個老師“同時”給三個學生輔導作業,也完成的很快。

  例子二:

  順序執行:你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援并發也不支援并行。

  并發:你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支援并發。

  并行:你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支援并行。此處注意了解:是同時吃,同時說,要真嚴格的說的話,需要2張嘴才是并行。

4、了解:

  (1)并行是指兩個或者多個事件在同一時刻發生;而并發是指兩個或多個事件在同一時間間隔發生。

  (2)并行是在不同實體上的多個事件,并發是在同一實體上的多個事件。

  (3)在一台處理器上“同時”(這個同時實際上市交替“”)處理多個任務,在多台處理器上同時處理多個任務。如hadoop分布式叢集

  普通解釋:

  并發:交替做不同僚情的能力

  并行:同時做不同僚情的能力

  專業術語:

  并發:不同的代碼塊交替執行

  并行:不同的代碼塊同時執行

5、總結:

  如果某個系統支援兩個或者多個動作(Action)同時存在,那麼這個系統就是一個并發系統。

  如果某個系統支援兩個或者多個動作同時執行,那麼這個系統就是一個并行系統。

  并發系統與并行系統這兩個定義之間的關鍵差異在于“存在”這個詞。

  在并發程式中可以同時擁有兩個或者多個線程。這意味着,如果程式在單核處理器上運作,那麼這兩個線程将交替地換入或者換出記憶體。這些線程是同時“存在”的——每個線程都處于執行過程中的某個狀态。

  如果程式能夠并行執行,那麼就一定是運作在多核處理器上。此時,程式中的每個線程都将配置設定到一個獨立的處理器核上,是以可以同時運作。

  我相信你已經能夠得出結論——“并行”概念是“并發”概念的一個子集。也就是說,你可以編寫一個擁有多個線程或者程序的并發程式,但如果沒有多核處理器來執行這個程式,那麼就不能以并行方式來運作代碼。是以,凡是在求解單個問題時涉及多個執行流程的程式設計模式或者執行行為,都屬于并發程式設計的範疇。

  并發就是指代碼邏輯上可以并行,有并行的潛力,但是不一定目前是真的以實體并行的方式運作。并發指的是代碼的性質,并行指的是實體運作狀态。

  顧名思義,并發強調的是一起出發,并行強調的是一起執行。并發的反義是順序,并行的反義是串行。并發并行并不是互斥概念,隻不過并發強調任務的抽象排程,并行強調任務的實際執行。

6、程式設計中的與并發與并行:

當有多個線程在操作時,如果系統隻有一個CPU,則它根本不可能真正同時進行一個以上的線程,它隻能把CPU運作時間劃分成若幹個時間段,再将時間 段配置設定給各個線程執行,在一個時間段的線程代碼運作時,其它線程處于挂起狀态.這種方式我們稱之為并發(Concurrent).

當系統有一個以上CPU時,則線程的操作有可能非并發.當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶占CPU資源,可以同時進行,這種方式我們稱之為并行(Parallel)

多線程不可能真正充分利用CPU,節約運作時間,它隻是以”挂起->執行->挂起”的方式以很小的時間片分别運作各個線程,給使用者以每個線程都在運作的錯覺.在這種環境中,多線程程式真正改善的是系統的響應性能和程式的友好性.

在并行環境中, 一個時刻允許多個線程運作,這時多線程程式才真正充分利用了多CPU的處理能力, 節省了整體的運作時間.在這種環境中,多線程程式能展現出它的四大優勢:充分利用CPU,節省時間,改善響應和增加程式的友好性.

PS:在多核時代來臨後,開發多線程程式的能力更是每個程式員都該具備的.

繼續閱讀