栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

说一说BIO、NIO(select、poll、epoll)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

说一说BIO、NIO(select、poll、epoll)

         BIO(blocking)属于同步阻塞IO:监听端口调用accept一直阻塞直到有客户端连接才会继续往下走,随后对该客户端的请求进行R/W操作最终返回,在处理当前客户端请求时其他到来的请求都需要等待当前请求处理完毕才能继续。

        缺点:当大量请求到达时等待时间过长会造成请求超时现象。为了解决阻塞导致请求超时现象,出现了非阻塞IO。

        NIO(non-blocking)同步非阻塞IO:监听端口调用accept不会一直阻塞着等待客户端连接,而是每次轮询,当返回值为-1时代表当前没有客户端连接。当客户端连接时即可获取到连接对象,同时在处理客户端请求时可以抛出线程去执行,从而不会导致程序阻塞。

        缺点:每次读取客户端连接请求都要进行一次用户态到内核态,内核态返回用户态的转换浪费系统资源。所以出现了多路复用模型。

        SELECT(多路复用)同步非阻塞IO:SELECT是一种规范在POSIX中,在各个系统中都有实现。其原理是当监听端口调用select时会传入想要查询的fd数量,从而返回可以进行操作的有效的客户端连接。这样可减少用户态内核态的转换减少浪费系统资源。

        缺点:SELECT一次请求fd的数量是有限制的每次最多只能请求1024个fd。所以出现了其优化版本POLL。

        POLL(多路复用)同步非阻塞IO:与SELECT原理相同,去掉了1024文件描述符限制,采用链表方式进行存储。

        缺点:与传统IO相比是减少了用户态内核态的交互,将筛选fd状态的轮询放到了内核中进行,但依旧采用了轮询的方式。因此在linux中出现了EPOLL。

        EPOLL(多路复用)同步非阻塞IO:与之前的IO模型相比,EPOLL有了非常大的优化,目前市面上很多比较火的工具都采用的是EPOLL的模型,如netty。此模型主要有三个方法组成:epoll_create,epoll_ctl,epoll_wait。首先将监听端口放到epoll_create中返回epfd,然后调用epoll_ctl的add方法加入到内核中epfd开辟的空间中,此空间内部接口为红黑树。eopll还会在内核中开辟另一块空间来进行存储可以操作的fd,内部接口为链表。随后调用epoll_wait从链表中获取可操作的fd。而链表中的fd是通过系统调用来进行存贮的,采用终端向量表的80号变量(软中断)当客户端连接时触发软中断并调用其设置的回调函数,将客户端的信息去epfd中比对,并且拷贝到链表空间中,等待epoll_wait调用。

理解之上,写出想要说的话!

以上仅为个人拙见,写出来加深记忆,错误之处欢迎大神指正!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667846.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号