epoll实现原理

epoll的使用

epoll只有以下的三个系统函数调用: epoll_create,epoll_ctl和epoll_wait:
int epoll_create(int size);其中参数:
(1)size指明了生成描述符的最大范围;
该函数返回一个epoll专用的描述符(fd)

int epoll_ctl(int epfd,int op, int fd, struct epoll_event *event);其中参数:
(1)epfd:由 epoll_create 生成的epoll专用的文件描述符;
(2)op:要进行的操作,可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修改、EPOLL_CTL_DEL 删除;
(3)fd:关联的文件描述符;
(4)event:指向epoll_event的指针;
如果调用成功则返回0,不成功则返回-1。
结构体epoll_event 被用于注册所感兴趣的事件和回传所发生待处理的事件。epoll_event 结构体的events字段是表示感兴趣的事件和被触发的事件,可能的取值为:
EPOLLIN: 表示对应的文件描述符可以读;
EPOLLOUT: 表示对应的文件描述符可以写;
EPOLLPRI: 表示对应的文件描述符有紧急的数据可读;
EPOLLERR: 表示对应的文件描述符发生错误;
EPOLLHUP: 表示对应的文件描述符被挂断;
EPOLLET: 表示对应的文件描述符有事件发生;
参考代码如下:

 struct epoll_event ev;
 ev.data.fd = socketXxx;          //设置与要处理的事件相关的文件描述符
 ev.events = EPOLLIN | EPOLLET;  //设置要处理的事件类型
 epoll_ctl(epfd, EPOLL_CTL_ADD, socketXxx, &ev);    //注册epoll事件

int epoll_wait(int epfd, structepoll_event * events, int maxevents, int timeout);其中参数:
(1)epfd:由epoll_create 生成的epoll专用的文件描述符;
(2)epoll_event:用于回传代处理事件的数组;
(3)maxevents:每次能处理的事件数;
(4)timeout:等待I/O事件发生的超时值;
该函数返回发生事件fd的个数。

epoll的实现原理介绍

epoll的内部处理过程主要可以分四个步骤:
1,调用epoll_create()函数,创建epoll句柄eventpoll。该eventpoll内部包含了:一个红黑树rbtree,一个就绪链表rdlist;
2,调用epoll_ctl(EPOLL_CTL_ADD…)将所关心fd的关心事件注册到epoll的rbtree上,(当然也有可能是修改或删除),并注册关心事件的回调函数(如add函数,将就绪fd添加到rdlist)
3,一旦设备(如网卡)有关心事件发生,对应的注册回调函数被触发,就绪fd被添加到rdlist;
4,用户程序调用epoll_wait(),返回rdlist,并对其中的fd做相应处理。
具体过程如下图所示:
在这里插入图片描述

epoll的并发量限制

epoll所能处理的最大并发限制比较多:
(1)Linux中单个进程所能打开的文件描述符fd有最大限制,比如默认的1024,这其中还包含如标准输入,标准输出等必须打开的fd。这个限制可以通过修改Linux配置加以宽松
(2)Linux系统所能打开描述符的最大数量有限制,比如12158。这个一般也可以修改。
(3)socket的端口范围有限制,如32768或65535,其中还需要将通用端口排除在外(根本没有这个限制,服务端accept返回的socket不会占用端口!)
(4)IP_TABLE防火墙在内核中对每个TCP连接进行跟踪,因此其最大跟踪个数也是一个限制。配置可修改。
(5)内存限制。每个socket在内核中都会有发送和接收缓存区,最小为4K,用户接收这些数据也要相同的内存。
因此4*4K=16K,每个socket最最少需要耗费16k内存,因此如果机器是一台4G的PC,其极限并发数目为:4G/16k=26.2W。具体可以参考这篇博文:https://www.jb51.net/LINUXjishu/346080.html

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值