epoll专题

Epoll专题讲座 技术研究部开发三组:邹加城 目录 什么是IO多路复用? Select EPOLL Epoll的优点有哪些? Epoll的两种工作模式 Epoll的具体操作 Epoll的事件类型 编程注意事项 什么是IO多路复用? 我们知道利用介质的位传输率大于传输一路信号的能力这一特性,将多路信号同时在同一介质上传输(复用)的技术称为多路复用技术。这个解释来自无线,但是对我们也一样,就是将多个数据放在一个IO中进行传输我们称之为IO多路复用. 要想完全理解I/O多路复用,我们先了解五种I/O模型: 阻塞I/O模型 我们已TCP通讯为例当进程调用recv函数,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回,期间一直在等待。我们就说进程在从调用recv开始到它返回的整段时间内是被阻塞的。 非阻塞I/O模型 进程把一个套接口设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。也就是说当数据没有到达时并不等待,而是以一个错误返回。 I/O复用模型 调用select或poll,在这两个系统调用中的某一个上阻塞,而不是阻塞于真正I/O系统调用。 阻塞于select调用,等待数据报套接口可读。当select返回套接口可读条件时,调用recev将数据报拷贝到应用缓冲区中。 信号驱动I/O模型 首先开启套接口信号驱动I/O功能, 并通过系统调用sigaction安装一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据报准备好被读时,就为该进程生成一个SIGIO信号。随即可以在信号处理程序中调用recv来读数据报,并通知主循环,让它来读数据。 异步I/O模型 告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核拷贝到用户自己的缓冲区)通知我们。这种模型与信号驱动模型的主要区别是: ?????????? 信号驱动I/O:由内核通知我们何时可以启动一个I/O操作, ?????????? 异步I/O模型:由内核通知我们I/O操作何时完成 I/O多路复用的典型应用场合 当客户处理多个描述字时,必须使用I/O复用 如果一个服务器要处理多个服务或者多个协议(例如既要处理TCP,又要处理UDP),一般就要使用I/O复用。 支持I/O复用的系统调用 目前在linux下支持I/O复用的系统调用有select、poll、epoll: select int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); readfds:用于存放我们要检测的可读的文件描述符 writefds:用于存放我们要检测的可写的文件描述符 exceptfds:用于存放我们要检测的是否发生异常的文件描述符 Timeout:用于设置超时 SELECT的操作调用 FD_SET(int fd, fd_set *set); 将一个文件描述符加入到文件描述符集合里 FD_CLR(int fd, fd_set *set); 删除一个文件描述符 FD_ISSET(int fd, fd_set *set); 判断文件描述符是否在这个集合里 FD_ZERO(fd_set *set); FD_ZERO是将这个集合清零。 EPOLL epoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPUs利用率。 Epoll的优点 支持一个进程打开最大数目的socket描述符为一个进程最大能打开的文件数量. 我们可以用cat /proc/sys/fs/file-max 命令来查看而select能打开的最大数目为1024.其实这个值也可以通过修改linux/posix_types.h这个配置文件再重新编译内核来改变。 IO效率不随FD数目增加而线性下降 传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合,不过由于网络延时,任一时间只有部分的socket是“活跃”的,但是select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。但是epoll不存在这个问题,它只会对“活跃”的socket进行操作 。 加速内核与用户空间的消息传递 无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。 思考? 从epoll的优点来看我觉得他完

文档评论(0)

1亿VIP精品文档

相关文档