投票和选择有什么不同?

我指的是 POSIX 标准 选择民意调查系统 C API 调用。

109739 次浏览

我认为 这个回答了你的问题:

来自 Richard Stevens (rstevens@noao.edu) :

基本区别在于 select ()的 fd _ set 是一个位掩码,并且 因此有一些固定的大小 在编译内核时不限制此大小,允许 应用程序将 FD _ SETSIZE 定义为它想要的任何内容(如注释) 但是它需要更多的工作。4.4 BSD 的 Kernel 和 Solaris 库函数都有这个限制 看到 BSD/OS 2.1现在已经被编码来避免这个限制,所以它是 可行的,只是一个编程的小问题。 : ——)有人应该提交一个 Solaris 对此进行了 bug 报告,看看是否能够修复 然而,对于 poll () ,用户必须分配一个 polfd 数组 结构,并传递该数组中的条目数,因此 没有基本的限制。正如 Casper 指出的那样,只有极少数的系统使用 poll () 选择,所以后者更便携 实现(SVR3) ,您不能将描述符设置为 -1来告诉 内核忽略 polfd 结构中的一个条目,这使得 很难从数组中删除条目; SVR4解决了这个问题。 就个人而言,我总是使用 select () ,很少使用 poll () ,因为我将 代码到 BSD 环境。有人可以编写一个实现 在这些环境中使用 select () ,但是我从来没有 我们看到一个。 select ()和 poll ()都被 POSIX 标准化了 1003.1克

2017年10月更新:

上面提到的电子邮件至少和2001年一样古老; 现在(2017年)所有现代操作系统(包括 BSD)都支持 poll()命令。事实上,有些人认为 select() 应该被弃用。抛开观点不谈,围绕 poll()的可移植性问题已不再是现代系统所关心的问题。此外,epoll()已经开发(你可以 请阅读手册页) ,并继续上升的受欢迎程度。

对于现代开发,您可能不想使用 select(),尽管它没有明显的错误。poll(),以及更现代的进化 epoll(),提供了与 select()相同的特征(以及更多) ,而没有受到其中的局限性。

select()调用让你创建三个位掩码来标记你想要监视哪些套接字和文件描述符的读、写和错误,然后操作系统会标记哪些套接字和文件描述符实际上有某种活动; poll()让你创建一个描述符 ID 列表,操作系统会用事件发生的 善良标记它们。

select()方法相当笨拙和低效。

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

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

  3. 因为操作系统通过重写位掩码向您发出活动信号,所以位掩码被破坏,并且不再标记您想要侦听的文件描述符列表。你要么从内存中保存的其他列表中重建整个位掩码,要么在每次 select()调用后,在损坏的位掩码上保存每个位掩码和 memcpy()数据块的副本。

因此,poll()方法的效果要好得多,因为可以不断重用相同的数据结构。

事实上,poll()启发了现代 Linux 内核中的另一种机制: epoll(),它在机制上做了更多改进,允许可伸缩性的另一次飞跃,因为今天的服务器通常想要同时处理成千上万的连接。这是对这一努力的一个很好的介绍:

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

虽然这个链接有一些很好的图表,显示了 epoll()的好处(你会注意到,select()被认为是如此低效和老式,甚至没有得到这些图表上的一条线!):

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


更新:这是另一个堆栈溢出问题,它的答案给出了更多关于差异的细节:

选择/民意调查与扭曲的环境污染反应堆的警告

他们都是 慢慢来和大部分 一样,但不同的大小和一些特点!

在编写迭代器时,每次都需要复制 select集合!而 poll已经解决了这种问题,拥有漂亮的代码。另一个区别是,poll默认可以处理超过1024个文件描述符(FD)。poll可以处理不同的事件,使程序更具可读性,而不需要很多变量来处理这类工作。pollselect中的操作是线性的,速度很慢,因为有很多检查。