Unix/Linux下5種I/O模型

1. 五種I/O模型

在網絡編程,經常接觸下述的I/O相關的概念:

  • 同步(Synchronous)
  • 異步(Asynchronous)
  • 阻塞(Blocking)
  • 非阻塞(Non-blocking)
  • 信號驅動(Signal driven)

他們之間的關係如下圖:
io模型

引用網上一個比喻:

你打電話問書店老闆有沒有《分佈式系統》這本書,如果是同步通信機制,書店老闆會說,你稍等,”我查一下”,然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。
異步通信機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裏老闆通過“回電”這種方式來回調。
你打電話問書店老闆有沒有《分佈式系統》這本書,你如果是阻塞式調用,你會一直把自己“掛起”,直到得到這本書有沒有的結果。如果是非阻塞式調用,你不管老闆有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老闆有沒有返回結果。
在這裏阻塞與非阻塞與是否同步異步無關。跟老闆通過什麼方式回答你結果無關。

2. 阻塞I/O模型

阻塞I/O模型是最常見的I/O模型了,對於所有的“慢速設備”(socket、pipe、fifo、terminal)的I/O默認的方式都是阻塞的方式。阻塞就是進程放棄cpu,讓給其他進程使用cpu。進程阻塞最顯著的表現就是“進程睡眠了”。阻塞的時間通常取決於“數據”是否到來。


這裏寫圖片描述

3. 非阻塞I/O模型

非阻塞IO就是設置IO相關的系統調用爲non-blocaking,隨後進行的IO操作無論有沒有可用數據都會立即返回,並設置errno爲EWOULDBLOCK或者EAGAIN。我們可以通過主動check的方式(polling,輪詢)確保IO有效時,隨之進行相關的IO操作。
這種方式有一個很大的缺點就是浪費太多的CPU時間用在做輪詢上。


這裏寫圖片描述

4. 多路複用I/O模型

多路複用是讓阻塞發生在我們的多路複用IO操作的系統調用上面,而不是我們真正去執行IO的系統調用。使用這個方式的好處就是可以同時監控多個用於IO的文件描述符。


這裏寫圖片描述

5. 信號驅動I/O模型

所謂信號驅動,就是利用信號機制,安裝信號SIGIO的處理函數(進行IO相關操作),通過監控文件描述符,當其就緒時,通知目標進程進行IO操作(signal handler)。


這裏寫圖片描述

6. 異步I/O模型


這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章