anand Asked: 2025-02-19 17:30:36 +0800 CST2025-02-19 17:30:36 +0800 CST 2025-02-19 17:30:36 +0800 CST 是否会发生饥饿,因为只选择为少数 fd 提供服务,而其他 fd 却处于饥饿状态? 772 场景如下,一台服务器使用 select() 处理多个客户端,其中几个 fd 非常活跃(其中几个 fd 上有大量数据),而其他 fd 则处于正常活跃状态。那么其他 fd 是否会饿死,因为 select 将忙于为非常活跃的 fd 提供服务? c 1 个回答 Voted Best Answer John Bollinger 2025-02-19T23:05:11+08:002025-02-19T23:05:11+08:00 是否会发生饥饿,因为只选择为少数 fd 提供服务,而其他 fd 却处于饥饿状态? 否,每次返回时select()报告所有就绪的文件描述符(来自指定的兴趣集)。调用者有责任为所有文件描述符提供服务以避免资源匮乏,这可以通过以下方式实现select():程序可以避免 (i) 阻止尝试读取或写入未就绪的文件描述符和 (ii) 浪费时间在无用的非阻塞 I/O 请求上。通常,程序会在再次执行之前为所有就绪的文件描述符提供服务select()。细节各不相同。 来自评论: 我的意思是说 fd x 有很多数据需要读取,而其他 fd 没有足够的机会读取数据。 在很大程度上,多路复用 I/O 的程序可以控制它,以select()确保所有客户端都得到服务。它可以通过多种方式解决这个问题,而促进这一点正是使用它的select()首要目的。 然而,每台机器的 I/O 和处理能力都有限制。即使有效地使用select(),程序也有可能被过多的数据和处理请求压垮,而无法跟上。在这种情况下,它无法及时服务哪些流在很大程度上取决于程序的实现细节和相关的通信模式。不一定是流量较小的流。
否,每次返回时
select()
报告所有就绪的文件描述符(来自指定的兴趣集)。调用者有责任为所有文件描述符提供服务以避免资源匮乏,这可以通过以下方式实现select()
:程序可以避免 (i) 阻止尝试读取或写入未就绪的文件描述符和 (ii) 浪费时间在无用的非阻塞 I/O 请求上。通常,程序会在再次执行之前为所有就绪的文件描述符提供服务select()
。细节各不相同。来自评论:
在很大程度上,多路复用 I/O 的程序可以控制它,以
select()
确保所有客户端都得到服务。它可以通过多种方式解决这个问题,而促进这一点正是使用它的select()
首要目的。然而,每台机器的 I/O 和处理能力都有限制。即使有效地使用
select()
,程序也有可能被过多的数据和处理请求压垮,而无法跟上。在这种情况下,它无法及时服务哪些流在很大程度上取决于程序的实现细节和相关的通信模式。不一定是流量较小的流。