LINUX下常見的IO模型

前言

  • 阻塞IO(blocking IO)
  • 非阻塞IO(nonblocking IO)
  • IO複用(IO multiplexing)
  • 異步IO(asynchronous IO (the POSIX aio_functions))

前三種都是同步,只有最後一種纔是異步IO。html

1、阻塞IO

簡介:進程會一直阻塞,直到數據拷貝完成。
應用程序調用一個IO函數,致使應用程序阻塞,等待數據準備好。若是數據沒有準備好,一直等待。數據準備好了,從內核拷貝到用戶空間。
執行完畢後,IO函數會嚮應用程序返回成功響應,應用程序獲得響應後,就再也不阻塞,並進行後面的工做。
網絡中IO阻塞以下圖所示:

示例:
餐廳吃飯,點完餐後,只能坐在餐廳裏面等作好飯,吃完才能去逛商場,中間等待作飯的時間浪費掉了。這就是阻塞。linux

2、非阻塞IO

簡介:非阻塞IO經過進程反覆調用IO函數(屢次系統調用,並立刻返回);在數據拷貝的過程當中,進程是阻塞的。
應用程序調用一個IO函數,這個IO操做會從內核中當即返回(當IO操做沒法完成時,返回一個錯誤)。可是這個IO函數具體要執行的事情(寫數據)可能並無完成。
而對於應用程序,雖然這個IO操做很快就返回了,可是它並不知道這個IO操做是否真的成功了。爲了知道IO操做是否成功,通常有兩種策略:
一是須要應用程序主動地循環地去問,直到數據準備好爲止,在這個不斷問的過程當中,會大量的佔用CPU的時間;
二是採用IO通知機制,好比:IO多路複用或信號驅動IO。
網絡IO非阻塞以下圖所示:

示例:
又想去逛商場,又擔憂飯好了。因此逛一會,回來詢問服務員飯好了沒有,來來回回好屢次。這就是非阻塞。小程序

3、IO多路複用

簡介:比阻塞IO並無什麼優越性,關鍵是能實現同時對多個IO端口進行監聽。
IO複用模型會用到select、poll、epoll函數,這幾個函數也會使進程阻塞,可是和阻塞IO所不一樣的,這兩個函數能夠同時阻塞多個IO操做。並且能夠同時對多個讀操做,多個寫操做的IO函數進行檢測,直到有數據可讀或可寫時,才真正調用IO操做函數。
網絡IO多路複用以下圖所示:

示例:
商場安裝了電子屏幕用來顯示點餐的狀態,這樣飯是否好了,都直接看電子屏幕就能夠了。這就是IO多路複用。微信小程序

4、異步IO

簡介:告知內核啓動某個操做,並讓內核在整個操做完成後通知咱們;數據拷貝的時候進程無需阻塞。
當一個異步過程調用發出後,調用者不能馬上獲得結果,實際處理這個調用的函數在完成後,經過狀態、通知和回調來通知調用者的輸入輸出操做。
linux提供了AIO庫函數實現異步,可是用的不多。目前有不少開源的異步IO庫,例如libevent、libev、libuv。
網絡異步IO以下圖所示:

示例:
叫外賣,只須要打個電話說一下,而後能夠作本身的事情,飯好了就送來了。這就是異步。

小結:
同步IO引發進程阻塞,直至IO操做完成。
異步IO不會引發進程阻塞。
IO複用是先經過select調用阻塞。
阻塞IO、非阻塞IO、多路複用IO都屬於同步IO,異步一定是非阻塞的,因此不存在異步阻塞和異步非阻塞的說法。由於其中真正的IO操做(函數)都將會阻塞進程,只有異步IO模型真正實現了IO操做的異步性。安全

查看更多:
開發一個微信小程序實例教程微信

HTTP協議整理網絡

PHP安全之Web攻擊異步

秒殺系統設計優化async

MySQL優化
函數

 

參考資料:

http://www.cnblogs.com/Anker/p/3254269.html
http://www.cnblogs.com/Anker/p/5965654.html

相關文章
相關標籤/搜索