多路复用IO总结

1)Libevent

        Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络。支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级,内部使用select、epoll、kqueue、IOCP等系统调用管理事件机制。libevent支持多线程编程,每个事件需要关联到自己的event_base。

2)Epoll

        epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

为什么epoll,kqueue比select高级? 

因为他们无轮询。因为他们用callback取代了。想想看,当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的。只有IOCP是asynchronous I/O,其他机制或多或少都会有一点阻塞。select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善epoll, kqueue是Reacor模式,IOCP是Proactor模式。java nio包是select模型。



猜你喜欢

转载自blog.csdn.net/mortal5/article/details/80952722