bio,nio,aio的区别 select,poll,epoll的区别
先了解一些基本概念,什么是socket?什么是I/O操作
unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流
在信息交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output)
计算机里有这么多的流,我怎么知道要操作哪个流呢?对,就是文件描述符,即通常所说的fd,一个fd就是一个整数,所以,对这个整数的操作,就是对这个文件(流)的操作。我们创建一个socket,通过系统调用会返回一个文件描述符,那么剩下对socket的操作就会转化为对这个描述符的操作
然后看看一下几个概念
BIO:同步阻塞IO,一个客户端连接,对应一个服务端线程
BIO还有一种变种,伪异步IO,当有新的客户端接入时,将客户端的socket封装成一个task,丢到线程池中处理。优化了后续处理线程的方式
NIO:同步非阻塞IO
AIO:异步非阻塞IO(异步一定是非阻塞)
再看看以下几个区别
同步和异步针对应用程序来,关注的是程序中间的协作关系
阻塞与非阻塞更关注的是单个进程的执行状态
再看看I/O处理的过程
数据通过网关到达内核,内核准备好数据
数据从内核缓存写入用户缓存
再来讲讲同步异步就清晰了
同步:不管是BIO,NIO,还是IO多路复用,从内核缓存写入用户缓存一定是由 用户线程自行读取数据,处理数据
异步:数据是内核写入的,并放在了用户线程指定的缓存区,写入完毕后通知用户线程
阻塞:数据从网关写到内核,如果没写好,线程就一直在等待
非阻塞:数据总网关写到内核,用一个线程轮询的去查看所有的数据是否准备好(I/O多路复用,监听多个socket)
再来看看I/O多路复用的三种形式
select:知道了有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长
poll:本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的
epoll(Linux内核所特有):可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))(Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll)
注意:表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调
最后回来看看java内核的NIO的实现
缓冲区Buffer
缓冲区实际上是一个数组,封装了对数据结构化访问以及维护读写位置等信息
在NIO库中,所有数据都是用缓冲区处理的,在读取数据时,直接读取到缓冲区。写入数据时,直接写入写缓冲区。任何时候访问NIO中的数据,都是 通过缓冲区进行操作
最常用的的缓冲区是ByteBuffer。大部分Java基本类型都对应一种缓冲区
通道channel
Channel 是一个通道,可以通过它读取和写入数据。InputStream和OutputStream各自只能在一个方向上操作
Channel是全双工的,所以它可以比流更好地映射底层的api
多路复用器Selector
Selector是NIO的编程基础。多路复用器提供选择已经就绪的任务的能力
Selector会不断轮询注册在其上的Channel,如果channel上面有了新的TCP连接、读取或者写事件,这个channel就是就绪状态,会被Selector轮询出来。然后通过SelectionKey集合可以获取就绪的Channel集合,进行IO操作
一个Selector可以同时轮询多个Channel,由于JDK使用了epoll()代替传统的select实现,所以没有最大连接句柄1024/2048的限制。这意味着只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端
NIO服务端序列图
NIO客服端序列图
简单版本的交互图
bio,nio,aio的区别 select,poll,epoll的区别的更多相关文章
- select.poll,epoll的区别与应用
		
先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...
 - 最快理解 - IO多路复用:select / poll / epoll 的区别.
		
目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...
 - python select  poll epoll的区别
		
select 优点:为最早的异步io处理模块,他可以再linux上和windows上使用,跨平台兼容性好,而poll和epoll都不能在windows系统环境中使用. 缺点:select的机制决定了他 ...
 - select,poll,epoll的归纳总结区分
		
Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...
 - 转--select/poll/epoll到底是什么一回事
		
面试题:说说select/poll/epoll的区别. 这是面试后台开发时的高频面试题,属于网络编程和IO那一块的知识.Android里面的Handler消息处理机制的底层实现就用到了epoll. 为 ...
 - 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!
		
系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...
 - (转)也谈BIO | NIO | AIO (Java版)
		
原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...
 - 也谈BIO | NIO | AIO (Java版--转)
		
关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...
 - IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
		
有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...
 
随机推荐
- 调整Linux终端显示分辨率
			
linux 默认cli (command line interface)分辨率一般都比较小,显示的字体很大,不太美观,有时还影响结果的显示(例如出现kernel panic).所以有必要改变一下cli ...
 - os x 技巧: 关闭打字时候光标闪烁
			
关闭光标闪烁: defaults write -g NSTextInsertionPointBlinkPeriodOff -float 0 defaults write -g NSTextInsert ...
 - Object Creation
			
Although using the object constructor or an object literal are convenient ways to create single obje ...
 - 利用jquery的淡入淡出函数(fadeIn和fadeOut)--实现轮播
			
首先说下,我在网上找的例子全是用的UL 实现,其实大可不必,只要是能包含img标签的HTML标签都可以做轮播效果.利用jquery的淡入淡出函数(fadeIn和fadeOut).废话也不多说,边上代码 ...
 - debian 10 "Buster"正式发布了
			
Debian Buster将从内核4.9.0.3升级到4.19.0-4.
 - win10更新导致chrome打开网页速度太慢
			
升级win10之后如果出现chrome内核的浏览器网页总是打不开 打开很慢 而ie和edge是可以正常访问的 用这个方法可以 我弄了几天终于 搞好了 我直接转载过来了 近期,工程师收到大量反馈360浏 ...
 - upd通讯Recvfrom设置阻塞不起作用
			
把自己踩到的坑记录一下,在做UDP通讯的时候,发现自己的程序没有收数据居然也有百分之十二的cpu占用率,通过性能分析工具了解到时recvfrom函数一直在执行,虽然设置阻塞并且确认成功了, ;//阻塞 ...
 - windeployqt.exe 发布windows下qt产生的exe程序
			
以官方 Qt 5.4.0+MinGW 开发环境为例,从开始菜单-->Qt 5.4.0-->5.4-->MinGW 4.9 (32-bit)-->Qt 5.4 for Deskt ...
 - 索引之----mysql单列索引失效的情况
			
使用的索引名称: 1.隐式转换导致索引失效. 由于表字段定义为vachar类型,但在查询时把该字段作为number类型 以及where条件传给mysql. 2.对索引列进行任何操作(计算(+.-.*. ...
 - BZOJ 1053 反素数 题解
			
题面 引理1: 1~n中的最大反质数,就是1~n中约数个数最多的数中最小的一个(因为要严格保证g(x)>g(i)): 引理2:1~n中任何数的不同因子不会超过10个,因为他们的乘积大于2,00 ...