• 多路转接IO模型(poll和epoll)


    poll

    历史地位:跨平台不如select,性能不如epoll,比较尴尬的地位

    • 作用:IO多路转接能够同时等待多个文件描述符的就绪状态,换句话说,可以帮助我们同时监控多个文件描述符

    接口

    int poll(struct pollfd *fds,nfds_t nfds,int timeout);
    
    • 1
    • fds:事件结构数组,存放监控文件的文件描述符,关心的事件,真实产生的事件
    • nfds:描述fds数组当中有多少有效元素
    • timeout:超时时间,单位s;>0:表示带有超时时间的等待;==0:非阻塞,需要搭配循环使用
    • 返回值:>0:表示多少文件描述符就绪;==0:监控超时;<0:监控出错(例如无效的文件描述符)

    事件结构

    struct pollfd{
    	int fd;//要监控的文件描述符
    	stort event;//关心文件描述符产生的事件:PLOOIN:可读事件,POLLOUT:可写事件;监控多个事件时,用按位或的方式
    	stort revent;//文件描述符真实产生的事件
    }
    
    struct pollfd arr;
    arr.fd=0;
    arr.event=POLLIN;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    优缺点

    • 优点

    1.提出了事件结构的方式,在给poll函数传递参数的时候,不需要分别添加到“事件集合”当中
    2.事件结构数组的大小可以更新程序员自己进行定义,并没有要求上限
    3.不用在监控就绪之后,重新添加文件描述符

    • 缺点

    1.不支持跨平台
    2.内核也是对事件结构数组监控的时候采用轮询遍历的方式

    epoll

    历史地位:迄今为止,linux平台性能最好的IO多路转接模型,没有之一

    接口

    int epoll_create(int size);
    size:目前没有含义,但是要大于0,兼容旧内核
    
    • 1
    • 2
    int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event);
    
    
    • 1
    • 2
    • epfd:epoll操作句柄
    • op:
      EPOLL_CTL_ADD:添加一个文件描述符到对应的时机结构epoll当中
      EPOLL_CTL_MOD:修改一个文件描述符的事件结构
      EPOLL_CTL_DEL:从epoll当中删除一个文件描述符对应的事件结构
    • fd:待处理(添加,修改,删除)的文件描述符
    • event:文件描述符对应的事件结构
    struct epoll_event{
    	unit32_t event;
    	EPOLLIN:可读事件
    	EPOLLOUT:可写事件
    	epoll_data_t data;
    	}
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    int epoll_wait(int epfd,struct epoll_event *event,int maxevent,int timeout);
    
    • 1
    • epfd :epoll操作句柄
    • event:事件结构数组,从epoll中获取就绪的事件结构
    • maxevent:最多一次获取多少个事件结构
    • timeout:>0:带有超时时间 ;==0:非阻塞;<0:阻塞
    • 返回值:返回就绪文件描述符的个数

    epoll_creat创建的数据结构中用红黑树来监控文件描述符,查询效率lgn,就绪后放入双向链表当中
    epoll_wait每次从双向链表中获取就绪的事件结构

    epoll的工作模式

    • LT(默认):水平触发:当读就绪或者写就绪的时候,则一定乐此不疲的通知(对程序员而言友好)
    • ET:边缘触发:当读就绪或者写就绪的时候,只会通知 一次(要求程序员一次将数据全部读回来)
  • 相关阅读:
    【Rust日报】2022-10-17 谷歌宣布推出 Rust 开发的 KataOS 操作系统
    element table加减列
    Excel基于分隔符拆分列
    ComfyUI搭建
    Cassandra笔记
    http升级为https
    2023年Q4软件测试一般性趋势
    ZooKeeper 避坑实践:如何调优 jute.maxbuffer
    手柄零件的工艺设计
    scrapy-redis空跑如何中止,队列为空时自动关闭scraper
  • 原文地址:https://blog.csdn.net/m0_58103115/article/details/126415646