I/O多路复用是Linux五种I/O模型之一,其他几种分别为同步阻塞IO、同步非阻塞IO、信号驱动IO、异步IO。其中除了调用特殊的api接口之外,都是同步的。IO多路复用在Linux下目前常用有三种实现:select、poll、epoll。其中目前最为流行的就是epoll,其是在内核中维护了一颗红黑树存储socket信息,也就是要监听的socket。同时,还有一个链表负责存放发生事件的socket。调用epoll_wait函数,当监听的socket中发生事件之后,就会从epoll_wait返回发生事件的文件描述符。 除此之外,epoll还有两种模式,分别是ET和LT模式。其中ET模式就是事件只会触发一次,如果没有处理的话,下次这个事件不会再次返回。LT模式则是,这个事件没有被多次处理,下次还会返回回来。ET才是真正的高效,而LT则可以看成一个高效的Poll。但是muduo中就采用了LT模式(扩展知识,可以展开讲muduo)。 poll是一个改良版的select,这里就从select讲起。select维护了个32个整型的数组,每个数组有8位,每一位都可以表示一个文件描述符,总共也就可以监听32*32=1024个socket。当调用select监听的之前,每次都要先把这个数组清空,然后对不同的socket注册不同的感兴趣事件。当select返回的时候,我们就需要轮询这个数组,判断每个描述符其是否是发生了事件。 而poll也是这一套机制,不过其使用了一个结构体将描述符fd和感兴趣事件event联系起来,同时其突破了1024的限制,最大可监听数达到了65535。

相关推荐

10-10 16:30
济宁学院 Java
一表renzha:面试官:蓝桥杯三等奖?你多去两次厕所都能拿二等吧
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务