同步,異步,阻塞和非阻塞的理解

概念

  • 同步是兩個對象之間的關係,而阻塞是一個對象的狀態。

同步,異步異步

訪問數據的方式,同步須要主動讀寫數據,在讀寫數據的過程當中仍是會阻塞;異步只須要I/O操做完成的通知,並不主動讀寫數據,由操做系統內核完成數據的讀寫分佈式

  • 同步和異步關注的是消息通訊機制

阻塞,非阻塞函數

進程/線程要訪問的數據是否就緒,進程/線程是否須要等待spa

  • 阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.

區分

  • 在處理 IO 的時候,阻塞和非阻塞都是同步 IO。
  • 只有使用了特殊的 API 纔是異步 IO。

同步和異步

同步就是兩種東西經過一種機制實現步調一致,異步是兩種東西沒必要步調一致操作系統

同步調用與異步調用線程

所謂同步,就是在發出一個調用時,在沒有獲得結果以前,該調用就不返回。可是一旦調用返回,就獲得返回值了。換句話說,就是由調用者主動等待這個調用的結果。對象

而異步則是相反,調用在發出以後,這個調用就直接返回了,因此沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會馬上獲得結果。而是在調用發出後,被調用者經過狀態通知來通知調用者,或經過回調函數處理這個調用。進程

同步就是打電話:我給你說了話,我就等着你說,你不說我不知道該說啥 請求線程會等待請求結果get

異步就是郵件,QQ,短信:我給了你請求,我就去幹別的,你愛啥時候回啥時候回 請求線程不會等待請求結果。回調函數

同步線程與異步線程

同步線程:即兩個線程步調要一致,要相互協商。兩個線程的運行進度各不相同,怎麼才能步調一致呢?咱們直觀的理解就是,快的等慢的唄!快的阻塞一下等到慢的步調一致便可。

異步線程:步調不用一致,各自按各自的步調運行,不受另外一個線程的影響。

  • 同步是指兩個線程的運行是相關的,其中一個線程可能要阻塞等待另一個線程的運行
  • 異步的意思是兩個線程毫無相關,本身運行本身的。

同步通訊與異步通訊

這裏的同步和異步是指:發送方和接收方是否協調步調一致

同步通訊是指:發送方和接收方經過必定機制,實現收發步調協調。如:發送方發出數據後,等接收方發回響應之後才發下一個數據包的通信方式

異步通訊是指:發送方的發送無論接收方的接收狀態,如:發送方發出數據後,不等接收方發回響應,接着發送下個數據包的通信方式。

阻塞和非阻塞

  • 阻塞調用是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。
  • 非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程。

阻塞就是這個事情阻到這兒了,不能繼續往下幹事了,非阻塞就是這個事情不會阻礙你繼續幹後面的事情。

阻塞能夠是實現同步的一種手段!例如兩個東西須要同步,一旦出現不一樣步狀況,我就阻塞快的一方,使雙方達到同步。

例子

你打電話問書店老闆有沒有《分佈式系統》這本書,若是是同步通訊機制,書店老闆會說,你稍等,」我查一下」,而後開始查啊查,等查好了(多是5秒,也多是一天)告訴你結果(返回結果)。

異步通訊機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,而後直接掛電話了(不返回結果)。而後查好了,他會主動打電話給你。在這裏老闆經過「回電」這種方式來回調。

你打電話問書店老闆有沒有《分佈式系統》這本書,你若是是阻塞式調用,你會一直把本身「掛起」,直到獲得這本書有沒有的結果。

若是是非阻塞式調用,你無論老闆有沒有告訴你,你本身先一邊去玩了, 固然你也要偶爾過幾分鐘check一下老闆有沒有返回結果。

在這裏阻塞與非阻塞與是否同步異步無關。跟老闆經過什麼方式回答你結果無關。

參考

https://www.zhihu.com/question/19732473

相關文章
相關標籤/搜索