concurrent and parallel phases 併發和並行的區別

在看g1gc文章的時候,把concurrent and parallel phases翻譯成併發和並行階段,感覺這2個詞不是一個意思嗎?爲啥他原始文檔要強調這2個詞呢。深究一下,果然不是一個意思。

總體概念:
在單CPU系統中,系統調度在某一時刻只能讓一個線程運行,雖然這種調用機制有多種形式(大多數是時間片輪巡爲主),但無論如何,要通過不斷切換需要運行的線程讓其運行的方式就叫併發(concurrent)。而在多CPU系統中,可以讓兩個以上的線程同時運行,這種可以同時讓兩個以上線程同時運行的方式叫做並行(parallel)。 

併發編程:
       "併發"在微觀上不是同時執行的,只是把時間分成若干段,使多個進程快速交替的執行,從宏觀外來看,好像是這些進程都在執行。
     使用多個線程可以幫助我們在單個處理系統中實現更高的吞吐量,如果一個程序是單線程的,這個處理器在等待一個同步I/O操作完成的時候,他仍然是空閒的。在多線程系統中,當一個線程等待I/O的同時,其他的線程也可以執行。
     這個有點像一個廚師做麻辣雞絲的時候同時做香辣土豆條,總比先做麻辣雞絲再做香辣土豆條效率要高,因爲這樣可以交替着做。
    上面這個情況是在單處理器(廚師)的系統處理任務(做菜)的情況,廚師只有一個,他在一個微觀的時間點上,他只能做一件事情,這種情況就是雖然是多個線程,但是都是在同一個處理器上運行,只能算是併發,不是並行。要是這個時候有2個廚師(cpu),那麼就是真的並行,並行加併發才能提高效率。
     但是多線程並不能一定能提高程序的執行效率,比如,你的項目經理給你分配了10個bug讓你修改,你應該會一個一個去改,一般的人不會每個bug去改5分鐘,直到改完爲止,如果這樣的話,上次改到什麼地方都記不得了。在這總情況下併發並沒有提高程序的執行效率,反而因爲過多的上下文切換引入了一些額外的開銷。
     因此在單cpu下只能實現程序的併發,但是無法實現程序的並行。
     現在cpu到了多核的時代,那麼就出現了新的概念:並行。
     並行是真正的細粒度上的同時進行;既同一時間點上同時發生着多個併發;更加確切並且簡單的來講:就是每個cpu上運行一個程序,以達到同一時間點上每個cpu上運行一個程序。
   總結,計算機的計算原理是順序執行的;即一臺計算機同一時間點上只能完成一個運算;既然突破不了這個理論基礎,那麼就在其基礎上去發展:爲一臺計算機內置多個cpu,這樣就可以達到真正意義上的並行。

併發:意味着應用程序同時(併發)在一項以上的任務上取得進展,盡力壓榨一個cpu的處理能力,搶佔更多的執行時間片

並行:應用程序將其任務分解爲較小的子任務,這些子任務可以並行處理,例如在多個CPU上同時進行。重點是多個cpu。

理解:

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

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

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

  普通解釋:

  併發:交替做不同事情的能力

  並行:同時做不同事情的能力

  專業術語:

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

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

例子:

  順序執行:你喫飯喫到一半,電話來了,你一直到喫完了以後纔去接,這就說明你不支持併發也不支持並行。

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

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

總結:

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

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

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

  在併發程序中可以同時擁有兩個或者多個線程。這意味着,如果程序在單核處理器上運行,那麼這兩個線程將交替地換入或者換出內存。這些線程是同時“存在”的——每個線程都處於執行過程中的某個狀態。

  如果程序能夠並行執行,那麼就一定是運行在多核處理器上。此時,程序中的每個線程都將分配到一個獨立的處理器核上,因此可以同時運行。

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

  併發就是指代碼邏輯上可以並行,有並行的潛力,但是不一定當前是真的以物理並行的方式運行。併發指的是代碼的性質,並行指的是物理運行狀態。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章