相关文章
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 数据处理流程
Paste_Image.png
从程序调用Socket.getInputStream()方法开始一直阻塞到程序有可读数据。
阻塞期间程序不能做任何操作。由于网络的传输效率问题,程序基本上都是在等待网络数据传输,因此 阻塞I/O 效率很低。
如果客户端有多个用户同时访问服务器,我们一般会开启多线程进行处理,客户端的请求。如下图:
Paste_Image.png
客户端请求和服务器线程是一对一进行处理的,大量用户同时访问会造成服务器上创建大量的线程(线程上下文切换问题),可能导致服务器崩溃。
一般我们会采用线程池进行处理请求。
2. NIO 数据处理流程
NIO 实现原理
程序需要调用Seletor.select()方法,阻塞获取就绪的channel。然后从channel中读取数据做响应的处理。这样一个线程就可以处理多个请求,程序只需要处理已经就行的channel就ok了。
3.AIO 数据处理流程
AIO 实现原理
程序调用AIO的accept方法并传入Completionhandler,该方法是非阻塞方法。
等数据准备完成后回调Completionhandler处理响应操作。
程序只需要把具体的操作告知AIO就可以了,具体操作AIO来帮助你来操作。
NIO 和 AIO 性能上对比
AIO在性能上相对于NIO没有本质的提升。
AIO只是帮助你从内核中将数据复制到用户空间中,并调用你传入的回调方法。
NIO 是需要程序自己从内核中将数据复制到用户空间中,并需要程序自己调用相应的处理逻辑。
文章来源于互联网:IO、NIO、AIO 内部原理分析
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/17152,转载请注明出处。
评论0