天天看點

同步、異步、阻塞、非阻塞

同步和異步關注的是消息通信機制 (synchronous communication/ asynchronous communication)

真正意義上的 異步IO 是說核心直接将資料拷貝至使用者态的記憶體單元,再通知程式直接去讀取資料。

select / poll / epoll 都是同步IO的多路複用模式

1.同步和異步

  • 所謂同步,就是在發出一個調用時,沒得到結果之前,該調用就不傳回。但是一旦調用傳回就得到傳回值了,調用者主動等待這個調用的結果
  • 所謂異步,就是在發出一個調用時,這個調用就直接傳回了,不管傳回有沒有結果。當一個異步過程調用發出後,被調用者通過狀态,通知來通知調用者,或者通過回調函數處理這個調用

2.阻塞和非阻塞

  • 阻塞和非阻塞關注的是程式在等待調用結果時的狀态
  • 阻塞調用是指調用結果傳回之前,目前線程會被挂起。調用線程隻有在得到結果之後才傳回
  • 非阻塞調用是指在不能立即得到結果之前,該調用不會阻塞目前線程

網絡上的例子

老張愛喝茶,廢話不說,煮開水。

出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。

  • 老張把水壺放到火上,立等水開。(同步阻塞);立等就是阻塞了老張去幹别的事,老張得一直主動的看着水開沒,這就是同步
  • 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞);老張去看電視了,這就是非阻塞了,但是老張還是得關注着水開沒,這也就是同步了
  • 老張把響水壺放到火上,立等水開。(異步阻塞);立等就是阻塞了老張去幹别的事,但是老張不用時刻關注水開沒,因為水開了,響水壺會提醒他,這就是異步了
  • 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞);老張去看電視了,這就是非阻塞了,而且,等水開了,響水壺會提醒他,這就是異步了
  • 所謂同步異步,隻是對于水壺而言。普通水壺,同步;響水壺,異步。對應的也就是消息通信機制
  • 雖然都能幹活,但響水壺可以在自己完工之後,提示老張水開了。這是普通水壺所不能及的。同步隻能讓調用者去輪詢自己(情況2中),造成老張效率的低下。
  • 所謂阻塞非阻塞,僅僅對于老張而言。立等的老張,阻塞;對應的也就是程式等待結果時的狀态
  • 看電視的老張,非阻塞。
  • 情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對于立等的老張沒有太大的意義。是以一般異步是配合非阻塞使用的,這樣才能發揮異步的效用。

(以上内容僅供自己筆記,摘自網絡)

繼續閱讀