Serrure circulaire sans tampon

Je suis dans le processus de conception d'un système qui se connecte à un ou plusieurs flux de flux de données et de faire une analyse sur les données de déclencher des événements en fonction du résultat. Dans un typique multi-thread producteur/consommateur, de l'installation, je vais avoir plusieurs threads producteurs de mettre les données dans une file d'attente, et plusieurs consommateurs fils de la lecture des données, et les consommateurs ne sont intéressés que dans le dernier point de données, plus le nombre n de points. Le producteur threads vont bloquer si lente à la consommation ne peut pas suivre, et bien sûr des consommateurs threads bloc quand il n'y a pas non transformés, les mises à jour. À l'aide d'un typique simultanées de la file d'attente avec un lecteur/graveur de verrouillage fonctionnent bien, mais le taux de données pourrait être énorme, donc j'ai voulu réduire mon surcharge de verrouillage surtout écrivain serrures pour les producteurs. Je pense qu'une circulaire sans verrouillage de la mémoire tampon est ce dont j'avais besoin.

Maintenant deux questions:

  1. Est circulaire sans verrouillage de la mémoire tampon la réponse?

  2. Si oui, avant que je roule mes propres, savez-vous tout public mise en œuvre qui permettra de s'adapter à mon besoin?

Tous les pointeurs dans la mise en œuvre d'une circulaire sans verrouillage de la mémoire tampon sont toujours les bienvenus.

BTW, faire cela en C++ sur Linux.

Quelques informations supplémentaires:

Le temps de réponse est critique pour mon système. Idéalement, le consommateur threads souhaitez voir les mises à jour à venir dès que possible parce qu'un supplément de 1 milliseconde retard pourrait rendre le système de valeur, ou dont la valeur est beaucoup moins.

L'idée de design, je suis penchée vers est un semi-lock-gratuit tampon circulaire où le producteur thread mettre les données dans la mémoire tampon aussi vite qu'il le peut, appelons le chef de la mémoire tampon A, sans blocage, sauf si le tampon est plein, lors d'Une rencontre à la fin de tampon Z. Consommation des threads de chaque titulaire de deux pointeurs du tampon circulaire, P et Pn, où P est le fil de la mémoire tampon locale tête, et Pn est nième élément après P. Chaque thread consommateur de promouvoir ses P et Pn une fois terminé le traitement actuel P et la fin de pointeur de tampon Z est avancé, plus lent Pn. Lorsque P rattraper à Un, ce qui signifie plus de nouvelle mise à jour de processus, le consommateur tours et ne occupés à attendre pour faire avancer de nouveau. Si thread consommateur spin pendant trop longtemps, il peut être mis pour dormir et d'attendre une variable de condition, mais je suis d'accord avec la consommation prise de cycle du PROCESSEUR en attente de mise à jour parce que de ne pas augmenter mon temps de latence (je vais avoir plus de cœurs que les threads). Imaginez que vous avez une piste circulaire, et le producteur est en cours d'exécution en face d'un tas de consommateurs, la clé est de régler le système de sorte que le producteur est généralement en passant à seulement quelques pas d'avance sur les consommateurs, et la plupart de ces opérations peuvent être effectuées à l'aide d'un lock-gratuit techniques. Je comprends les détails de la mise en œuvre n'est pas simple...ok, très dur, c'est pourquoi je veux apprendre des erreurs des autres avant de faire un peu de mes propres.

  • Je pense qu'il serait utile si vous esquissez l'API que vous souhaitez que cette structure de données à mettre en œuvre.
  • Quelque chose que j'ai apprise, c'est prendre de gros morceaux de travail. Je ne sais pas la taille de vos éléments de travail, mais vous pouvez augmenter l'efficacité si vous pouvez produire des gros morceaux et consommer de gros morceaux. Vous pouvez aussi augmenter par la consommation de taille variable morceaux pour les consommateurs n'ont pas tous fini à la fois et affronter la file d'attente de données.
  • Une autre chose à penser est que si vous avez besoin d'un tampon ou d'une série de tampons. Vous pourriez avoir de producteur/consommateur paires partageant un tampon, et quand un tampon est plein, le producteur ou le consommateur passe temporairement à un autre tampon. C'est une forme de travail de voler.
  • l'api est probablement juste une mise en file d'attente méthode plus une file d'attente de la méthode ... deux d'entre eux étant synchrone/blocage de modes, à savoir dequeue devrait bloquer s'il n'y avait rien dans la file d'attente, et de mettre en file d'attente du bloc si le buffer circulaire étaient pleins.
  • Efficace sans verrouillage des algorithmes uniques flocons de neige dont la découverte habituellement mérite un article de recherche. Je ne vais pas tenter de répondre à cette question jusqu'à ce que l'OP se distingue par une des exigences réelles de ce qu'il pense d'une solution devrait ressembler.
  • Zan Lynx: Oui, s'emmitoufler travail peut réduire de verrouillage de frais généraux. J'ai cela dans mes précédents systèmes. J'ai également de la dynamique de regroupement de la taille de la base sur la charge de travail. Il a fonctionné assez bien, mais cette fois, le débit est trop rapide pour mon ancien système, c'est pourquoi j'ai à repenser l'ensemble de la chose.
  • Une milliseconde est très rapide, calendrier de l'échéance non modifiée de Linux. Si un autre processus à exécuter, alors vous pourriez facilement passer à côté. Vous devez utiliser des priorités en temps réel, et même alors, je ne suis pas sûr que vous pouvez répondre de façon fiable aux ces délais. Êtes-vous sûr que vous devez être que sensible? Pouvez-vous faire seulement les producteurs de fast, les mettent en œuvre par exemple un pilote de périphérique, et détendez-vous sur les exigences sur les consommateurs?
  • Doug, ce que je voulais dire c'est 1 milliseconde fera une grande différence. Je n'ai pas fait tout de profilage pour voir si d'autres processus du système peut-être causer la latence sur mon système, mais je pense que sur la moyenne de la préemption par le processus de système ne va pas avoir un impact significatif.
  • pourquoi ne pas simplement utiliser les sémaphores? Pas de verrouillage et de blocage, le consommateur ne va dormir lorsque le tampon est vide, producteur lorsque le tampon est plein. Quel est le mal?
  • Si vous avez vraiment besoin de dur-comportement en temps réel, c'est probablement la peine de regarder dans l'exécution du programme comme un dur en temps réel de la tâche sur une unité de système d'exploitation temps réel. Pour un Linux-friendly version, découvrez Xenomai, il vous permettra de courir en temps réel et régulier (soft real-time/non temps réel) processus simultanément dans le même environnement.

InformationsquelleAutor Shing Yip | 2009-05-15