網絡IO之阻塞、非阻塞、同步、異步總結

1、前言

  在網絡編程中,阻塞、非阻塞、同步、異步經常被提到。unix網絡編程第一卷第六章專門討論五種不同的IO模型,Stevens講的非常詳細,我記得去年看第一遍時候,似懂非懂,沒有深入理解。網上有詳細的分析:http://blog.csdn.net/historyasamirror/article/details/5778378。我結合網上博客和書總結一下,加以區別,加深理解。

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操作是否完成。異步過程中進程觸發IO操作以後,直接返回,做自己的事情,IO交給內核來處理,完成後內核通知進程IO完成。同步與異步如下圖所示:

5、阻塞與非阻塞

  簡單理解爲需要做一件事能不能立即得到返回應答,如果不能立即獲得返回,需要等待,那就阻塞了,否則就可以理解爲非阻塞。詳細區別如下圖所示:

 

參考資料:

http://www.open-open.com/doc/view/cbb2c3363c3b49ceb5812220a9c42e42

http://blog.csdn.net/historyasamirror/article/details/5778378

http://www.zhihu.com/question/19732473

http://www.ibm.com/developerworks/cn/linux/l-async/

冷靜思考,勇敢面對,把握未來!
分類: 網絡編程
22
0
« 上一篇:C語言棧與調用慣例
» 下一篇:IO多路複用之select總結
posted @ 2013-08-12 23:47 Anker's Blog 閱讀(33566) 評論(11) 編輯 收藏


發佈了23 篇原創文章 · 獲贊 23 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章