IO多路复用之epoll模型

epoll是Linux操作系统特有的IO多路复用机制,它是select和poll的升级版,主要优点包括不限制文件描述符数量、事件触发模式、可复用的fd以及动态修改监听fd的能力。epoll服务器端实现涉及epoll_create、epoll_ctl和epoll_wait三个关键函数,分别用于创建epoll实例、管理文件描述符和等待事件发生。

一、IO多路复用:一个线程监测多个IO操作

        基本思想:先构造一张有关描述符的表,然后调用一个函数,当这些文件描述符中的一个或多个已经准备好进行I/O函数时才返回。函数返回时告诉进程哪个描述符已经就绪,可以进行I/O操作。

        用户进行IO操作依赖于Linux内核read()、write()函数。

二、epoll模型:

        Linux操作系统独有的,是select和poll的改良升级版。不同于select、poll的轮询机制,epoll采用的是事件驱动机制。,每个epoll对象都有一个独立的eventpoll结构体(红黑树)

优点:

1.监听的fd没有上限;

2.不用遍历,epoll是事件触发;

3.监听的fd可以复用,只需要用户调用epoll_wait就行,其他事情由内核帮助我们完成;

4.可以动态修改监听的fd,开启另一个线程对epollfd所标识的内核事件表进行epoll_ctl,会立即生效。

缺点:

1.在连接比较少时,epoll的通知机制会需要很多函数回调。这时效率不如select和poll。

2.只支持Linux操作系统,移植性不如select模型。

epoll服务器端实现需要3个函数:

  1. epoll_create:创建保存epoll文件描述符的空间(红黑树根节点,返回一个文件句柄)
  2. epoll_ctl:向空间注册、注销文件描述符
  3. epoll_wait:与select函数类似,有事件发生变化会解除阻塞。

1.epoll_create

int epoll_create(int size);
成功:返回一个操作epoll文件描述符表的句柄(文件描述符)
失败:返回-1

        Linux 2.6.8之后的内核将完全忽略传入epoll_create函数的size参数,因为内核会根据情况调整epoll例程的大小。

2.epoll_ctl

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

struct epoll_event 
    {
        uint32_t     events;      /* Epoll events */
        epoll_data_t data;        /* User data variable */
    };	

epfd:操作文件描述符表的相关句柄
op:
        EPOLL_CTL_ADD:添加事件
        EPOLL_CTL_DEL:删除事件

fd:需要注册的监视对象的文件描述符
event:操作事件的首地址(文件描述符中某个操作元素的首地址) 

 3.epoll_wait

int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);

epfd:操作文件描述符相关句柄
events:文件描述符表的首地址
maxevents:监测事件的总项数
timeout:用于超时检测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值