gpt4 book ai didi

c - 轮询和选择之间有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 16:14:16 25 4
gpt4 key购买 nike

我指的是 POSIX 标准 selectpoll系统 C API 调用。

最佳答案

select() 调用让您创建三个位掩码来标记您要监视哪些套接字和文件描述符以进行读取、写入和错误,然后操作系统标记哪些实际上具有有某种事件; poll() 让您创建一个描述符 ID 列表,操作系统用发生的事件的种类标记它们中的每一个。

select() 方法相当笨重且效率低下。

  1. 一个进程通常有超过一千个潜在的文件描述符可用。如果一个长时间运行的进程只有几个打开的描述符,但至少其中一个被分配了一个大数字,那么传递给 select() 的位掩码必须足够大以容纳最高的数字描述符 — 因此整个范围的数百位都将被取消设置,操作系统必须在每次 select() 调用时循环才能发现它们未被设置。

  2. 一旦 select() 返回,调用者必须遍历所有三个位掩码以确定发生了什么事件。在非常多的典型应用程序中,在任何给定时刻只有一个或两个文件描述符会获得新流量,但必须一直读取所有三个位掩码直到最后才能发现它们是哪些描述符。

  3. 由于操作系统通过重写位掩码向您发出有关事件的信号,因此它们已损坏并且不再标有您要收听的文件描述符列表。您要么必须从保存在内存中的某个其他列表重建整个位掩码,要么必须保留每个位掩码的副本和 memcpy() 损坏的数据 block 之上的数据 block 每次 select() 调用后的位掩码。

因此 poll() 方法效果更好,因为您可以继续重复使用相同的数据结构。

事实上,poll() 启发了现代 Linux 内核中的另一种机制:epoll(),它进一步改进了该机制以实现可扩展性的又一次飞跃,因为今天的服务器通常希望一次处理数万个连接。这是对这项工作的一个很好的介绍:

http://scotdoyle.com/python-epoll-howto.html

虽然这个链接有一些很好的图表显示了 epoll() 的好处(你会注意到 select() 在这一点上被认为是低效和过时的它甚至没有在这些图表上画一条线!):

http://lse.sourceforge.net/epoll/index.html


更新:这是另一个 Stack Overflow 问题,其答案更详细地说明了差异:

Caveats of select/poll vs. epoll reactors in Twisted

关于c - 轮询和选择之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/970979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com