1、前言
在網路程式設計中,阻塞、非阻塞、同步、非同步經常被提到。unix網路程式設計第一卷第六章專門討論五種不同的io模型,stevens講的非常詳細,我記得去年看第一遍時候,似懂非懂,沒有深入理解。網上有詳細的分析:我結合網上部落格和書總結一下,加以區別,加深理解。
2、資料流向
網路io操作實際過程涉及到核心和呼叫這個io操作的程序。以read為例,read的具體操作分為以下兩個部分:
(1)核心等待資料可讀
(2)將核心讀到的資料拷貝到程序
詳細過程如下圖所示:
3、網路io模型詳細分析
常見的io模型有阻塞、非阻塞、io多路復用,非同步。以乙個生動形象的例子來說明這四個概念。週末我和女友去逛街,中午餓了,我們準備去吃飯。週末人多,吃飯需要排隊,我和女友有以下幾種方案:
(1)我和女友點完餐後,不知道什麼時候能做好,只好坐在餐廳裡面等,直到做好,然後吃完才離開。
女友本想還和我一起逛街的,但是不知道飯能什麼時候做好,只好和我一起在餐廳等,而不能去逛街,直到吃完飯才能去逛街,中間等待做飯的時間浪費掉了。這就是典型的阻塞。網路中io阻塞如下圖所示:
(2)我女友不甘心白白在這等,又想去逛商場,又擔心飯好了。所以我們逛一會,回來詢問服務員飯好了沒有,來來回回好多次,飯都還沒吃都快累死了啦。這就是非阻塞。需要不斷的詢問,是否準備好了。網路io非阻塞如下圖所示:
(3)與第二個方案差不多,餐廳安裝了電子螢幕用來顯示點餐的狀態,這樣我和女友逛街一會,回來就不用去詢問服務員了,直接看電子螢幕就可以了。這樣每個人的餐是否好了,都直接看電子螢幕就可以了,這就是典型的io多路復用,如select、poll、epoll。網路io具體模型如下圖所示:
(4)女友不想逛街,又餐廳太吵了,回家好好休息一下。於是我們叫外賣,打個**點餐,然後我和女友可以在家好好休息一下,飯好了送貨員送到家裡來。這就是典型的非同步,只需要打個**說一下,然後可以做自己的事情,飯好了就送來了。linux提供了aio庫函式實現非同步,但是用的很少。目前有很多開源的非同步io庫,例如libevent、libev、libuv。非同步過程如下圖所示:
4、同步與非同步
在處理 io 的時候,阻塞和非阻塞都是同步 io。
只有使用了特殊的 api 才是非同步 io。
實際上同步與非同步是針對應用程式與核心的互動而言的。同步過程中程序觸發io操作並等待或者輪詢的去檢視io操作是否完成。非同步過程中程序觸發io操作以後,直接返回,做自己的事情,io交給核心來處理,完成後核心通知程序io完成。同步與非同步如下圖所示:
5、阻塞與非阻塞
簡單理解為需要做一件事能不能立即得到返回應答,如果不能立即獲得返回,需要等待,那就阻塞了,否則就可以理解為非阻塞。詳細區別如下圖所示:
IO之同步 非同步 阻塞 非阻塞
stevens在文章中一共比較了五種io model blocking io nonblocking io io multiplexing signal driven io asynchronous io 由於signal driven io在實際中並不常用,所以我這只提及剩下的四種io model...
網路IO之阻塞 非阻塞 同步 非同步總結
對於乙個network io 以read為例 它會涉及到兩個系統物件,乙個是呼叫該io的process or thread 另乙個是系統核心 kernel 當乙個read操作發生時,它會經歷兩個階段 1.等待資料準備 waiting for the data to be ready 2.將資料從核心...
網路IO之阻塞 非阻塞 同步 非同步總結
1 前言 在網路程式設計中,阻塞 非阻塞 同步 非同步經常被提到。unix網路程式設計第一卷第六章專門討論五種不同的io模型,stevens講的非常詳細,我記得去年看第一遍時候,似懂非懂,沒有深入理解。網上有詳細的分析 我結合網上部落格和書總結一下,加以區別,加深理解。2 資料流向 網路io操作實際...