Linux网络编程(四)——学习历程 多路IO之epoll

1.epoll

如果内存1G,epoll就支持10w连接

  • 不能跨平台,只能在Linux中使用
  • 支持的并发量很大的

I/O多路转接函数

  • select
    • 支持跨平台
      • 在window平台中:select的第一个参数是没有意义的,写0就可以了
      • 在linux平台中:select的第一个参数是检测集合中最大文件描述符+1
    • 检测最大连接数:最大为1024
    • 检测方式和效率:
      • 线性检测,文件符越多,效率越低
      • 使用select检测集合会进行多次的数据拷贝
        • 从用户区拷贝到内核区 -> 传入
        • 从内核区拷贝到用户区 -> 传出
  • poll
    • 不支持跨平台,只能在Linux中使用
    • 检测最大连接数:和内存有关
    • 检测方式和效率:
      • 线性检测,文件符越多,效率越低
  • epoll
    • 不支持跨平台,只能在Linux中使用
    • 检测最大连接数:和内存有关
    • 检测方式和效率
      • 树状模型(红黑树)模型,检测效率高
      • 委托epoll检测文件描述符的集合,用户区和内核区使用的是同一块内存
        • 使用了共享内存

 1.1 epoll的使用步骤

//epoll的使用步骤
//epoll是一个模型,树状模型,使用epoll需要调用3个函数

1.需要创建一个树状模型
2.将要检测的节点添加到epoll树上
    文件描述符类型:
        -监听的
        -通信的
    从检测事件上说:
        -读
        -写
        -异常
3.开始委托内核对树上的节点进行检测
4.处理过程:
    -监听的:建立新的连接
    -通信的:接收和发送数据

1.2 操作函数

#include 

1.int epoll_create(int size);
参数:
    size:这个值没有实际的意义,只需要大于0就可以了
返回值:
    -成功:返回一个有效的文件描述符,可以理解为红黑树的根节点
        通过这个返回值可以访问创建的实例
    -失败:-1,errno

//对epoll树的节点进行操作,实现对epoll模型上节点的添加/删除/修改
2.int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数:
    epfd:红黑树的句柄,epoll_create的返回值
    op:
        -EPOLL_CTL_ADD上树,添加新节点
        -EPOLL_CTL_DEL下树, 删除节点
        -EPOLL_CTL_MOD修改树的节点,比如将写事件改为读事件
    fd:要操作的文件描述符
        -如何操作:添加/修改/删除
        -种类:
            -监听的
            -通信的
    event:
        -添加:设置要检测文件描述符的事件
        -修改:修改对应文件描述符的事件
        -删除:写NULL

其中event的数据结构为:
    typedef union epoll_data {
               void        *ptr;
               int          fd;    //常用
               uint32_t     u32;
               uint64_t     u64;
           } epoll_data_t;

           struct epoll_event {
               uint32_t     events;      /* Epoll events */  需要监听的事件
               epoll_data_t data;        /* User data variable */ 需要监听的文件描述符
           };
 -events:
    -EPOLLIN:读事件,检测文件描述符的读缓冲区,

你可能感兴趣的:(Linux网络编程(四)——学习历程 多路IO之epoll)