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的五種模型做了很簡短的總結,沒看懂的同學可以看看下面這篇文章,講得很詳細。
https://segmentfault.com/a/1190000003063859
最後,也歡迎來我的公從號彤哥讀原始碼系統地學習原始碼&架構的知識。