Aqui está o cenário, um servidor lidando com vários clientes usando select(), alguns dos fds estão muito ativos (há muitos dados chegando em alguns) enquanto outros estão normalmente ativos. Então outros fds morrerão de fome, já que select estará ocupado servindo fds muito ativos?
Não,
select()
relata todos os descritores de arquivo prontos (dos conjuntos de interesse especificados) em cada retorno. É responsabilidade do chamador atendê-los todos para evitar a inanição, e isso é facilitado porselect()
-- o programa pode evitar (i) bloquear a tentativa de ler ou escrever descritores de arquivo que não estão prontos e (ii) desperdiçar tempo em solicitações de E/S não bloqueantes que são improdutivas. Normalmente, o programa atenderia todos os descritores de arquivo prontos antes deselect()
executar novamente. Os detalhes variam.Dos comentários:
Está em grande parte sob o controle do programa que está multiplexando E/S com a ajuda de
select()
para garantir que todos os clientes sejam atendidos. Há uma variedade de maneiras de abordar esse problema, e facilitar isso é o ponto de usoselect()
em primeiro lugar.No entanto, cada máquina tem limites em suas capacidades de E/S e processamento. Mesmo com o uso efetivo de
select()
, é possível que um programa fique sobrecarregado com mais dados e solicitações de processamento do que ele pode dar conta. Nesse caso, quais fluxos ele não consegue atender em tempo hábil é, em grande parte, uma questão de detalhes de implementação do programa e dos padrões de comunicação relevantes. Não são necessariamente fluxos de menor volume.