2 votes

FD_SETSIZE par rapport à la valeur calculée

Dans une configuration serveur/client, j'ai un serveur qui se connecte à des clients sur une poignée (actuellement 4) de sockets différents. Pour l'instant, j'utilise select avec un set_size calculé, mais quelle est la limite supérieure, avant qu'il ne vaille la peine d'utiliser FD_SETSIZE à la place ?

Voici quelques exemples de code pour illustrer ce point. Tout d'abord, la construction de l'ensemble :

FD_ZERO(&set);
FD_SET(socket1, &set);
FD_SET(socket2, &set);
FD_SET(socket3, &set);
FD_SET(socket4, &set);

Voici comment est calculé le set_size :

set_size = MAX(socket1, socket2);
set_size = MAX(set_size, socket 3);
set_size = MAX(set_size, socket4);
set_size += 1;

Et l'usage :

while ((cnt = select(set_size, &set, NULL, NULL, &t)) != -1 || errno == EINTR) {
    if (cnt > 0)
        // Do different stuff depending what socket is active
    else
        // Keep everything alive and add the sockets to the set again
}

Récemment, j'ai dû ajouter deux nouvelles prises et il se peut que je doive en ajouter d'autres à l'avenir. Quand utiliseriez-vous FD_SETSIZE plutôt que le set_size calculé ?

2voto

Celada Points 12082

Je ne me suis jamais inquiété de cette question, car il semble que la différence soit minime par rapport à la pénalité de performance liée à l'utilisation de l'option select() en premier lieu.

Cela dit, je pense qu'il vaut toujours la peine de calculer la valeur correcte, car le calcul n'est pas très coûteux : si l'on conserve la valeur actuelle de l'euro, il est possible d'obtenir une valeur plus élevée. set_size dans une variable locale comme vous le proposez, c'est O(1) avec une constante très faible à chaque fois que vous ajoutez un fd (à savoir, une comparaison et éventuellement une mise à jour). La suppression d'un fd est également O(1) sauf s'il s'agit du dernier de la liste (dans ce cas, c'est O( set_size ) mais généralement meilleure). D'autre part, le fait de ne PAS calculer le set_size signifie que le noyau doit traverser toutes les FD_SETSIZE chaque fois que vous appelez select . Depuis le set_size est probablement un peu plus petit que le FD_SETSIZE il est intéressant de fournir la plus petite valeur. Même si set_size est proche de FD_SETSIZE , en calculant set_size est tellement bon marché qu'il vaut probablement toujours la peine d'être utilisé.

Bien entendu, si vous vous préoccupez à ce point des performances, vous devez vous pencher sur les points suivants poll() au lieu de select() . Mieux encore, vous devez vous intéresser à epoll y kqueue mais ce n'est pas portable car ces fonctions ne sont disponibles que sous Linux et FreeBSD (y compris MacOS) respectivement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X