Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229639
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 407
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-27 13:42
文章分类

全部博文(41)

文章存档

2016年(1)

2015年(18)

2014年(22)

我的朋友

分类: LINUX

2015-01-06 10:34:08

    epoll API用来监控多个文件描述符中是否有准备好I/O的。
    优点:
    -- epoll在监控大量文件描述符时的性能要比select()和poll()高很多。
    -- epoll API允许水平触发和边沿触发。而select()和poll()只提供水平触发,信号驱动I/O只提供边沿触发。
    epoll和信号驱动I/O的性能差不多,但是,epoll又有一些优点:
    -- 避免信号处理的复杂性(如:信号队列溢出)
    -- 可以灵活指定监控类型(可读?可写?或都可以?)
    epoll API是基于linux2.6的,核心数据结构是与一个打开的文件描述符关联的epoll实例,该文件描述符不用于I/O,它处理用于以下用途的内核数据结构:
    -- 记录一个该进程想要监听的文件描述符列表
    -- 维护一个已经准备好I/O操作的文件描述符列表
    其中,就绪列表是兴趣列表的子集。
------------------------------------------------------
epoll事件处理
    触发性读事件:读到0说明收到了FIN;读到-1时需要判断errno,如果为EAGAIN,则说明暂时没有数据;大于1则是有数据。
    触发性写事件:如果是connect时errno为EINPROGRESS,那么其后的首次写事件就是连接建立;其他为缓冲区有一定空闲。
    对于level与edge触发模式,只是通知的区别,level会持续通知,edge对于状态的变化只会通知一次。
    连接判活:对于连接的判活可以通过recv一个字节,但是最后一个参数为MSG_PEEK,代表预取,将数据拷贝出来,但是底层缓冲区不会清掉这个字节的数据。getsockopt,SO_ERROR,判断返回以后的errno是否有相应的设置,如果没有错误,一般errno为0,否则errno就会被设置。
------------------------------------------------------
epoll API    
    #include
    int epoll_create(int size);
    创建一个epoll实例并返回一个与其关联的文件描述符。
    size表示期望该epoll实例监控的文件描述符的数量。这个值并不是上限,只是示意内核初始化多少数据结构。(2.6.8以后是被忽视的,实现上的可变性意味着这个信息没什么必要)。
    当不再需要该epoll实例时,需要像正常关闭文件描述符一样关闭其关联的描述符。
--
    更改epoll的兴趣列表:epoll_ctl()
    #include
    int epoll_ctl(int epfd, int op, struct epoll_event *ev); //ret:0 on success, or -1 on error




EPOLLLT 是默认行为,基本上就是说,只要一个文件描述符处于就绪状态,epoll 就会不停的通知你有事件发生。传统的 select/poll 都是这样的

EPOLLET 是新的方式,只在一个文件描述符新处于就绪的时候通知一次,之后不管数据有没有读完,都不会再通知,当然,有新数据到还是会通知的。所以,用 EPOLLET 的时候,一定要把文件描述符设置为 non-blocking,而且最好是一直读数据,读到返回 EAGAIN 才停下

阅读(1909) | 评论(0) | 转发(0) |
0

上一篇:链接

下一篇:nginx cache设计分析

给主人留下些什么吧!~~