同步、異步、阻塞、非阻塞、併發、並行

一個小故事web

故事:小A燒開水。編程

出場人物:小A網絡

出場道具:普通水壺(放在煤氣竈上的那種,爲了方便簡稱:水壺);會響的水壺(水燒開了會響的那種,簡稱:響壺)。併發

故事目的:小A要拿開水泡咖啡異步

小A爲了實現目的,指定了4個計劃:ide

一、用水壺燒水,而且站在煤氣竈旁邊,啥事不幹,兩眼直勾勾的盯着水壺,等水燒開。燒開後就去泡咖啡。-同步阻塞spa

假設燒水和泡咖啡是在同一個線程中執行。操作系統

二、仍然用水壺煮水,不過此時再也不傻傻得站在那裏看水開沒開,而是去玩局LOL,每當本身死了,就過來看看水開了沒有。若是水開了就去泡咖啡。-同步非阻塞線程

假設這裏玩LOL,是另外一個線程運行的。對象

三、動用響壺燒水,仍然站在煤氣竈旁邊,不過此時不兩眼直勾勾的盯着壺了,而是聽響,由於響壺水開時會用響聲通知小A。-異步阻塞

四、在計劃3的基礎上,小A不站在煤氣竈旁邊了,而是去玩局LOL,等聽到響壺的聲音提醒後,再去跑咖啡。-異步非阻塞

有了上邊的故事鋪墊,咱們再來看一看概念

同步:

同步這個詞在不少場合下都會被使用,若是單從字面意思來看:相同的步驟。可是在編程的領域裏講,字面意思就不那麼準確了。

對於編程領域來講,同步就是發起一個請求,直到請求返回結果以後,才進行下一步操做。簡單來講,同步就是必須一件事一件事的作,等前一件作完了,才能作下一件事。

例子:此種模式很常見,好比我發起一個網絡請求查詢一我的的身份證,而後根據身份證查看這我的的詳細信息。那麼我查詢詳細信息的操做須要等待查詢身份證的操做,那麼此時查詢身份證的操做就是一個同步操做。

異步:

異步很明顯是與同步相對,兩者的區別在因而否須要等待某操做的返回結果。簡單來講,咱們仍是一個網絡請求,若是咱們此時不須要依賴這個請求的結果就能進行後續操做,那麼此時這個網絡請求就是一個異步操做。

當一個異步操做發出後,調用者在沒有獲得結果以前,能夠繼續執行後續操做。這就是異步。

同步和異步的區別:

兩者的區別仍是很明顯的:請求發出後,是否須要等待請求結果,才能繼續執行其餘操做。

阻塞

阻塞的概念每每伴隨這線程。阻塞通常是指:在調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會被喚醒執行後續的操做。

非阻塞

那麼非阻塞,毫無疑問是阻塞的反向操做。非阻塞式的調用指:在結果沒有返回以前,該調用不會阻塞住當前線程。

是否是感受阻塞/非阻塞和同步/異步有殊途同歸的地方?

其實,這二者存在本質的區別,面向的對象是不一樣的。

- 阻塞/非阻塞:進程/線程須要操做的數據若是還沒有就緒,是否妨礙了當前進程/線程的後續操做。

  • 同步/異步:數據若是還沒有就緒,是否須要等待數據結果。

併發和並行

兩者的區分度很是的高,就在於四個字:是否同時。

併發:當有多個線程在操做時,若是系統只有一個CPU,操做系統只能把CPU運行時間劃分紅若干個時間段,再將時間段分配給各個線程執行,在一個時間段的快速的切換不一樣的線程代碼運行。

並行:當系統有多個CPU時,能夠存在當一個CPU執行一個線程時,另外一個CPU能夠執行另外一個線程,兩個線程互不搶佔CPU資源,能夠同時進行。

舉個小例子

小A吃飯吃到一半,電話來了,小A一直到吃完了之後纔去接。即不支持併發也不支持並行

小A吃飯吃到一半,電話來了,小A停了下來接了電話,接完後繼續吃飯。支持併發

小A吃飯吃到一半,電話來了,小A一邊打電話一邊吃飯。支持並行

