UNIX网络编程之epoll

来源:互联网 发布:sql 判断是否在一天内 编辑:程序博客网 时间:2024/05/20 19:16

以下为翻译Linux Progerammer's Manual关于epoll的描述

epoll :I/O事件通知设备

头文件:#include<sys/epoll.h>

描述:epoll是poll的一个变种,有边缘触发edge-triggered和水平触发level-triggered两种模式

管理大规模数量的文件描述符性能良好

一个epoll的实例(epoll instance)由接口epoll_create创建,返回一个文件描述符实例代表epoll实例

注册特定描述符使用epoll_ctl,注册一组描述符,有时称为epoll set

wait操作使用epoll_wait

以下一个模拟的场景用于说明epoll的边缘和水平触发

1、一个用于读的文件描述符rfd在epoll instance上注册

2、另外一边一个写的管道,写入2KB数据

3、读的一方,rfd作为准备好的读文件描述符

4、读管道从读文件描述符rfd读取1kb的数据

5、epoll_wait返回

rfd已在epoll instance中注册,使用边缘触发模式eg,第5步的epoll_wait可能在文件输入缓冲中还有数据时挂起,同时,远端节点会期待一个回应,产生这种现象的原因在于,边缘触发,epoll仅在有事件发生时通知监听的文件描述符,第四步并没有处理完2kb的数据,epoll_wait可能不正确的阻塞

使用边缘触发注意两点:1、使用非阻塞的文件描述符 2、read和write都返回EAGAIN时才使用epoll_wait

使用水平触发时,epoll相当于一个快速的poll

总结:

边缘触发,只会在可读可写事件发生时通知被监听的文件描述符,如果该次事件的缓存没有正确处理完毕,下次epoll_wait不会再次通知

水平触发,发生可读可写事件后,缓存如果有残留下次调用epoll_wait时,会再次通知

如果要限制epoll消耗的内存,可以在 /proc/sys/fs/epoll/max_user_watches中设定,该限制是每个userid的数量,注册一个对象,大概需要90b的内存,max_user_watches占4%内存

以下是常见问题:

1区别epoll set中文件描述符的依据是什么

根据描述符的数量和已打开的文件描述符决定的

2假如两次以上注册相同的文件描述符到同一个epoll instance会发生什么事情

可能会返回EEXIST,但是,允许注册文件描述符的拷贝,这是一个实用技巧,如果需要拷贝的文件描述符注册不同的事件

3两个或以上的epoll instance可以等待同一个文件描述符吗?

可以,并且事件都会通知给epoll instance

4如果一个epoll instance注册到自己的文件描述符集合中会发生什么事情

epoll_clt会失败EINVAL,但是你可以将其注册到另外一个文件描述符集合中

5我能将epoll 文件描述符传递到另外一个进程中吗?

可以,但是没有意义,接收的进程并不会拷贝epoll文件描述符对应的文件描述符集合

6关闭一个epoll文件描述符会自动清空文件描述符集合中的所有对象吗?

是的,但是要清楚认识到,只有文件描述符及其拷贝全部关闭时,文件描述符才会从epoll中释放

7不止一个事件在epoll_wait时发生,他们会被同时报道还是分开报道

同时

原创粉丝点击