前言
在多線程程序中經常使用并發、并行,同步、異步這兩組概念,那么下面說一下我所理解的這兩組概念的聯系與區別。
并發
并發指兩個或兩個以上的事件在同一時間段內發生(注意:
這里指的時間段是在微觀上看,所以它很短,我們感覺不出來事件發生的時間差)。
并發意味著應用程序同時在多個任務上取得進展。那么,如果計算機只有一個CPU,應用程序可能不會同時完成多個任務,但在應用程序的某個時間內正在處理多個任務。它不能完全完成一個任務,然后再開始下一個任務。
并行
并行指兩個或兩個以上的事件在同一時刻發生。
并行意味著應用程序拆分成更小的子任務,這些任務可以并行處理,例如在多CPU在同一時間。
總結
如上,并發性與應用程序處理多個任務的方式有關。應用程序可以在某個時間(順序地)處理一個任務,或者同時處理多個任務。
另一方面,并行性與應用程序如何處理每個單獨的任務有關。一個應用程序可以處理連續的任務從開始到結束,或將任務分解成子任務可以并行完成。
并發可認為是一種邏輯結構的設計模式。你可以用并發的設計方式去設計模型,然后運行在一個單核系統上,通過系統動態地邏輯切換制造出并行的假象。此時,你的程序不是并行,但是是并發的。你可以將這種模型不加修改地運行在多核系統上,此時你的程序可以認為是并行。而并行則更關注的是程序的執行。
串行
串行指多個任務時,各個任務按順序執行,完成一個之后才能進行下一個。
同步
同步
串行是同步線程實現的方式。一個任務執行完成后才能執行下一個任務,單線程只能執行一個任務。
異步
異步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成后再工作。線程就是實現異步的一個方式。異步是讓調用方法的主線程不需要同步等待另一線程的完成,從而可以讓主線程干其它的事情。
并發和并行其實是異步線程實現的兩種形式。并行其實是真正的異步,多核CUP可以同時開啟多條線程供多個任務同時執行,互補干擾。但是并發就不一樣了,是一個偽異步。在單核CUP中只能有一條線程,但是又想執行多個任務。這個時候,只能在一條線程上不停的切換任務。
小結
同步和異步是在多任務的情況下,這是前提。其次,同步和異步是指邏輯調用方式。同步的前一個邏輯調用的輸出作為第二個邏輯調用的輸入,后一個邏輯調用必須等待前一個調用執行完才能開始調起執行。正好與同步相反,后一個邏輯調用無需等待前一個邏輯調用執行完畢。也就是說前一個邏輯調用發起后就直接返回了,并沒有輸出,而是在調用執行完成后通過狀態、通知來通知調用者,或通過回調函數處理這個調用。
本文摘錄了一下網上相關內容以及自己的一些理解,有問題請留言,謝謝啦!