天天看點

網絡io阻塞,非阻塞,同步,異步

一次典型的io分成兩個階段,第一階段是資料是否就緒,第二階段是進行資料讀寫。如int recv( int socket fd, char *buf, int len, int flags)接口,涉及到這兩個過程,1是tcp緩沖區是否有資料(是否就緒),2是如何将tcp緩沖區資料拷貝到應用程式的buf中(資料讀寫)

阻塞io和非阻塞io描述的是第一階段,阻塞io指的是當socket緩沖區沒有資料的時候,則阻塞目前線程,直到有資料為止,非阻塞io則直接傳回。

同步io和異步io描述的是第二階段,同步io指的是資料讀寫過程由應用層來完成,而異步io指的是資料讀寫由核心來完成,并且核心在完成将資料拷貝到應用緩沖區後,通過一定機制通知通知應用程式。int recv( int socket fd, char *buf, int len, int flags)是同步接口。通過調用aio_read和aio_write可以實作異步io程式設計。(在處理io的時候,阻塞和非阻塞都是同步io,隻有使用了特殊的api才是異步io---- 陳碩)

io的同步和異步跟我們業務邏輯層面的同步和異步其實思想是一緻的。

同步:a操作等待b操作做完事情,得到傳回值,繼續處理;

異步:a操作告訴b操作感興趣的事件以及通知,然後繼續執行自己的業務邏輯,b操作監聽到相應事件後,通知a操作。

在io的同步和異步中,a操作就是應用代碼邏輯,b操作就是核心程式