美文网首页
select poll和epoll的区别

select poll和epoll的区别

作者: ZMRWEGo | 来源:发表于2019-04-07 11:31 被阅读0次

    IO多路复用是linux中IO模式的一种,与多进程和多线程相比,I/O多路复用技术最大的优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,减小了不惜要的上下文切换,降低了系统的开销。
    I/O多路复用就是通过一种机制,一个进程可以监听多个描述符,一旦某个描述符就绪(一般就是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select、poll和epoll本质上都是同步I/O,他们在读写时间就绪后自己负责读写,这时候,读写过程是阻塞的

    1. select

    select由用户进程调用
    select函数监控的文件描述符分为3类,分别是可读、可写或者异常,调用后select函数会阻塞用户进程,直到有文件描述符就绪,用户进程再将数据从文件缓冲区拷贝到用户进程
    select目前在所有的操作系统上都有支持,linux默认的文件描述符数量为1024.
    select的缺点

    • 单个进程所打开的FD数量是有限制的
    • 对socket进行线性扫描,采用轮询的方法,效率较低。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询。
    • 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间传递该结构时,复制的开销过大。

    2. poll

    poll和select本质上没有区别,他没有最大连接数的限制,应为它的fd使用链表来存储的。

    3. epoll

    简单来说,epoll利用mmap来减少空间拷贝,利用红黑树来存储所有的套接字,而将活动的套接字放入双向链表

    https://blog.csdn.net/zhangyanfei01/article/details/124701533


    epoll和select的区别,也可以说是epoll的优点:
    1、最大并发数限制
    select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是1024;
    epoll则没有这个限制,它所支持的FD上限是最大可以打开文件的数目,在1GB内存的机器上大约是10万左右。
    2、内核/用户空间内存拷贝
    select,每次调用都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;
    每次注册新的事件到epoll句柄中时,会把所有的fd拷贝进内核,从而epoll保证了每个fd在整个过程中只会拷贝一次。
    3、效率
    select每次调用都会线性扫描全部的集合,导致效率呈现线性下降。
    而epoll只在“醒着”的时候只要判断一下就绪链表是否为空就行了。
    epoll没有采取轮询的方式而是采取回调的方式,当相应事件发生时通知程序进行IO操作

    • ET 边缘触发模式
      在此模式下,当描述符由未就绪变为就绪时,内核通过epoll告知。然后它会假设用户知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到某些操作导致那个文件描述符不再为就绪状态了。(高速模式)
    • LT 水平触发
      缺省工作方式,支持blocksocket和no_blocksocket。在LT模式下内核会告知一个文件描述符是否就绪了,然后可以对这个就绪的fd进行IO操作。如果不作任何操作,内核还是会继续通知!若数据没有读完,内核也会继续通知,直至设备数据为空为止!

    I/O多路复用总结:
    当需要处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。I/O多路复用将多个I/O的阻塞复用到一个select阻塞上,使得系统在单线程情况下可处理多个客户端请求。同步非阻塞模型,epoll也存在阻塞,即用户进程从内核态拷贝数据。

    异步IO

    linux下,用户进程进行aio_read系统调用后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直接复制数据给进程,然后内核向进程发送通知。IO两个阶段,进程都是非阻塞的,拷贝工作交由了内核进程。

    相关文章

      网友评论

          本文标题:select poll和epoll的区别

          本文链接:https://www.haomeiwen.com/subject/prgjiqtx.html