Comment faire stackless coroutines diffèrent de stackful coroutines?

De fond:

Je vous pose cette question car j'ai actuellement une application avec plusieurs (centaines de milliers) de threads. La plupart de ces threads sont en veille une grande partie du temps, de l'attente sur les éléments de travail pour être placé dans une file d'attente. Lorsqu'un élément de travail est disponible, il est ensuite traité par l'appel de certains arbitrairement complexe de code existant. Sur certaines configurations de système d'exploitation, l'application se heurte à des paramètres au noyau régissant le nombre maximum de processus utilisateur, donc j'aimerais expérimenter avec des moyens de réduire le nombre de threads de travail.

Ma solution proposée:

Il semble comme une coroutine approche fondée sur les, où j'ai remplacer chaque thread de travail avec une coroutine, serait de les aider à accomplir cela. Je peux alors avoir une file d'attente de travail soutenu par un pool de réels (noyau) de threads de travail. Lorsqu'un élément est placé dans une coroutine de la file d'attente pour le traitement, l'entrée serait placé dans le pool de threads de la file d'attente. Il serait alors reprendre le correspondant de la coroutine, traiter ses données en file d'attente, puis de le suspendre de nouveau, libérant ainsi le thread de travail à faire d'autres travaux.

Détails de mise en œuvre:

Dans la réflexion sur comment je pourrais faire cela, je vais avoir de la difficulté à comprendre les différences fonctionnelles entre les stackless et stackful coroutines. J'ai une certaine expérience à l'aide de stackful coroutines à l'aide de la Coup de pouce.Coroutine de la bibliothèque. Je trouve que c'est relativement facile à comprendre à partir d'un niveau conceptuel: pour chaque coroutine, il conserve une copie de la CPU contexte et de la pile, et lorsque vous passez à une coroutine, il passe à celui enregistré contexte (tout comme un mode noyau planificateur serait).

Ce qui est moins clair pour moi, c'est comment un stackless coroutine diffère de ce. Dans mon application, le montant des frais généraux associés à la mise en attente des éléments de travail est très important. La plupart des implémentations que j'ai vu, comme la nouvelle bibliothèque de CO2 suggèrent que stackless coroutines fournir beaucoup plus faible surcharge des changements de contexte.

Donc, j'aimerais comprendre les différences fonctionnelles entre les stackless et stackful coroutines plus clairement. Plus précisément, je pense à ces questions:

  • Références comme celui-ci suggèrent que la distinction réside dans où vous pouvez rendement/reprendre dans un stackful vs stackless coroutine. Est-ce le cas? Est-il un simple exemple de quelque chose que je peux faire dans un stackful coroutine, mais pas dans un stackless un?

  • Il y a des restrictions sur l'utilisation de stockage automatique des variables (c'est à dire les variables sur la pile")?

  • Il y a des restrictions sur ce que les fonctions que j'pouvez appeler à partir d'un stackless coroutine?

  • Si il n'y a pas de sauvegarde de contexte de la pile pour un stackless coroutine, où le stockage automatique des variables d'aller quand la coroutine est en cours d'exécution?

  • "La plupart de ces threads sont en veille une grande partie du temps, de l'attente sur les éléments de travail pour être placé dans une file d'attente" - si c'est le cas, pourquoi il y a autant de fils?
  • Pour des raisons d'héritage. Je ne dis pas que c'est une bonne conception comme l'est, d'où mon désir de l'améliorer. Refactoring de l'ensemble de l'application en gros n'est pas à court terme de l'option, donc je suis à la recherche d'relativement simple rénovation pour commencer. Potentiellement compliquer encore plus les choses, le blocage d'appels de la file d'attente est généralement composé de plusieurs niveaux de profondeur dans la pile d'appel (c'est à dire pas dans le thread de travail est fonction de niveau supérieur). Je pense que cela permettrait d'éviter l'utilisation de stackless threads dans ce contexte spécifique.
InformationsquelleAutor Jason R | 2015-03-11