異步 vs 同步 , 併發 vs 並行

異步:asynchronous 同步:synchronous 併發:cocurrent 並行:parallel算法

異步任務是同步任務的特例。 先有同步,後有異步。多線程

一個進程能夠擁有一個至多個線程,線程是實際上運行的單位。併發

單線程下的同步和異步

咱們先從最簡單的狀況下分析這二者的不一樣。 首先,假設咱們的處理器是單核,當前運行的進程只有一個線程在運行。異步

同步

在一個線程中,同步是指全部任務按出現的前後順序依次執行 若是出現阻塞的任務,那麼線程就會等待這個任務完成,接着執行下一個任務。async

  • 優勢:控制簡單。若是任務的執行結果之間存在依賴關係,或者對執行的順序有要求,使用同步方式就能夠知足這種需求操作系統

  • 缺點:運行效率低,線程必須等待阻塞任務完成,而這段時間不能執行其餘任務。線程

異步

異步不保證全部任務按出現的順序執行對象

若是出現了阻塞的任務,在異步下咱們能夠不等待這個任務完成,繼續執行其餘任務,也就是不阻塞(non-blocking)進程

  • 優勢:運行效率高,不用等待阻塞的任務完成,能夠先去完成其餘任務。資源

  • 缺點:任務之間的執行順序沒有保證,任務結果出現的順序也不保證。

多線程下的同步和異步

現現在,操做系統裏的進程不可能只有一個線程在運行,極可能有多個線程正在運行。

爲了較好的分析,咱們依舊以處理器是單核的狀況下分析單進程多線程下的同步和異步。

當線程獲得了處理器的時候,這個線程就會開始運行。

同步

假如獲得線程A獲得了處理器,那麼線程A開始運行,遇到了一個阻塞的任務,由於這個是同步執行,因此線程A必須等待任務完成。因而這個線程A的狀態轉變爲BLOCK(阻塞)狀態。

可是,在操做系統的調度下(或語言的運行環境),其餘未阻塞且處於就緒(Ready)狀態的線程會獲得處理器並繼續運行。

在線程A的阻塞任務完成後,線程A的狀態會轉變爲就緒(Ready)狀態,等待操做系統分配處理器。

多線程的同步

這裏的同步是指兩個或多個線程的執行存在依賴關係,須要保證線程運行順序。

由於線程能夠當成輕型化的進程,因此他們有類似之處,進程的同步 這一段的內容對多線程來講也是適用的。

異步

假如獲得線程A了處理器,那麼線程A開始運行,在遇到了一個阻塞的任務的時候,不等待這個任務完成,能夠繼續執行其餘任務。其餘線程也相似。

也就是說全部的線程不會出現阻塞狀態,只要分配到了處理器就會一直執行。

進程下的同步,處理器的異步

如今假設這個進程只有一個線程B在運行。

進程的同步

進程同步是指兩個以上的進程須要同步,只有1個進程是不須要同步的。

單線程下的同步相似,進程的同步本質上也是要保證進程的按照必定前後次序運行。 緣由大概有:

  1. 多個進程同時對一個互斥資源進行了操做
  2. 一個進程須要等待其餘進程運行的結果

(關於對進程同步更詳細的介紹,能夠參考操做系統相關的書籍。)

也就是說,當運行的進程實在沒有辦法繼續執行下去(不知足執行條件),它只能進入阻塞狀態。

可是,若是這個進程有多個線程,那麼這個進程就不會進入阻塞狀態,只有線程B進入阻塞狀態,等待同步任務的結果,其餘線程依舊能夠運行。

這也是爲何,大多數操做系統都支持多線程的一個緣由。

處理器的異步

類比於以前的異步,若是當前進程在執行阻塞任務,那麼它必須等待。OS此時就會奪取處理器,運行調度算法,而後從新分配處理器,處理器繼續執行其餘未阻塞的進程。 這樣的話,進程的運行並非「一鼓作氣」,而是「走走停停」。

我的理解

  • 進程的異步是單個進程陷入阻塞,處理器不用等待阻塞任務完成,繼續執行其餘進程,對象是處理器
  • 進程的同步是指兩個和多個進程的執行順序須要同步,對象是進程。

因此二者有交叉的地方。

進程的併發

若是處理器是單核心,一次只能運行一個進程

操做系統給每一個進程分配一個不固定的時間片。 OS根據調度算法,將處理器分配給優先級高的進程。 當這個進程的時間片用完,進程當前的運行狀態會被保存下來,OS從新執行調度算法,將處理器從新分配給其餘進程。

在這種狀況下,進程是被主動剝奪處理器的,不是由於阻塞任務被OS剝奪處理器。

微觀上,OS給每一個進程分配時間片斷,多個程序獲得交替地運行

宏觀上,在一個間隔內,如 1s鍾內,多個程序都獲得了運行

因此,進程的併發是從宏觀層面上看,因此咱們會說在一個時間段裏面多個程序都獲得了運行,但不是說「同時運行」。

這種調度對進程來講是透明的。

進程的並行

處理器也就是CPU已經從之前的單核心變成了如今的多核心。 在多核心的CPU的支持下,進程支持真正的並行運行

對核心1,它能夠運行進程1

對核心2,它能夠運行進程2

那麼進程1和進程2就是真正意義上的同時運行,也就時並行

結語

這篇文章總結了我本身對同步、異步、併發和並行的理解,可能會出現不足或差錯,請諒解或指正。

  • 異步:不須要等待阻塞任務的結果,繼續執行
  • 同步:等待阻塞任務的結果,完成以後才能繼續執行
  • 併發:在一個時間間隔內,每一個進程都獲得了運行
  • 並行:兩個進程同時在運行

參考

相關文章
相關標籤/搜索