当前位置: 首页 > news >正文

内核aio_来分析分析IO、NIO、AIO 内部原理!

多路复用模型

  • 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模型

阻塞IO

所有的读写IO都是阻塞操作。

下面分析下 阻塞I/O、NIO、AIO的数据处理流程

阻塞I/O 数据处理流程

35e0f080031f850f3e41291add69d1ba.png

从程序调用Socket.getInputStream()方法开始一直阻塞到程序有可读数据。
阻塞期间程序不能做任何操作。由于网络的传输效率问题,程序基本上都是在等待网络数据传输,因此 阻塞I/O 效率很低。


如果客户端有多个用户同时访问服务器,我们一般会开启多线程进行处理,客户端的请求。如下图

989f0aefcf0a96b1aed48845ee33153b.png

客户端请求和服务器线程是一对一进行处理的,大量用户同时访问会造成服务器上创建大量的线程(线程上下文切换问题),可能导致服务器崩溃。

一般我们会采用线程池进行处理请求。

2. NIO 数据处理流程

999e8e4d6fa49ad8107dfbe70ec95b19.png

程序需要调用Seletor.select()方法,阻塞获取就绪的channel。然后从channel中读取数据做响应的处理。这样一个线程就可以处理多个请求,程序只需要处理已经就行的channel就ok了。

3.AIO 数据处理流程

f556962c54db9258059762efab50217c.png

程序调用AIO的accept方法并传入Completionhandler,该方法是非阻塞方法。
等数据准备完成后回调Completionhandler处理响应操作。


程序只需要把具体的操作告知AIO就可以了,具体操作AIO来帮助你来操作。
NIO 和 AIO 性能上对比


AIO在性能上相对于NIO没有本质的提升。
AIO只是帮助你从内核中将数据复制到用户空间中,并调用你传入的回调方法。
NIO 是需要程序自己从内核中将数据复制到用户空间中,并需要程序自己调用相应的处理逻辑

相关文章:

  • 安装没法点底部_该怎样安装活动冷库风机?
  • 如何用python抢票_亲测,手把手教你用Python抢票-阿里云开发者社区
  • python分布式框架celery项目开发_Python芹菜分布式并行框架,PythonCelery
  • debian vbox设置_Debian 8.0下安装配置VirtualBox
  • 为什么家里pm25比外面高_家里别挂窗帘了,越来越多人喜欢这样设计,简洁大方,真的很实用...
  • key redis 遍历_java遍历读取整个redis数据库实例
  • edit控件自动换行 mfc_MFC限制edit控件的字符输入长度
  • c++高斯投影正反算_论文推荐 | 李松林:常用海图投影平面上大椭圆航线的表象与曲率分析...
  • 影之诗闪卡动图_影之诗闪卡修改攻略咋
  • mysql设计表结构注意_数据库(表结构)设计技巧及注意事项
  • mysql 连接状态_查看mysql连接数和状态
  • centos docker mysql_CentOS7利用docker安装MySQL5.7
  • mysql max和count嵌套_mysql – 在同一个查询中使用MAX()和COUNT()
  • mysql bash profile_Mac 配置环境变量 MySQL环境变量 zshrc bash_profile
  • mysql连接到数据库服务器配置_mysql连接到数据库服务器配置
  • [case10]使用RSQL实现端到端的动态查询
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • angular组件开发
  • css布局,左右固定中间自适应实现
  • Js基础知识(四) - js运行原理与机制
  • js如何打印object对象
  • Selenium实战教程系列(二)---元素定位
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 免费小说阅读小程序
  • 面试遇到的一些题
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 使用API自动生成工具优化前端工作流
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 数组大概知多少
  • puppet连载22:define用法
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​香农与信息论三大定律
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (03)光刻——半导体电路的绘制
  • (1)(1.13) SiK无线电高级配置(六)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (四) 虚拟摄像头vivi体验
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)人的集合论——移山之道
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .Net core 6.0 升8.0
  • .NET Core引入性能分析引导优化
  • .NET Micro Framework初体验(二)
  • .net 流——流的类型体系简单介绍
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET值类型变量“活”在哪?
  • /etc/skel 目录作用
  • [20150321]索引空块的问题.txt
  • [Android]竖直滑动选择器WheelView的实现
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务