socket編程——阻塞、非阻塞、同步、異步

我這裏主要是參考了這篇文章

一開始我很疑惑,同步異步和阻塞非阻塞有什麼區別麼?看了這篇文章感覺有所悟,所以來總結一下。


阻塞與非阻塞

  • 阻塞
    所謂阻塞,是指將一個IO操作交給底層之後,底層不執行完畢不返回。也就是程序運行到這裏就卡住了,直到底層運行完畢才能繼續。
    比如說一次接收,對於阻塞的recv,如果對面還沒有發任何數據,也就是底層沒有接收到任何數據,那麼程序就會一直卡在這裏,直到對面有數據發送過來,並且接收完畢,纔會返回
  • 非阻塞
    非阻塞是指,執行一個IO操作後,如果底層沒有準備好,那麼就返回錯誤,而不是一直等待。比如同樣是recv,非阻塞狀態的時候,如果底層沒有收到數據,或者還未接收完畢,那麼就會返回錯誤。進程就需要用while循環一直調用相關函數查看套接口狀態,直到查到套接口已經準備好(也就是底層已經接收完畢)再進行接收,這也就是輪詢。或者更直接的,直接用while循環反覆調用recv函數,直到其不報錯。

同步與異步

  • 同步
    所謂同步,是說進程在執行IO操作的時候,需要主動地等待任務的完成。不論是阻塞式的等待,還是非阻塞的輪詢,都需要主動地查看任務的狀態,直至其完成,才執行其他操作。
  • 異步
    異步是指,將IO操作交給底層之後,就去執行其他操作,不是主動的去查詢,而是被動的等待完成的信號。更類似於中斷。

總結

所以同步異步與阻塞非阻塞的關係大概是醬嬸的:
在這裏插入圖片描述
阻塞的一定是同步,異步的一定是非阻塞的。
嗯,大概就醬紫吧。

(如有錯漏,還望指摘)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章