epoll API接口 - 访问方式(三)

select和poll是基本的多路I/O复用方式,两种方式可以在并发量较少的场景中使用,两者之前的区别如下:

  1. 区别1:select使用的是定长数组,而poll是通过用户自定义数组长度的形式(pollfd[])。
  2. 区别2:select只支持最大fd < 1024,如果单个进程的文件句柄数超过1024,select就不能用了。poll在接口上无限制,考虑到每次都要拷贝到内核,一般文件句柄多的情况下建议用epoll。
  3. 区别3:select由于使用的是位运算,所以select需要分别设置read/write/error fds的掩码。而poll是通过设置数据结构中fd和event参数来实现read/write,比如读为POLLIN,写为POLLOUT,出错为POLLERR:
  4. struct pollfd pfd;
    pfd.fd = fd;
    pfd.events = POLLIN;
    pfd.revents = 0;
  5. 区别4:select中fd_set是被内核和用户共同修改的,所以要么每次FD_CLR再FD_SET,要么备份一份memcpy进去。而poll中用户修改的是events,系统修改的是revents。所以参考muduo的代码,都不需要自己去清除revents,从而使得代码更加简洁。
  6. 区别5:select的timeout使用的是struct timeval *timeout,poll的timeout单位是int。
  7. 区别6:select使用的是绝对时间,poll使用的是相对时间。
  8. 区别7:select的精度是微秒(timeval的分度),poll的精度是毫秒。
  9. 区别8:select的timeout为NULL时表示无限等待,否则是指定的超时目标时间;poll的timeout为-1表示无限等待。所以有用select来实现usleep的。
  10. 区别9:理论上poll可以监听更多的事件,比如sysroot/usr/include/asm-generic/poll.h中有

select 与 poll 的区别
1 、 io 多路复⽤:
1 、概念: IO 多路复⽤是指内核⼀旦发现进程指定的⼀个或者多个 IO 条件准备读取,它就通知该进程。
2 、优势:与多进程和多线程技术相⽐, I/O 多路复⽤技术的最⼤优势是系统开销⼩,系统不必创建进程 / 线程,也不必维护这些进
程 / 线程,从⽽⼤⼤减⼩了系统的开销。
3 、系统:⽬前⽀持 I/O 多路复⽤的系统调⽤有 select , pselect , poll , epoll 。
2 、 select : select ⽬前⼏乎在所有的平台上⽀持,其良好跨平台⽀持也是它的⼀个优点。 select 的⼀个缺点在于单个进程能够监视的
⽂件描述符的数量存在最⼤限制,在 Linux 上⼀般为 1024 ,可以通过修改宏定义甚⾄重新编译内核的⽅式提升这⼀限制,但是这样也
会造成效率的降低。
3 、 poll :它没有最⼤连接数的限制,原因是它是基于链表来存储的,但是同样有⼀个缺点:
a. ⼤量的 fd 的数组被整体复制于⽤户态和内核地址空间之间,⽽不管这样的复制是不是有意义。
b. poll 还有⼀个特点是“⽔平触发”,如果报告了 fd 后,没有被处理,那么下次 poll 时会再次报告该 fd 。

在大量并发存在的类似网络设备读写的情况下,select和poll没有办法满足当前的数据基本要求,衍生出现在的epoll机制。

一、主要接口
int epoll_create(int size);
 创建 epoll 对象,创建一颗空的红黑树,一个空双向链表。

int epoll_ctl(int epid, int op, int sockid, struct epoll_event *event);
向 epoll 对象里面的红黑树中增加、删除、修改指定的节点。

int epoll_wait(int epid, struct epoll_event *events, int maxevents, int timeout);
 等待双向链表中是否有节点,若有节点则取得不大于 maxevents 数量的节点并放入 events 中,最后返回。

int epoll_event_callback(struct eventpoll *ep, int sockid, uint32_t event)
有显卡驱动调用,判断当前事件(建立连接、断开连接、读写数据)对应的 socket 是否已经在红黑树中挂号,如果是,则将新的事件保存到对应的红黑树节点中并更新到双向链表中。 

二、原理说明
1、上文在说明函数功能时提到了两个 epoll 核心结构:红黑树 和 双向链表 。

红黑树的功能是保存待监控的 socket 以及其事件的信息。
双向链表的功能是保存就绪的 socket 以及其事件的信息。
2、eventpoll 和 红黑树、双向链表的关系图如下所示:

 

2. 网络实例实现epoll

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值