bio是什么意思(nio是什么意思)
Io模型在学习netty之前,你需要了解一下JAVA的io模型,因为netty是基于NIO封装的 。简单来说,IO模型就是用什么通道来发送数据 。在JAVA中,有三种类型,即BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞) 。
BIO生物同步阻塞,比如有一个场景,有10个水壶在烧水,有一个线程停留在水壶A,直到水壶A烧开,也就是同步阻塞 。其他水壶都在堵着等水壶a,当然这里也可以优化 。我们可以同时启动10个线程烧水,但这次劣势很明显,相当于每人一个 。在BIO场景中,读操作是一个阻塞操作 。
image.png
NIONIO同步是非阻塞的 。服务器实现模式是一个线程可以处理多个请求(连接)或者和上面烧水一样的例子 。NIO的工作模式是外部只启动一个线程,然后这个线程不断轮询所有的水壶,看水是否开了 。这时候就会出现一个问题,就是假设有1W个水壶组,这个单线程每次都需要轮询这些1W个水壶组,性能会比较低,会有大量的无效遍历 。因此,此时将引入多路选择器(Selector.open()) 。当每个客户端连接到服务器时,事件将通过通道注册到选择器上 。注册将返回selectionkey和channel channel之间的绑定 。当客户端有新事件时,选择器会通过遍历selectionkey来处理事件的事件类型,selection key是伪代码 。
while(true){ // // 阻塞等待需要处理的事件发生 selector.select(); Iterator selectorlist=selector.iterator(); while(iterator.next()){ if(读事件){ }else if(连接事件){ } }}image.png
linux epoll函数上图有几个关键方法:
Selector.open() //创建多路复用器由于我们的生产应用程序通常部署在linux环境中,这种方法不同于windows环境中看到的jdk源代码 。在linux环境中,最终执行epoll_create(256)函数来创建一个epoll实例,并返回一个非负数作为对epoll接口的所有后续调用的文件描述符 。
socketChannel.register(selector, SelectionKey.OP_READ) //将channel注册到多路复用器上对应linux函数intepoll _ CTL (intepfd,intop,intfd,structe poll _ event * event);对文件进行相关操作,如ADD/MOD/DEL 。
selector.select() //阻塞等待需要处理的事件发生linux函数int epoll _ wait (int epfd,struct epoll _ event * events,int max events,int time out);等待文件描述符事件发生 。
由于调用了linux的所有内核函数,并且采用了事件通知的方法,每当一个IO事件就绪,就会调用系统注册的回调函数 。O(1)redis模型的时间复杂度也是基于epoll的NIO模型 。epoll实例收集连接、读取和写入事件,服务器线程持续处理所有事件 。
AIOAIO——异步非阻塞,由客户端回调,通知服务器端程序启动线程进行处理 。一般适用于连接较多,连接时间较长的应用 。以开水为例 。不是启动一个线程来轮询所有水壶,而是在每个水壶上安装一个开关 。水一开,开关就发出声音通知我关火 。
三者对比【bio是什么意思(nio是什么意思)】从网上借一张图
image.png
0个人喜欢它
内蒂·杜博
推荐阅读
- 18年是什么年(乙丑月出生女命)
- ka什么意思(什么叫KA)
- hate什么意思(clos是什么意思中文)
- 中抓是什么意思(中抓圈cv大神有哪些)
- hy是什么意思(hy能拼出什么名字)
- 2k是什么意思(21比9分辨率分别是多少)
- 脉动什么梗(果冻是什么暗语)
- sub什么意思(怎么跟sub聊天)
- cl什么意思(cl和分手有什么关系)
- 火是什么(火属于什么结构)