I/O复用-epoll模型

epoll函数

epoll函数的使用与select、poll上有很大的差异.

  • epoll使用一组函数来完成任务,而不是单个函数.
  • epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无需每次都要重复传入文件描述符集或者事件集.
  • epoll需要一个额外的文件描述符,来唯一标示内核中的这个事件表.

epoll函数

#include <sys/epoll.h>
 int epoll_create(int size);  //size并不起作用,只是给内核一个提示,告诉它事件表需要多大.

下面函数用来操作epoll的内核事件表

#include <sys/epoll.h>
int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event);
/*fd参数是要操作的文件描述符,op指定操作类型*/

op操作类型有如下3种:

  • EPOLL_CTL_ADD  往事件表中注册fd上的事件.
  • EPOLL_CTL_MOD  修改事件表中的注册事件.
  • EPOLL_CTL_DEL  s删除fd上的注册事件.

event参数指定事件,它是epoll_event结构指针类型.epoll_event的定义如下:

struct epoll_event{
   __uint32_t events;  /*epoll事件*/
   epoll_data_t data;   /*用户数据*/
};

其中events成员描述事件类型,它与poll模型的事件类型基本相同.只是要在其类型前面加上"E",比如EPOLLIN.但epoll有两个额外的事件类型-EPOLLINET和EPOLLONESHOT,它们对于epoll的高效运作非常关键.具体请查阅资料.

data成员用于存储用户数据,其类型epoll_data_t的类型如下:

typedef union epoll_data{
        void* ptr;
         int    fd;
         uint32_t u32;
         uint64_t u64;
}epoll_data_t;

epoll_data_t是一个联合体,其4个成员中使用最多的是fd.

epoll_ctl成功时返回0,失败则返回-1并设置errno.

epoll_wait函数

#include <sys/epoll.h>
int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);

函数成功时返回就绪的文件描述符的个数,失败时返回-1并设置errno.

epoll_wait函数如果检测到事件,就将所有就绪的事件从内核事件表中(由epfd参数指定)中复制到它的第二个参数events指向的数组中.这个数组只用于输出epoll_wait检测到的就绪事件,而不像select和poll的数组参数那样既用于传入用户注册的事件,又用于输出内核检测到的就绪事件.这样极大的提高了应用程序索引就绪文件描述符的效率.

poll和epoll在使用上的差别

/*如何索引poll返回的就绪文件描述符*/
int ret=poll(fds,MAX_EVENT_NUMBER,-1);
/*必须遍历所有已注册文件描述符并找到其中的就绪*/
for(int i=0;i<MAX_EVENT_NUMBER;i++){
     if(fds[i].revents & POLLIN){
             int sockfd=fds[i].fd;
             /*处理sockfd*/
     }
}

/*如何索引epoll返回的就绪的文件描述符*/
int ret=epoll(epollfd,events,MAX_EVENTS,-1);
/*仅遍历就绪的ret个文件描述符*/
for(int i=0;i<ret;i++){
    int sockfd=events[i].data.fd;
    /*sockfd肯定就绪,直接处理*/
}

epoll的LT和ET模式

epoll对文件描述符的操作有两种模式:LT和ET.当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将以ET模式来操作该文件描述符.ET模式是epoll的高效工作模式.

LT:当epoll_wait检测到其文件描述符上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件。这样,当应用程序下一次调用epoll_wait时,epoll_wait还会再次向应用程序通告此事件,直到该事件被处理。

ET:当epoll_wait检测到其文件描述上的事件发生并将此通知应用程序后,应用程序必须立即处理,因为后续的epoll_wait调用将不再向应用程序通知这一事件.

因此,ET模式在很大程度上降低了同一个epoll事件被触发的次数.所以效率要比LT模式高.

                            参考于 《Linux高性能服务器端编程》

时间: 2024-08-09 02:17:56

I/O复用-epoll模型的相关文章

epoll模型实例

一.epoll概述 epoll是linux下的一个系统调用,用来监听大量文件描述符并对其上的触发事件进行处理.它是select/poll的增强版本,也是linux下多路复用io最常用的接口.要理解epoll是什么,首先得清楚什么是多路复用io.用户进行io操作需要经过内核,而如果所请求的io目前不满足条件(如需要从标准输入读取数据,而用户还未输入),这个时候内核就会让应用程序陷入等待,即阻塞状态.个人理解,io复用技术就是通过特定接口,将这种阻塞进行了转移,转嫁到了如select/poll/ep

(OK) Linux epoll模型—socket epoll server client chat

http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html http://blog.csdn.net/denkensk/article/details/41978015 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.因为它会复用文件描述符集合来传递结果而不是迫使开发者每次等待事

(OK) Linux epoll模型—socket epoll server client chat—pthread

http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html http://blog.csdn.net/denkensk/article/details/41978015 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.因为它会复用文件描述符集合来传递结果而不是迫使开发者每次等待事

Linux epoll模型

定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.因为它会复用文件描述符集合来传递结果而不是迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一个原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了.epoll除了提供select\poll那种IO事

第九章 用多线程来读取epoll模型下的客户端数据

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include

Apache select和Nginx epoll模型区别

部分内容摘自跟老男孩学Linux运维:Web集群实战(运维人员必备书籍) http://oldboy.blog.51cto.com/2561410/1752270 1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换.一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准备好(内核态)2)将数据从内核空间拷贝到进程空间(用户态).根据这两个步骤处理方式不一样,我们通常把网络IO划分成阻塞IO和非阻塞IO.

0729------Linux网络编程----------使用 select 、poll 和 epoll 模型 编写客户端程序

1.select 模型 1.1 select 函数原型如下,其中 nfds 表示的描述符的最大值加1(因为这里是左闭右开区间),中间三个参数分别表示要监听的不同类型描述符的集合,timeout用来表示轮询的时间间隔,这里用NULL表示无限等待. 1.2 使用 select函数编写客户端程序的一般步骤: a)初始化参数,包括初始化监听集合read_set并添加fd,以及初始化监听的最大描述符 maxfd 和select的返回值 nready: b)将read_set 赋值给 ready_set,因

epoll模型与select模型的区别

Nginx  --->epoll模型 Apache --->select模型 处理大量连接的读写时,Apache所采用的select网络I/O模型比较低,用两个通俗的比喻来解释二者的区别: 第一个比喻: 例如你在大学读书,住的宿舍楼有很多房间,你的朋友要来找你,select版宿管大妈就会 带着你的朋友到各个房间挨个去找,直到找到为止.而epoll版宿管大妈会先记下每位入住同学的房间号码,当你朋友来找你时,只需告诉你的朋友你住在哪个房间?不用亲自带着你的朋友满宿舍的找.如果同时来了100个人,都

基于EPOLL模型的局域网聊天室和Echo服务器

一.EPOLL的优点 在Linux中,select/poll/epoll是I/O多路复用的三种方式,epoll是Linux系统上独有的高效率I/O多路复用方式,区别于select/poll.先说select/poll的缺点,以体现epoll的优点. select: (1)可监听的socket受到限制,在32位的系统中,默认最大值为1024. (2)采用轮询方式,当要监听的sock数量很大时,效率低. (3)随着要监听socket数据的增加,要维护一个存放大量fd的数据结构,系统开销太大. pol