zoukankan      html  css  js  c++  java
  • Linux多路复用介绍

    Select

    首先什么是多路复用:一个进程监听多个文件描述符,Linux中一切皆文件,也就是一个进程管理多个客户端连接。

    Select模型不断扫描文件描述符集合

    Select模型缺点:

    1.一个进程打开的fd(文件描述符)是有限制的,默认1024,所以select模型最大的并发数就是1024个(还要减去标准输入 标准输出 标准错误 )。

    2.每次select调用都会线性扫描全部的fd集合,时间复杂度O(n)。如下图

    3.用户/内核空间 内存拷贝问题(全量copy  copy的次数相比BIO很少) 如下图:

    Poll和epoll

    对上面三个缺点 后序的poll和epoll给出了优化

    poll:

    1.Poll相对Select比较,提高了可打开文件描述符的数量。一个进程打开fd的限制------>整个系统可用打开的文件数目。

    在1G内存的服务器,限制是10w左右。poll只是提高了并发的数量,但效率并没有提高。

    epoll:

    2.内核查找红黑树中ready的socket放到就绪列表,这个过程使用了内核的中断机制。 然后复制到用户态因为有就绪列表

     此后 用户态使用的时候就不需要在遍历所有的fd,这个过程事件通知,只把准备好的fd告诉你,算是事件通知的方式。

    3.和select轮询不断的从内核态向用户态复制fd相比,epoll在内核态中,准备了一个就绪链表起到缓冲作用,一次性复制多个就绪的fd.

    epoll到底有没有mmap共享内存:

    epoll早期版本是没有epoll_create、epoll_ctrl、epoll_wail这三个方法的,所以传递参数就用到了mmap,但是后来有了这三个方法之后,就不需要mmap了,用户和内核直接传递参数的

    AIO

    AIO希望的是,你select,poll,epoll都需要用一个函数去监控一大堆fd,那么我AIO不需要了,你把fd告诉内核,你应用程序无需等待,

    内核会通过信号等软中断告诉应用程序,数据来了,你直接读了,所以,用了AIO可以废弃select,poll,epoll。

  • 相关阅读:
    Java第一次作业
    第十一次
    第十次
    第九次
    第八次作业
    第七次
    第六次
    第五次作业
    ##JAVA作业3
    ##Java作业2
  • 原文地址:https://www.cnblogs.com/ssskkk/p/15431404.html
Copyright © 2011-2022 走看看