1. 程式人生 > >詳解併發和並行意義

詳解併發和並行意義

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

1、任務與多工

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

2、順序執行

      上面三個任務,如果在一般的單執行緒執行的程式裡面,分別定義三個函式,然後依次順序執行,即執行完第一個在執行第二個,然後執行第三個,即我先把一首歌學會,然後在操場上散步1000米,然後再給老師彙報,這樣做效率低下。我們可以有一個更加高效的辦事方法,我在散步的時候,順便打電話給老說彙報一下今天的成果,然後邊散步邊聽歌,便跟著學,這樣效果就高很多,這裡的是“並行執行”。

3、併發和並行的一些理解——concurrency  and  parallellism

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

      例子一:

          假設一個有三個學生需要輔導作業,幫每個學生輔導完作業是一個任務
            順序執行:老師甲先幫學生A輔導,輔導完之後再取給B輔導,最後再去給C輔導,效率低下 ,很久才完成三個任務
            併發:老師甲先給學生A去講思路,A聽懂了自己書寫過程並且檢查,而甲老師在這期間直接去給B講思路,講完思路再去給C講思路,讓B自己整理步驟。這樣老師就沒有空                         著,一直在做事情,很快就完成了三個任務。與順序執行不同的是,順序執行,老師講完思路之後學生在寫步驟,這在這期間,老師是完全空著的,沒做事的,所以效率低下。
            並行:直接讓三個老師甲、乙、丙三個老師“同時”給三個學生輔導作業,也完成的很快。

      例子二:

       順序執行:你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。
       併發:你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支援併發。
       並行:你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支援並

理解:

解釋一:並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔發生。
解釋二:並行是在不同實體上的多個事件,併發是在同一實體上的多個事件。
解釋三:在一臺處理器上“同時”處理多個任務,在多臺處理器上同時處理多個任務。如hadoop分散式叢集

普通解釋:
併發:交替做不同事情的能力
並行:同時做不同事情的能力
專業術語:
併發:不同的程式碼塊交替執行
並行:不同的程式碼塊同時執行

併發和並行的意義:

併發和並行都可以處理“多工”,二者的主要區別在於是否是“同時進行”多個的任務。

但是 涉及到任務分解(有先後依賴的任務就不能做到並行)、任務執行(可能要考慮互斥、鎖、共享等)、結果合併

4、CPU的時間觀

        為什麼要進行“併發、並行、多工、多執行緒、非同步”等等相關的一些操作,就是為了充分利用CPU的巨大潛能,因為很多工是需要時間的,比如檔案的讀寫、網路資料流的下載等等,如果讓CPU處於一個閒置狀態,不充分利用它,程式的效率就很低。

       站在CPU的角度而言,我就是全心全意搞計算的,你卻讓我閒著沒事幹,在我的心裡,等待的時間就異常漫長。下面是CPU所謂的時間觀:

       

      

由此可見,站在人類的角度而言,重啟一次也就等了5分鐘,還可以接受,可是對於CPU而言,它卻感覺等了25000年,這是多麼漫長的等待,25000年不做事情,太煎熬了。

5、下面是我推薦的兩本關於多工,併發並行程式設計的書籍,一本是基於,NET語言的,一本是基於Python語言的。