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

说一说BIO、NIO(select、poll、epoll),第1张

说一说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调用。

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5673104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存