码迷,mamicode.com
首页 > 其他好文 > 详细

IO、NIO、AIO 内部原理分析

时间:2018-11-17 23:51:03      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:sele   strip   ast   paste   jdk1.5   image   channel   jdk1.4   效率   

阻塞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 是需要程序自己从内核中将数据复制到用户空间中,并需要程序自己调用相应的处理逻辑。



转自:https://www.jianshu.com/p/60d584aeea13

IO、NIO、AIO 内部原理分析

标签:sele   strip   ast   paste   jdk1.5   image   channel   jdk1.4   效率   

原文地址:https://www.cnblogs.com/AnXinliang/p/9976270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!