2010-03-15 5 views
4

J'ai une application de traitement de communication réseau avec des appels de blocage. Chaque thread gère une seule connexion. J'ai ajouté un délai d'attente sur les opérations de lecture et d'écriture en utilisant select avant de lire ou d'écrire sur le socket.Est-ce que select() Ok pour implémenter le timeout de lecture/écriture single socket?

Select est connu pour être inefficace lorsqu'il s'agit d'un grand nombre de sockets. Mais est-ce correct, en termes de performances, de l'utiliser avec une seule socket ou y a-t-il des méthodes plus efficaces pour ajouter un support de timeout aux appels à socket unique? L'avantage de select est d'être portable.

Répondre

4

Oui, c'est pas de problème, et vous ne voulez certains mécanismes de délai d'attente pour ne pas perdre des ressources de mauvais clients qui se comportent etc.

note que la présence d'un grand nombre de fils est encore plus inefficace que d'avoir de sélection traitant avec un grand nombre des prises.

+0

Thanx. Je prévois d'utiliser libev pour gérer plusieurs canaux de communication simultanés. À ce stade, je considère simplement qu'un thread accède à une socket. – chmike

2

Si vous pensez que le choix est inefficace avec un grand nombre de sockets, essayez de manipuler un grand nombre de sockets avec un thread par sockt. Vous êtes dans un monde de douleur. Comme vous aurez des problèmes d'échelle à 1000 threads.

Ce que je l'ai fait dans le passé est que:

  • prises groupe dans les groupes de X (512, 1024).
  • Avoir un ou deux threads le long de ces groupes et sélectionner() - puis transférer les sockets avec de nouvelles données dans une file d'attente.
  • un certain nombre de threads de travail fonctionnent à partir de ces sockets avec de nouvelles données. Combien dépend combien je dois max la CPU;)

De cette façon, je n'AHVE super über select() avec TONNES d'articles, et je ne aussi perdre amountf ridicule de la mémoire sur les fils (indice: chaque thread a besoin de sa propre pile, avec seulement 2 Mo, c'est-à-dire 2 Go pour 1000 sockets - parler d'inefficace) et gaspiller des quantités énormes de CPU en faisant des changements de contexte inutiles.

0

La question avec les threads/select est de savoir si vous voulez éviter que les clients ne se bloquent les uns les autres. Si ce n'est pas un problème, alors travaillez à un seul thread. Si c'est le cas, choisissez un schéma de threads approprié (1 thread par connexion, threads de travail par connexion, thread de travail par requête, ...). Lorsque vous travaillez avec 1 thread par connexion, une sélection par lecture/écriture est une solution correcte, mais de manière générale, il est préférable de travailler avec des connecteurs non bloquants en combinaison avec select pour éviter le blocage dans les situations où seulement une partie du message attendu arrive, puis faites une sélection après l'écriture.

Questions connexes