【问题标题】:select() socket call CPU consumptionselect() 套接字调用 CPU 消耗
【发布时间】:2013-05-19 17:46:31
【问题描述】:

如果我有以下带有 select 调用的代码,并假设套接字 fds 大部分时间都没有为 I/O 做好准备,那么线程会占用 CPU 还是会休眠并让其他线程完成工作。 select() 是 CPU 密集型调用吗?

while(1)
{
   select(maxfd, &rfds, NULL, NULL, NULL);
}

行为是否与超时 = 0(轮询类型)而不是 NULL 相同。

【问题讨论】:

  • 无限期阻塞后select()如何恢复?谁来通知select被阻塞的线程?

标签: sockets select cpu sleep


【解决方案1】:

如果超时值为 NULL,则 select 将无限期阻塞,直到 rfds 中的套接字和文件描述符上的数据可用。但是,一旦该集中的任何文件描述符上的数据可用,您拥有的代码将消耗整个 CPU,因为您没有显示任何建议从套接字中排出数据的内容。 (第二次调用 select 将立即返回,表明套接字上仍有数据)。

如果您传入一个归零的 timeval 来选择,这将是一个非阻塞轮询。这相当于调用带有 MSG_DONTWAIT 标志的 send() 或 recv()(但不会复制数据)。

【讨论】:

  • 感谢您的信息。无限阻塞时,线程会消耗CPU吗?
猜你喜欢
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2010-11-05
  • 2018-10-22
  • 2015-05-18
  • 2012-01-26
相关资源
最近更新 更多