2024-04-04  阅读(16)
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/7621028112

回答

selectpollepoll 是 Linux 系统下进行 I/O 多路复用的三种机制。它们的主要作用是允许程序监视多个文件描述符(FD),一旦某个描述符就绪(一般是读就绪或者写就绪),就能够通知应用程序进行相应的读写操作。

select

select 提供了一种查询多个文件描述符的读、写、异常状态的方法。当调用 select 函数时,当前线程会被阻塞,直到有文件描述符就绪(至少一个监视的文件描述符就绪或者超时)。

select 的优点是简单易用,提供了一种简单而有效的方式来监视多个文件描述符的状态。但是随着监视的文件描述符数量的增加,select 的性能会线性下降。而且每次调用时,都需要把文件描述符集合从用户空间复制到内核空间,这个复制过程在文件描述符数量较多时尤其低效,同时 select 能够监视的文件描述符数量受限于 FD_SETSIZE,导致最大的监视数量为 1024。基于这些缺点,select 不适用于大规模并发连接处理。

poll

poolselect 实现机制差不多,它使用了一种名为 pollfd 的结构体数组来管理文件描述符,从而解决了 select 的文件描述符数量限制问题。但是与 select 一样,pool依然需要在每次调用时将整个数组复制给内核,这意味着当监视的文件描述符数量非常大时,其性能也会受到影响。

epoll

相比于 selectpollepoll 提供了更好的扩展性和性能,它能够跟踪几乎无限数量的文件描述符。特点如下:

  • 效率高epoll 使用一种事件通知机制,只有活跃的文件描述符才会被处理,同时,它在调用时不需要每次都将文件描述符集合从用户空间复制到内核空间,它一般只需要复制一次,大大减少了系统调用的开销。
  • 扩展性强:通过使用内核中的红黑树(一种自平衡的二叉查找树)来存储文件描述符,使得即便是文件描述符的数量非常大,查找效率也很高。
  • 两种触发模式::边缘触发和水平触发。边缘触发只在文件描述符状态变化时通知一次,而水平触发则在文件描述符处于就绪状态时不断通知,提供了更高的灵活性和效率。

但是 epoll 的实现比 selectpoll 复杂得多。

详解

selectpollepoll 都是 Linux 系统下进行 I/O 多路复用的三种机制。它们的主要作用是允许程序监视多个文件描述符(FD),一旦某个描述符就绪(一般是读就绪或者写就绪),就能够通知应用程序进行相应的读写操作。

select

select 函数通过三个主要的文件描述符集合(读、写、异常)来监视不同的事件,整个流程如下: