• IO多路复用


    什么是IO多路复用?

    先理解名字:
    IO多路复用=多个IO连接复用同一个线程

    定义
    IO多路复用是一种同步IO模型,实现一个线程监视多个文件描述符fd;一旦某个文件描述符fd就绪,就能够通知应用程序进行相应的读写操作;没有fd就绪时会阻塞应用程序,交出cpu

    上面的这句定义未免有些抽象,我们来尝试理解一下
    理解IO多路复用原理:

    1. 我们拿到了一堆文件描述符fd(网络相关、磁盘文件相关等等,任何文件描述符都可以)

    2. 通过调用某个函数告诉内核:“这个函数你先不要返回,你替我监视着这些描述符,当这堆文件描述符中有可以进行I/O读写操作的时候你再返回”

    3. 当调用的这个函数返回后,我们就能知道哪些文件描述符可以进行I/O操作了。

    图示
    在这里插入图片描述

    IO多路复用特点

    1、与多线程技术相比
    I/O多路复用技术的最大优势系统开销小,系统不必创建多个线程,也不必维护这些线程,从而大大减小了系统的开销。

    2、与阻塞式I/O的对比
    两种模式的两个阶段都阻塞,那区别在哪里呢?
    虽然第一阶段都是阻塞,但是阻塞式I/O如果要接收更多的连接,就必须创建更多的线程。
    而I/O复用模式下只要单个线程来循环处理这些连接事件就可以了,一旦达到“就绪”的条件,就可以立即执行真正的I/O操作。
    这就是I/O复用与传统的阻塞式I/O最大的不同。也正是I/O复用的精髓所在。

    3、IO多路复用是同步阻塞IO,网上有很多说是非阻塞的其实不对
    因为用户进程在等待数据拷贝数据这两个阶段都是阻塞的。
    内核的角度,内核等待fd就绪是阻塞的,如果没有任何一个fd就绪则一直等待。
    但有一点是不阻塞的,就是复制数据内核不用等待,当有就绪条件满足的时候,它直接复制,其余时间则处理别的就绪的条件。这也是大家一直说的非阻塞I/O。实际上就是指的这个地方的非阻塞

    实现IO多路复用的三种机制

    在Linux世界中有这样三种机制可以用来进行I/O多路复用
    select
    poll
    epoll

    select

    在select这种I/O多路复用机制下,我们需要把想监控的fd集合通过函数参数的形式告诉select,然后select会将这些fd集合拷贝到内核中,然后遍历所有fd找到就绪fd返回给应用程序。

    select三个缺点:

    • 用户监控的fd集合不能超过1024个, 因为数据拷贝是有性能损耗的,当线程监控的fd过多会导致拷贝数据的时间过多,从而使得性能变慢。

    • 每次调用select,都需要把所有的fd集合从用户态拷贝到内核态,fd越多开销则越大;

    • 每次调用select都需要在内核遍历所有fd来找到具体是哪个文件描述符可以读写,这个开销在fd很多时也很大。

    poll

    poll是基于链表来存储的,所以poll没有最大连接数的限制

    但是另外两个缺点没有解决

    epoll

    Epoll只关心就绪的连接,不关心连接总数,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll

    Epoll的优点

    • 文件描述符数量不再受限(1G的内存上能监听约10万个端口);解决缺点1

    • 使用内存映射mmap技术,节省了用户态和内核态间数据拷贝的资源消耗;解决缺点2

    • 不再遍历所有fd,只有就绪的fd才会执行回调函数。I/O的效率不会随着监视fd的数量的增长而下降;解决缺点3

    三种模式如何选择

    表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好
    但是当并发连接(fd)较多时,Epoll的优势便真正展现出来。

  • 相关阅读:
    光照静态烘焙
    Python 图_系列之基于邻接矩阵实现广度、深度优先路径搜索算法
    Vue-条件渲染指令
    运动与健康
    借我 1 小时,与 1000 人一起参与开源
    《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例
    TripleDES golang/python/ts 实现方式
    <TypeScript系列>: TS类型声明declare .d.ts文件
    正则表达式定义
    CodeTon Round 2 D. Magical Array 规律
  • 原文地址:https://blog.csdn.net/qq_40337086/article/details/120780238