URL: https://linuxfr.org/forums/programmation-c--2/posts/polling Title: Polling Authors: JaguarWan Date: 2005年10月07日T02:09:57+02:00 Tags: Score: 0 Bonsoir, j'ai encore une question relative au réseau ;) J'ai testé mon serveur avec siege, et le bousin dépasse difficilement les 100 requêtes par seconde... Tandis qu'un *vrai* serveur genre thttpd, en traite plus de mille sans broncher. Après quelques expérimentations, j'en suis à réécrire le polling. Avant, il était géré avec un bête select(), mais forcément ça marche moins bien en charge. J'ai testé epoll, c'est vraiment une bonne API, mais en même temps ce n'est pas du tout portable... J'ai pensé à un compromis qui me parait être "moins pire" que le bête select(), mais qui serait aussi portable. Avant le pseudocode, le contexte: - dead et alive, deux FIFO. 'dead' contient les sockets qui ont causé une erreur EWOULDBLOCK, 'alive' les sockets prêts à l'emploi. - L'insertion d'un socket dans dead se fait via une fonction qui vérifie qu'il est bien mort en lecture/écriture, le remet dans alive autrement. Voilà le pseudocode du machin en question, pour un thread dédié: void *socket_polling(void *) { while(control == true) { /* traite les sockets de la pile 'dead' */ if ( (item = pop(dead)) != NULL) { FD_SET(set, item->fd); /* verifie que le socket est bien mort */ select(item->fd, ...); if (FD_ISSET(set, item->fd)) { /* il simulait, au boulot fainéant */ push(alive, item); } else { /* bel et bien mort (pour le moment) */ push(dead, item); } } } return NULL; } Ce travail également pourrait être avantageusement réparti entre différents thread travailleurs: chacun récupère un socket sur la pile dead, s'il est prêt tant mieux, sinon il est rejeté dans la pile et un socket fiable est récupéré sur la pile alive. Question subsidiaire: il existe une ioctl bien commode pour savoir s'il y a de la lecture sur un socket, FIONREAD, qui est assez portable (même Windows l'a). Y a-t-il un équivalent pour l'écriture ? J'ai eu vent de FIONSPACE ou FIONWRITE, mais elles n'ont pas l'air très portables... Ça permettrait de complètement supprimer select(). Je vous remercie d'avance pour vos réponses :)