並發和並行的區別


書本內容:

且參照原文https://www.jianshu.com/p/cbf9588b2afb

⾕歌著名⼯程師羅布·派克(Rob Pike)說過,“並發就是同時應對 (Dealing With)多件事情的能⼒,並⾏是同時執⾏(Doing)多件事情的 能⼒”。這句話⾮常透徹地闡述了並發和並⾏的區別,在於“應對”和“執 ⾏”。

解釋一:並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔發生。

解釋二:並行是在不同實體上的多個事件,並發是在同一實體上的多個事件。

解釋三:並行是在一台處理器上“同時”處理多個任務,並發是在多台處理器上同時處理多個任務。如 hadoop 分布式集群。

所以並發編程的目標是充分的利用處理器的每一個核,以達到最高的處理性能。

並行(parallel):指在同一時刻,有多條指令在多個處理器上同時執行。所以無論從微觀還是從宏觀來看,二者都是一起執行的。

並發(concurrency):指在同一時刻只能有一條指令執行,但多個進程指令被快速的輪換執行,使得在宏觀上具有多個進程同時執行的效果,但在微觀上並不是同時執行的,只是把時間分成若干段,使多個進程快速交替的執行。

並行在多處理器系統中存在,而並發可以在單處理器和多處理器系統中都存在,並發能夠在單處理器系統中存在是因為並發是並行的假象,並行要求程序能夠同時執行多個操作,而並發只是要求程序假裝同時執行多個操作(每個小時間片執行一個操作,多個操作快速切換執行)。

當有多個線程在操作時,如果系統只有一個 CPU,則它根本不可能真正同時進行一個以上的線程,它只能把 CPU 運行時間划分成若干個時間段,再將時間段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處於掛起狀態.這種方式我們稱之為並發(Concurrent)。

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

並發和並行的區別就是(舉個例子)

一個人一天打三份工,和三個人一天打三份工。

下面部分的原文博客:https://blog.csdn.net/qiuyubo1/article/details/80288525

二、異步與多線程
1)基本概念

    1. 並發:在操作系統中,是指一個時間段中有幾個程序都處於已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行。其中兩種並發關系分別是同步和互斥
    2. 互斥:進程間相互排斥的使用臨界資源的現象,就叫互斥。
    3. 同步:進程之間的關系不是相互排斥臨界資源的關系,而是相互依賴的關系。進一步的說明:就是前一個進程的輸出作為后一個進程的輸入,當第一個進程沒有輸出時第二個進程必須等待。具有同步關系的一組並發進程相互發送的信息稱為消息或事件。
    其中並發又有偽並發和真並發,偽並發是指單核處理器的並發,真並發是指多核處理器的並發。
    4. 並行:在單處理器中多道程序設計系統中,進程被交替執行,表現出一種並發的外部特種;在多處理器系統中,進程不僅可以交替執行,而且可以重疊執行。在多處理器上的程序才可實現並行處理。從而可知,並行是針對多處理器而言的。並行是同時發生的多個並發事件,具有並發的含義,但並發不一定並行,也亦是說並發事件之間不一定要同一時刻發生。

    5. 多線程:多線程是程序設計的邏輯層概念,它是進程中並發運行的一段代碼。多線程可以實現線程間的切換執行。

    6. 異步:異步和同步是相對的,同步就是順序執行,執行完一個再執行下一個,需要等待、協調運行。異步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成后再工作。線程就是實現異步的一個方式。異步是讓調用方法的主線程不需要同步等待另一線程的完成,從而可以讓主線程干其它的事情。


    異步和多線程並不是一個同等關系,異步是最終目的,多線程只是我們實現異步的一種手段。異步是當一個調用請求發送給被調用者,而調用者不用等待其結果的返回而可以做其它的事情。實現異步可以采用多線程技術或則交給另外的進程來處理。

    異步和同步的區別,  在io等待的時候,同步不會切走,浪費了時間。

    多線程的好處,比較容易的實現了 異步切換的思想, 因為異步的程序很難寫的。多線程本身程還是以同步完成,但是應該說比效率是比不上異步的。 而且多線很容易寫, 相對效率也高。

2)深層次理解

多線程和異步操作的異同

  多線程和異步操作兩者都可以達到避免調用線程阻塞的目的,從而提高軟件的可響應性。甚至有些時候我們就認為多線程和異步操作是等同的概念。但是,多線程和異步操作還是有一些區別的。而這些區別造成了使用多線程和異步操作的時機的區別。

異步操作的本質

  所有的程序最終都會由計算機硬件來執行,所以為了更好的理解異步操作的本質,我們有必要了解一下它的硬件基礎。 熟悉電腦硬件的朋友肯定對DMA這個詞不陌生,硬盤、光驅的技術規格中都有明確DMA的模式指標,其實網卡、聲卡、顯卡也是有DMA功能的。DMA就是直接內存訪問的意思,也就是說,擁有DMA功能的硬件在和內存進行數據交換的時候可以不消耗CPU資源。只要CPU在發起數據傳輸時發送一個指令,硬件就開始自己和內存交換數據,在傳輸完成之后硬件會觸發一個中斷來通知操作完成。這些無須消耗CPU時間的I/O操作正是異步操作的硬件基礎。所以即使在DOS這樣的單進程(而且無線程概念)系統中也同樣可以發起異步的DMA操作。

線程的本質
  線程不是一個計算機硬件的功能,而是操作系統提供的一種邏輯功能,線程本質上是進程中一段並發運行的代碼,所以線程需要操作系統投入CPU資源來運行和調度。

異步操作的優缺點

  因為異步操作無須額外的線程負擔,並且使用回調的方式進行處理,在設計良好的情況下,處理函數可以不必使用共享變量(即使無法完全不用,最起碼可以減少共享變量的數量),減少了死鎖的可能。當然異步操作也並非完美無暇。編寫異步操作的復雜程度較高,程序主要使用回調方式進行處理,與普通人的思維方式有些初入,而且難以調試。

多線程的優缺點
  多線程的優點很明顯,線程中的處理程序依然是順序執行,符合普通人的思維習慣,所以編程簡單。但是多線程的缺點也同樣明顯,線程的使用(濫用)會給系統帶來上下文切換的額外負擔。並且線程間的共享變量可能造成死鎖的出現。

適用范圍

  在了解了線程與異步操作各自的優缺點之后,我們可以來探討一下線程和異步的合理用途。我認為:當需要執行I/O操作時,使用異步操作比使用線程+同步I/O操作更合適。I/O操作不僅包括了直接的文件、網絡的讀寫,還包括數據庫操作、Web Service、HttpRequest以及.Net Remoting等跨進程的調用。
  而線程的適用范圍則是那種需要長時間CPU運算的場合,例如耗時較長的圖形處理和算法執行。但是往往由於使用線程編程的簡單和符合習慣,所以很多朋友往往會使用線程來執行耗時較長的I/O操作。這樣在只有少數幾個並發操作的時候還無傷大雅,如果需要處理大量的並發操作時就不合適了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM