我這裏主要是參考了這篇文章。
一開始我很疑惑,同步異步和阻塞非阻塞有什麼區別麼?看了這篇文章感覺有所悟,所以來總結一下。
阻塞與非阻塞
- 阻塞
所謂阻塞,是指將一個IO操作交給底層之後,底層不執行完畢不返回。也就是程序運行到這裏就卡住了,直到底層運行完畢才能繼續。
比如說一次接收,對於阻塞的recv
,如果對面還沒有發任何數據,也就是底層沒有接收到任何數據,那麼程序就會一直卡在這裏,直到對面有數據發送過來,並且接收完畢,纔會返回。 - 非阻塞
非阻塞是指,執行一個IO操作後,如果底層沒有準備好,那麼就返回錯誤,而不是一直等待。比如同樣是recv
,非阻塞狀態的時候,如果底層沒有收到數據,或者還未接收完畢,那麼就會返回錯誤。進程就需要用while循環一直調用相關函數查看套接口狀態,直到查到套接口已經準備好(也就是底層已經接收完畢)再進行接收,這也就是輪詢。或者更直接的,直接用while循環反覆調用recv
函數,直到其不報錯。
同步與異步
- 同步
所謂同步,是說進程在執行IO操作的時候,需要主動地等待任務的完成。不論是阻塞式的等待,還是非阻塞的輪詢,都需要主動地查看任務的狀態,直至其完成,才執行其他操作。 - 異步
而異步是指,將IO操作交給底層之後,就去執行其他操作,不是主動的去查詢,而是被動的等待完成的信號。更類似於中斷。
總結
所以同步異步與阻塞非阻塞的關係大概是醬嬸的:
阻塞的一定是同步,異步的一定是非阻塞的。
嗯,大概就醬紫吧。
(如有錯漏,還望指摘)