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

一、前言linux

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

二、數據流向網絡

  網絡IO操做實際過程涉及到內核和調用這個IO操做的進程。以read爲例,read的具體操做分爲如下兩個部分:異步

  (1)內核等待數據可讀函數

  (2)將內核讀到的數據拷貝到進程.net

詳細過程以下圖所示:unix

三、網絡IO模型詳細分析blog

  常見的IO模型有阻塞、非阻塞、IO多路複用,異步。以一個生動形象的例子來講明這四個概念。週末我和女朋友去逛街,中午餓了,咱們準備去吃飯。週末人多,吃飯須要排隊,我和女朋友有如下幾種方案:進程

  (1)我和女朋友點完餐後,不知道何時能作好,只好坐在餐廳裏面等,直到作好,而後吃完才離開。get

女朋友本想還和我一塊兒逛街的,可是不知道飯能何時作好,只好和我一塊兒在餐廳等,而不能去逛街,直到吃完飯才能去逛街,中間等待作飯的時間浪費掉了。這就是典型的阻塞。網絡中IO阻塞以下圖所示:

  (2)我女朋友不甘心白白在這等,又想去逛商場,又擔憂飯好了。因此咱們逛一會,回來詢問服務員飯好了沒有,來來回回好屢次,飯都還沒吃都快累死了啦。這就是非阻塞。須要不斷的詢問,是否準備好了。網絡IO非阻塞以下圖所示:

  (3)與第二個方案差很少,餐廳安裝了電子屏幕用來顯示點餐的狀態,這樣我和女朋友逛街一會,回來就不用去詢問服務員了,直接看電子屏幕就能夠了。這樣每一個人的餐是否好了,都直接看電子屏幕就能夠了,這就是典型的IO多路複用,如select、poll、epoll。網絡IO具體模型以下圖所示:

  (4)女朋友不想逛街,又餐廳太吵了,回家好好休息一下。因而咱們叫外賣,打個電話點餐,而後我和女朋友能夠在家好好休息一下,飯好了送貨員送到家裏來。這就是典型的異步,只須要打個電話說一下,而後能夠作本身的事情,飯好了就送來了。linux提供了AIO庫函數實現異步,可是用的不多。目前有不少開源的異步IO庫,例如libevent、libev、libuv。異步過程以下圖所示:

四、同步與異步

  實際上同步與異步是針對應用程序與內核的交互而言的。同步過程當中進程觸發IO操做並等待或者輪詢的去查看IO操做是否完成。異步過程當中進程觸發IO操做之後,直接返回,作本身的事情,IO交給內核來處理,完成後內核通知進程IO完成。同步與異步以下圖所示:

五、阻塞與非阻塞

  簡單理解爲須要作一件事能不能當即獲得返回應答,若是不能當即得到返回,須要等待,那就阻塞了,不然就能夠理解爲非阻塞。詳細區別以下圖所示:

相關文章
相關標籤/搜索