美文网首页
select 和 epoll 区别

select 和 epoll 区别

作者: 狗尾巴草败了 | 来源:发表于2017-08-14 01:21 被阅读0次

    select原理

    • 将 文件描述符集合 fd_set 从用户空间拷贝到内核空间,进入内核态
    • 遍历所有的文件描述符,对每个文件描述符调用 poll(), 该函数返回一组标准掩码,其中各个位指示相对应的文件描述符的就绪状态(全为0表示没有任何事件就绪),根据掩码对 fd_set 进行赋值,如果没有文件就绪且时间未到则会进入短暂的睡眠,然后再恢复并再次对 fd_set 轮询调用 poll(), 如此反复,直到有文件就绪或者时间到达。
    • 只要有文件就绪,函数就返回, 将fd_set 再次从内核空间拷贝到用户空间,系统返回用户态,用户就可以对相应的文件进行读和写了

    epoll原理

    epoll 一共有三个函数,分别是 epoll_create() , epoll_ctl(),
    epoll_wait()

    下面介绍三个函数的原理
    epoll_create()

    该函数建立一个epoll句柄

    内核在epoll文件系统中建立了一个 file节点
    在内核缓冲区 Cache 中建立一棵红黑树和一条双向链表, 红黑树用来存储以后 epoll_ctl() 注册的文件描述符, 双向链表用来存放就绪的文件描述符。

    epoll_ctl()
    该函数是功能是将被监听的文件描述符添加到epoll句柄,或者从epoll句柄中删除,或者更改文件描述符的监听状态

    将对应的文件描述符添加到红黑树中,或者从红黑树中删除,当将文件描述添加到红黑树时,并给内核中断函数注册一条回调函数,告诉内核,如果该文件描述符就绪,将其添加到就绪链表中

    epoll_wait()
    该函数返回就绪的文件描述和就绪数目的大小

    该函数观察就绪链表中的数据,有数据就返回,没数据就sleep,直到有事件发生或者事件到达

    select 和 epoll 的优缺点:

    select 缺点

    • 最大并发数有限制,默认数量是1024个
    • 每次都会线性地扫描整个 文件描述符集合 fd_set, 集合越大,速度越慢,效率延展性差
    • 每次调用都需要在用户空间和内核空间来回的拷贝,而且每次调用select需要重新初始化 fd_set

    epoll 效率提升

    • 最大并发数量没有限制,依赖于系统所能打开的最大文件数目限制
    • 只有已经就绪的文件才会主动触发回调函数,效率和文件数目大小无关,性能延展性好
    • 省去了不必要的拷贝

    当然以上优点是在特定环境下:
    高并发,且任意时间只有少量的文件是活跃的,如果并发量低,文件活跃地多,select就不一定比 epoll 慢。

    文件描述符何时就绪

    正确使用select和epoll需要理解在什么情况下,文件描述符会表示为就绪态。
    SUSv3中说:如果对I/O函数的调用不会被阻塞,而不论该函数是否能够实际传输数据,此时文件描述符(未指定 O_NONBLOCK 标志)被认为是就绪的。
    select 和 epoll 只会告诉我们 I/O 操作是否会阻塞, 而不是告诉我们到底能否成功传输数据。

    epoll的水平触发LT和边缘触发ET

    默认情况下,epoll提供的是水平触发通知,表示epoll会告诉我们何时能在文件描述符上以非阻塞的方式执行 I/O 操作。 这和 select所提供的通知类型相同
    epoll的边缘触发通知,表示自从上一次调用epoll_wait() 依赖,文件上是否已经有 I/O活动了,如果有多个I/O 事件发生的话,epoll将它们合并成一次单独的通知, 通过epoll_wait() 返回。 注意: 这里不同于信号驱动 I/O, 信号驱动 I/O中会产生多个信号。
    想象下面一种情景
    使用epoll监视一个套接字上的输入 (EPOLLIN), 接下来会发生如下事件。

    1. 套接字上有输入的到来。
    2. 调用一次 epoll_wait()。无论采用 LT 还是 ET , 该调用都会告诉我们套接字已经处于就绪状态。
    3. 再次调用 epoll_wait()
      如果是 LT 模式,函数仍将直接返回,告诉我们套接字处于 就绪 状态。
      如果是 ET 模式, 函数将 阻塞, 因为自从第一次 调用 epoll_wait() 之后,并没有新的输入到来。

    边缘触发通知通常和非阻塞文件描述符结合使用

    相关文章

      网友评论

          本文标题:select 和 epoll 区别

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