1. 程式人生 > >網路IO之阻塞、非阻塞、同步、非同步總結

網路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、阻塞與非阻塞

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

參考資料:

相關推薦

網路IO阻塞阻塞同步非同步總結

1、前言   在網路程式設計中,阻塞、非阻塞、同步、非同步經常被提到。unix網路程式設計第一卷第六章專門討論五種不同的IO模型,Stevens講的非常詳細,我記得去年看第一遍時候,似懂非懂,沒有深入理解。網上有詳細的分析:http://blog.csdn.net/historyasamirror/arti

【Socket程式設計】篇五IO同步非同步阻塞阻塞

參考Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2

關於網路IO中的同步非同步阻塞阻塞

在高併發程式設計當中,我們經常會遇到一些非同步、非阻塞等一些概念,一些常用的技術比如非同步的httpclient、netty nio、nginx、node.js等,它們的原理大都跟非同步、非阻塞有關。特別是在伺服器開發中,併發的請求處理是個大問題,阻塞式的函式會

網路IO-阻塞阻塞IO複用非同步

  網路socket輸入操作分為兩個階段:等待網路資料到達和將到達核心的資料複製到應用程序緩衝區。對這兩個階段不同的處理方式將網路IO分為不同的模型:IO阻塞模型、非阻塞模型、多路複用和非同步IO。本文可執行程式碼連結:https://github.com/killianxu/network_example

阻塞IO阻塞IO同步IO異步IO&&Reactor模式

app sina shu cnblogs 模式 www. htm 同步 ast 3efwzy票僭吩恫越療http://tushu.docin.com/qce8764gnfwar謐浩贅敝客偽http://jz.docin.com/vcqx427mhqxji祭摳嘆頁畔僬http

Python37 協程阻塞IO阻塞IO同步IO異步IO

python協成又稱為微線程CPU是無法識別協程的,只能識別是線程,協成是由開發人員自己控制的。協成可以在單線程下實現並發的效果(實際計算還是串行的方式)。 如果使用線程在多個函數之間進行上下文切換,那麽這個上下文的邏輯位置是保存在CPU中的,而協程也有上下文切換的操作,但是協成的上下文邏輯位置不是通過CPU

一文讀懂阻塞阻塞同步異步IO

UC max register class 掃描 基本 角度 cloud 問題: 介紹 在談及網絡IO的時候總避不開阻塞、非阻塞、同步、異步、IO多路復用、select、poll、epoll等這幾個詞語。在面試的時候也會被經常問到這幾個的區別。本文就來講一下這幾個詞

IO模型淺析-阻塞阻塞IO複用訊號驅動非同步同步IO

segmentfault 對應博文頁面 https://segmentfault.com/a/1190000016359495 最近看到OVS使用者態的程式碼,在接收核心態資訊的時候,使用了Epoll多路複用機制,對其十分不解,於是從網上找了一些資料,學習了一下《UNIX網路變成卷1:套接字聯網API》這本書

阻塞IO阻塞IO同步IO非同步IO

  再說一下IO發生時涉及的物件和步驟。對於一個network IO (這裡我們以read舉例),它會涉及到兩個系統物件,一個是呼叫這個IO的process (or thread),另一個就是系統核心(kernel)。當一個read操作發生時,該操作會經歷兩個階段: #1)

8.1 阻塞IO阻塞IO等待佇列

阻塞操作是指在執行裝置操作時若不能獲得資源則掛起程序,直到滿足可操作的條件後再進行操作。被掛起的程序進入休眠狀態,被從排程器的執行佇列移走,直到等待的條件被滿足。 非阻塞操作是指程序在不能進行裝置操作時並不掛起,它或者放棄,或者不停地查詢,直至可以進行操作為止。 //阻塞

併發程式設計並行多執行緒同步非同步多執行緒單執行緒阻塞io阻塞io

一、 cpu的每一個核在同一時間下,只能執行一個執行緒,就是單核同一時間只能執行一個執行緒 而cpu可以不停的切換,這樣就導致使用者感覺可以執行多個執行緒,這是併發,而不是並行 併發和並行 你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支

同步IO非同步IO阻塞IO阻塞IO之間的聯絡與區別

POSIX 同步IO、非同步IO、阻塞IO、非阻塞IO,這幾個詞常見於各種各樣的與網路相關的文章之中,往往不同上下文中它們的意思是不一樣的,以致於我在很長一段時間對此感到困惑,所以想寫一篇文章整理一下。 POSIX(可移植作業系統介面)把同步IO操作定義為導致程序阻塞直到

IO模型——阻塞IO阻塞IO多路複用IO非同步IOselectors模組

目錄 一、IO模型介紹   為了更好地瞭解IO模型,我們需要事先回顧下:同步、非同步、阻塞、非阻塞     同步(synchronous) IO和非同步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blo

網路程式設計中阻塞阻塞同步非同步I/O模型的理解

1. 概念理解      在進行網路程式設計時,我們常常見到同步(Sync)/非同步(Async),阻塞(Block)/非阻塞(Unblock)四種呼叫方式:同步:所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。 例如

簡述linux同步非同步阻塞阻塞概念以及五種IO模型

1、概念剖析 相信很多從事linux後臺開發工作的都接觸過同步&非同步、阻塞&非阻塞這樣的概念,也相信都曾經產生過誤解,比如認為同步就是阻塞、非同步就是非阻塞,下面我們先剖析下這幾個概念分別是什麼含義。 同步:所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必

同步非同步阻塞阻塞,以及IO模型的理解

同步和非同步 同步 就是你知道你什麼時候在做什麼,做完一件事情再做下一件事情,因此主動權在自己手裡。比如通過等待或輪詢,你在某個時間點總是知道結果是怎樣的(有資料還是沒資料等)。 非同步 就是你不知道什麼時候會發生什麼。比如你註冊了多個回撥函式,你不知道什

看看八年前的(阻塞阻塞多路複用訊號驅動非同步IO總結

尊重原創,來自八年前的IO總結https://blog.csdn.net/historyasamirror/article/details/4270633 阻塞IO: 執行過程 使用者請求資料,系統核心(kernel)開始準備資料,使用者程序被阻塞

阻塞阻塞同步非同步IO的區別

轉自知乎的某條評論……@愚抄 今天看文章發現評論中有人把IO的幾個概念講的通俗易懂,拿來和大家分享一下: 關鍵詞 阻塞同步IO 阻塞非同步IO 非阻塞同步IO 非阻塞非同步IO 段子如下: 老張愛喝茶,廢話不說,煮開水。 出場人物:老張,水壺

IO-同步非同步阻塞阻塞

1.同步與非同步 所謂同步就是一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後,依賴的任務才有可能完成(當然我們可以根據事務回滾、資料恢復等使之成為一種可靠的任務序列:要成功都成功,要失敗都失敗,兩個任務的狀態保持一致);非同步不需要等待被依賴的任務完成,只

Linux下五種I/O模型詳解(阻塞IO阻塞IOIO複用訊號驅動非同步IO

文章轉載自微信公眾號:漫話程式設計 1 什麼是I/O 程式是由資料+指令構成的,執行程式的過程可以分成下面這幾步: 1.將程式碼載入到記憶體中,逐條執行記憶體中的程式碼 2.在執行程式碼的過程中,可能需要對檔案的讀寫,即將檔案輸入(Input)