深入了解LINUX下IO模式(三)——Linux下的select,poll,epoll

3 篇文章 0 订阅

select,poll,epoll 是linux下的3种多路复用(java中的NIO)方式

 

他们有什么区别呢,还是直接上代码:

select:
int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

 select方式会监视所有的readFD,writeFD,exceptFD

select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制
poll:
int poll (struct pollfd *fds, unsigned int nfds, int timeout);
 poll方式中pollfd没有最大数量限制
但是!
select和poll没有太大区别,都是轮训所有的fd/pollfd来获取准备好的fd,当有大量连接的客户端时,效率会线性下降
epoll:
1)int epfd = epoll_create(intsize);       
创建一个ep句柄(/proc/进程id/fd/),用于监听所有注册的套接字,存在一个红黑树的数据结构中,这棵红黑树的存储通过mmap将内核态和用户态共享,减少用户态和内核态之间的数据交换,而select/poll每次轮训时都要将相关的句柄从内核态拷贝至用户态。(mmap,内核态用户态前面已经讲了)
2)int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
添加/修改/删除注册的套接字,由于是在红黑树中,效率较高,当事件添加时,该事件会与相应的设备(网卡)驱动程序建立回调连接,一旦事件发生(文件fd改变)相应fd会回调这个函数,将事件添加到一个rdllist(双向链表)中
事件类型:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭); EPOLLOUT:表示对应的文件描述符可以写; EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来); EPOLLERR:表示对应的文件描述符发生错误; EPOLLHUP:表示对应的文件描述符被挂断;
3)int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
3.1)调用ep_poll,当rdllist为空时挂起,一直到rdllist不为空时唤醒
3.2)ep_events_transfer函数将rdlist中的epitem拷贝到txlist中,并将rdlist清空。ep_send_events函数(很关键),它扫描txlist中的每个epitem,调用其关联fd对用的poll方法。此时对poll的调用仅仅是取得fd上较新的events(防止之前events被更新),之后将取得的events和相应的fd发送到用户空间(封装在struct epoll_event,从epoll_wait返回)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值