专栏首页java 成神之路IO、NIO、AIO 内部原理分析

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 数据处理流程

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


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RocketMQ 同步刷盘实现原理

    java404
  • Junit 测试之 Spring Test

    java404
  • RocketMQ CommitLog 文件规则

    偏移量:每个 CommitLog 文件的大小为 1G,一般情况下第一个 CommitLog 的起始偏移量为 0,第二个 CommitLog 的起始偏移量为 10...

    java404
  • 数据解析之XPath & lxml库

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    村雨遥
  • 数据中心内的负载均衡-MPTCP

    以手机为例,手机包含两种上网方式,蜂窝移动数据网络(2G,3G,4G)和WIFI网络。我们希望在有WIFI的时候尽量使用WIFI,这样可以节省成本,没有WIFI...

    SDNLAB
  • Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)

    本篇是Android后台杀死系列的第三篇,前面两篇已经对后台杀死注意事项,杀死恢复机制做了分析,本篇主要讲解的是Android后台杀死原理。相对于后台杀死恢复,...

    看书的小蜗牛
  • 论文阅读: YOLOv3

    该文章继承了YOLOv2的bbox预测任务的方法,对bbox分类任务进行了修改 (用简单的logistic替换下softmax) 。

    JNingWei
  • 正则表达式学废了?xpath来救!

    XPath,全称XML Path Language,即XML路径语言,它是在XML语言中查找信息的语言。它最初是用来搜寻XML文档的,但是它同样适用于HTML文...

    我被狗咬了
  • JS 桥接模式

    桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化。 其实就是函数的封装,比如要对某个DOM元素添加color和backgroundC...

    前端下午茶
  • 禁止vim生成临时文件,vim 禁止生成swap文件

    最近正在开发针对文件系统的缓存系统;在进行针对vim适配POSIX接口时,发现vim进行编辑文件时会产生swap文件;虽然这是vim为防止丢失和提高性能的一种措...

    xuyaowen

扫码关注云+社区

领取腾讯云代金券