2. 彤哥說netty系列之IO的五種模型

你好,我是彤哥,本篇是netty系列的第二篇。

簡介

本文將介紹linux中的五種IO模型,同時也會介紹阻塞/非阻塞與同步/異步的區別。

何為IO模型

對於一次IO操作,數據會先拷貝到內核空間中,然後再從內核空間拷貝到用戶空間中,所以一次read操作,會經歷兩個階段:

(1)等待數據準備

(2)數據從內核空間拷貝到用戶空間

基於以上兩個階段就產生了五種不同的IO模式。

阻塞IO

從進程發起IO操作,一直等待上述兩個階段完成。

兩階段一起阻塞。

非阻塞IO

進程一直詢問IO準備好了沒有,準備好了再發起讀取操作,這時才把數據從內核空間拷貝到用戶空間。

第一階段不阻塞但要輪詢,第二階段阻塞。

多路復用IO

多個連接使用同一個select去詢問IO準備好了沒有,如果有準備好了的,就返回有數據準備好了,然後對應的連接再發起讀取操作,把數據從內核空間拷貝到用戶空間。

兩階段分開阻塞。

信號驅動IO

進程發起讀取操作會立即返回,當數據準備好了會以通知的形式告訴進程,進程再發起讀取操作,把數據從內核空間拷貝到用戶空間。

第一階段不阻塞,第二階段阻塞。

異步IO

進程發起讀取操作會立即返回,等到數據準備好且已經拷貝到用戶空間了再通知進程拿數據。

兩個階段都不阻塞。

IO模式對比

各種IO模式同比如下:

同步非同步的區別在於調用操作系統的recvfrom()的時候是否阻塞,可見除了最後的異步IO其它都是同步IO。

select poll epoll

select 有最大文件描述符的限制,只能監聽到有幾個文件描述符就緒了,得遍歷所有文件描述符獲取就緒的IO。

poll 沒有最大文件描述符的限制,與select一樣,只能監聽到有幾個文件描述符就緒了,得遍歷所有文件描述符獲取就緒的IO。

epoll 沒有最大文件描述符的限制,它通過回調的機制,一旦某個文件描述符就緒了,迅速激活這個文件描述符,當進程下一次調用epoll_wait()的時候便得到通知。

所以,在有大量空閑連接的時候,epoll的效率要高很多

彩蛋

Java中的nio使用的是哪種IO模型呢?

答:Java中的nio實際上是new io的縮寫,它使用的是多路復用的IO模型

參考

本文對IO的五種模型做了很簡短的總結,沒看懂的同學可以看看下面這篇文章,講得很詳細。

最後,也歡迎來我的公從號彤哥讀源碼系統地學習源碼&架構的知識。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

您可能也會喜歡…