IO、NIO、AIO 内部原理分析
相關文章
NIO 之 Selector實現原理
NIO 之 Channel實現原理
NIO 之 ByteBuffer實現原理
阻塞IO
所有的讀寫IO都是阻塞操作。
多路復用模型
select/poll
從程序的角度解釋:
將 channel 注冊到 seletor 上,通過輪詢channel是否就緒,將就緒的channel返回。epoll
將 channel 注冊到 selector 上,基于回調的方式(類似監聽者模式),告知selector哪些 channel 已經就緒,然后將就緒的 channel 返回。
select/poll 和 epoll 性能分析
對比 select/poll 和 epoll 我們發現epoll效率更高。
如果 select/poll 中注冊了大量的 channel,就要不停的輪詢每個channel,來判斷那些channel已經就緒。而 epoll 則不需要輪詢。
jdk1.4 是使用的 select/poll 模型
jdk1.5 以后把select/poll 改為了epoll模型
異步 I/O
只需要通知內核要執行什么操作,內核執行完成后通知你已經執行完成。
下面分析下 阻塞I/O、NIO、AIO的數據處理流程
阻塞I/O 數據處理流程
從程序調用Socket.getInputStream()方法開始一直阻塞到程序有可讀數據。
阻塞期間程序不能做任何操作。由于網絡的傳輸效率問題,程序基本上都是在等待網絡數據傳輸,因此 阻塞I/O 效率很低。
如果客戶端有多個用戶同時訪問服務器,我們一般會開啟多線程進行處理,客戶端的請求。如下圖:
客戶端請求和服務器線程是一對一進行處理的,大量用戶同時訪問會造成服務器上創建大量的線程(線程上下文切換問題),可能導致服務器崩潰。
一般我們會采用線程池進行處理請求。
2. NIO 數據處理流程
程序需要調用Seletor.select()方法,阻塞獲取就緒的channel。然后從channel中讀取數據做響應的處理。這樣一個線程就可以處理多個請求,程序只需要處理已經就行的channel就ok了。
3.AIO 數據處理流程
程序調用AIO的accept方法并傳入Completionhandler,該方法是非阻塞方法。
等數據準備完成后回調Completionhandler處理響應操作。
程序只需要把具體的操作告知AIO就可以了,具體操作AIO來幫助你來操作。
NIO 和 AIO 性能上對比
AIO在性能上相對于NIO沒有本質的提升。
AIO只是幫助你從內核中將數據復制到用戶空間中,并調用你傳入的回調方法。
NIO 是需要程序自己從內核中將數據復制到用戶空間中,并需要程序自己調用相應的處理邏輯。
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的IO、NIO、AIO 内部原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NIO 之 Selector实现原理
- 下一篇: 使用 NIO 实现 echo 服务器