一切的開始,讓咱們從一個小故事出發:(故事靈感來自互聯網)

一個小故事

故事:小A燒開水。

出場人物:小A

出場道具:普通水壺(放在煤氣竈上的那種,爲了方便簡稱:水壺);會響的水壺(水燒開了會響的那種,簡稱:響壺)。

故事目的:小A要拿開水泡咖啡

小A爲了實現目的,指定了4個計劃:

一、用水壺燒水,而且站在煤氣竈旁邊,啥事不幹,兩眼直勾勾的盯着水壺,等水燒開。燒開後就去泡咖啡。-同步阻塞

假設燒水和泡咖啡是在同一個線程中執行。

二、仍然用水壺煮水,不過此時再也不傻傻得站在那裏看水開沒開,而是去玩局LOL,每當本身死了,就過來看看水開了沒有。若是水開了就去泡咖啡。-同步非阻塞

假設這裏玩LOL,是另外一個線程運行的。

三、動用響壺燒水,仍然站在煤氣竈旁邊,不過此時不兩眼直勾勾的盯着壺了,而是聽響,由於響壺水開時會用響聲通知小A。-異步阻塞

四、在計劃3的基礎上,小A不站在煤氣竈旁邊了,而是去玩局LOL,等聽到響壺的聲音提醒後,再去跑咖啡。-異步非阻塞

有了上邊的故事鋪墊,咱們再來看一看概念

同步:

同步這個詞在不少場合下都會被使用,若是單從字面意思來看:相同的步驟。可是在編程的領域裏講,字面意思就不那麼準確了。

對於編程領域來講,同步就是發起一個請求,直到請求返回結果以後,才進行下一步操做。簡單來講,同步就是必須一件事一件事的作,等前一件作完了,才能作下一件事。

例子:此種模式很常見,好比我發起一個網絡請求查詢一我的的身份證,而後根據身份證查看這我的的詳細信息。那麼我查詢詳細信息的操做須要等待查詢身份證的操做,那麼此時查詢身份證的操做就是一個同步操做。

異步:

異步很明顯是與同步相對,兩者的區別在因而否須要等待某操做的返回結果。簡單來講,咱們仍是一個網絡請求,若是咱們此時不須要依賴這個請求的結果就能進行後續操做,那麼此時這個網絡請求就是一個異步操做。

當一個異步操做發出後,調用者在沒有獲得結果以前,能夠繼續執行後續操做。這就是異步。

同步和異步的區別:

兩者的區別仍是很明顯的:請求發出後,是否須要等待請求結果,才能繼續執行其餘操做。

阻塞

阻塞的概念每每伴隨這線程。阻塞通常是指:在調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會被喚醒執行後續的操做。

非阻塞

那麼非阻塞,毫無疑問是阻塞的反向操做。非阻塞式的調用指:在結果沒有返回以前,該調用不會阻塞住當前線程。

是否是感受阻塞/非阻塞和同步/異步有殊途同歸的地方?

其實,這二者存在本質的區別,面向的對象是不一樣的。

- 阻塞/非阻塞:進程/線程須要操做的數據若是還沒有就緒,是否妨礙了當前進程/線程的後續操做。

  • 同步/異步:數據若是還沒有就緒,是否須要等待數據結果。

併發和並行

兩者的區分度很是的高,就在於四個字:是否同時。

併發:當有多個線程在操做時,若是系統只有一個CPU,操做系統只能把CPU運行時間劃分紅若干個時間段,再將時間段分配給各個線程執行,在一個時間段的快速的切換不一樣的線程代碼運行。

並行:當系統有多個CPU時,能夠存在當一個CPU執行一個線程時,另外一個CPU能夠執行另外一個線程,兩個線程互不搶佔CPU資源,能夠同時進行。

舉個小例子

小A吃飯吃到一半,電話來了,小A一直到吃完了之後纔去接。即不支持併發也不支持並行

小A吃飯吃到一半,電話來了,小A停了下來接了電話,接完後繼續吃飯。支持併發

小A吃飯吃到一半,電話來了,小A一邊打電話一邊吃飯。支持並行

相關文章
相關標籤/搜索