並行編程和並行編程有什麼區別? 我問谷歌,但沒有找到任何能夠幫助我理解這種差別的東西。 你能給我兩個例子嗎? linux
如今,我找到了如下解釋: http : //www.linux-mag.com/id/7411-可是「併發是程序的屬性」與「並行執行是機器的屬性」對我來講還不夠-我仍是不能說什麼。 算法
我在一些博客中找到了此內容。 認爲它是有用和相關的。 編程
併發和並行性不是一回事。 若是未預先肯定兩個任務的執行順序,則兩個任務T1和T2是併發的, 緩存
T1能夠在T2以前執行並完成,T2能夠在相同時間(並行)同時執行T1,T1和T2以前執行並完成,T1和T2能夠交替執行,...若是有兩個併發線程若是操做系統將其調度爲在一個單核非SMT非CMP處理器上運行,則可能會併發但不會並行。 並行可能在多核,多處理器或分佈式系統上進行。 網絡
併發一般被稱爲程序的屬性,而且是比並行性更籠統的概念。 多線程
資料來源: https : //blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming 併發
我相信併發編程是指多線程編程,它是讓您的程序運行從硬件詳細信息中抽象出來的多個線程。 oracle
並行編程是指專門設計程序算法以利用可用的並行執行。 例如,您能夠並行執行某些算法的兩個分支,以期比起先檢查第一個而後再檢查第二個分支的結果更快(平均)達到結果。 分佈式
它們是兩個短語,從(很是輕微)不一樣的角度描述同一件事。 並行編程從硬件的角度描述了這種狀況-至少有兩個處理器(可能在單個物理包中)並行處理問題。 併發編程從軟件的角度描述了更多東西-可能在同一時間(併發)發生兩個或多個動做。 spa
這裏的問題是,人們在實際上不存在這兩個短語的狀況下,試圖使用這兩個短語進行明確的區分。 現實狀況是,他們試圖繪製的分界線數十年來一直模糊不清,而且隨着時間的推移變得愈來愈模糊。
他們試圖討論的事實是,從前,大多數計算機只有一個CPU。 當您在單個CPU上執行多個進程(或線程)時,CPU一次實際上僅在其中一個線程中執行一條指令。 併發的外觀是一種錯覺-CPU在來自不一樣線程的執行指令之間切換的速度足夠快,以致於讓人感受到(任何小於100 ms的瞬間看起來都是瞬時的),就好像它正在一次作不少事情。
與此造成鮮明對比的是,一臺具備多個CPU的計算機或一個具備多個內核的CPU,所以該計算機正好同時執行來自多個線程和/或進程的指令。 執行一個的代碼不能/不影響另外一個執行的代碼。
如今的問題是:如此清晰的區分幾乎從未存在過。 計算機設計師其實是至關聰明的,因此他們好久之前就注意到(例如)當您須要從I / O設備(例如磁盤)讀取某些數據時,花了很長時間(就CPU週期而言)完。 他們沒有讓CPU閒置,而是想出了各類方法讓一個進程/線程發出I / O請求,並讓其餘進程/線程的代碼在I / O請求完成時在CPU上執行。
所以,早在多核CPU成爲規範以前,咱們就有來自多個線程的操做並行發生。
不過,那只是冰山一角。 幾十年前,計算機也開始提供另外一級別的並行性。 再次,做爲很是聰明的人,計算機設計師注意到,在不少狀況下,他們所使用的指令不會互相影響,所以能夠從同一流中同時執行多個指令。 早已廣爲人知的一個例子是Control Data6600。這是(在至關大的程度上)1964年推出時地球上最快的計算機-至今仍使用許多相同的基本體系結構。 它跟蹤每一個指令所使用的資源,並具備一組執行單元,一旦它們所依賴的資源可用,它們就會執行指令,這與最新的Intel / AMD處理器的設計很是類似。
可是(正如商業廣告所說的那樣)等等-還不止這些。 還有另外一個設計元素,進一步增長了混亂。 它有不少不一樣的名稱(例如,「 Hyperthreading」,「 SMT」,「 CMP」),但它們都引用相同的基本思想:一個CPU能夠同時使用多個資源來同時執行多個線程,每一個線程和線程之間共享的一些資源是獨立的。 在典型狀況下,這與上面概述的指令級並行性結合在一塊兒。 爲此,咱們有兩組(或更多組)體系結構寄存器。 而後,咱們有一組執行單元,能夠在必要的資源可用時當即執行指令。 這些一般合併得很好,由於來自不一樣流的指令實際上從不依賴於相同的資源。
而後,咱們固然可使用具備多個內核的現代系統。 這裏的事情很明顯,對吧? 咱們有N個內核(目前在2到256個左右之間),每一個內核均可以同時執行指令,所以咱們有一個真正的並行處理的清晰案例-在一個進程/線程中執行指令不會不會影響另外一個執行指令。
好吧,有點。 即便在這裏,咱們也有一些獨立的資源(寄存器,執行單元,至少一個緩存級別)和一些共享資源(一般至少是最低緩存級別,而且確定還有內存控制器和內存帶寬)。
總結一下:人們喜歡在共享資源和獨立資源之間進行對比的簡單場景實際上在現實生活中從未發生過。 在共享全部資源的狀況下,咱們最終會遇到相似於MS-DOS的狀況,其中一次只能運行一個程序,而且必須中止運行一個程序才能徹底運行另外一個程序。 有了徹底獨立的資源,咱們有N臺運行MS-DOS的計算機(甚至沒有網絡來鏈接它們),根本沒法共享它們之間的任何內容(由於即便咱們能夠共享文件,那也就是共享資源,違反了什麼都不共享的基本前提)。
每一個有趣的案例都涉及獨立資源和共享資源的某種組合。 每臺至關現代的計算機(以及不少不是現代的計算機)至少具備同時執行至少一些獨立操做的能力,而且幾乎任何比MS-DOS更復雜的事物都至少利用了這一點。必定程度上。
人們喜歡畫的「併發」和「平行」之間的漂亮,清晰的劃分是不存在的,並且幾乎永遠不會存在。 人們喜歡歸類爲「併發」的內容一般仍然涉及至少一種而且一般是更多不一樣類型的並行執行。 他們喜歡歸類爲「並行」的內容一般涉及共享資源,(例如)一個進程在使用二者之間共享的資源時阻止了另外一個進程的執行。
人們試圖在「並行」和「並行」之間劃清界限,他們生活在幻想中的計算機實際上並不存在。
若是您正在使用線程編程(並行編程),則不必定要這樣執行(並行執行),由於這取決於計算機是否能夠處理多個線程。
這是一個視覺示例。 非線程機器上的線程 :
-- -- -- / \ >---- -- -- -- -- ---->>
線程計算機上的線程 :
------ / \ >-------------->>
破折號表明執行的代碼。 如您所見,它們既拆分又分別執行,可是線程機能夠一次執行幾個單獨的部分。
我瞭解到的區別是:
1)併發-使用共享資源串聯運行2)並行-使用不一樣資源並排運行
所以,即便它們在點(2)匯合在一塊兒,也可使彼此同時發生的兩件事同時發生,或者在執行的整個操做中,有兩件事利用相同的儲備金(1)。