2010-09-02 8 views
1

Je travaille sur une application dans laquelle des milliers de tâches associées avec des centaines de périphériques, chaque tâche nécessitant, < 5ms pour commencer l'exécution, et prenant en moyenne 100ms pour terminer.Aide avec un algorithme de planification des tâches

Les conditions sont en tant que tels:

  1. Chaque dispositif ne peut traiter une tâche unique à la fois, par exemple, une tâche doit terminer l'exécution de son dispositif attribué avant d'être la processeed de tâche subséquente.
  2. Le planificateur doit être efficace. Actuellement, le traitement de la file d'attente de travail d'un périphérique prend plus de temps que la somme de ses tâches.

Voici la description de base de la mise en œuvre actuelle:

Chaque dispositif contient une file d'attente de travail qui est rempli de tâches associées à ce dispositif . Lorsqu'une tâche est mise en file d'attente, sa file d'attente est placée dans une file d'attente d'exécution globale (une file d'attente). La file d'attente d'exécution globale est consommée par un thread de travail qui déqueue les objets de tâche du périphérique, en traite un, puis place la file d'attente de périphériques à l'arrière de la file d'attente d'exécution globale. Lorsque ce périphérique donné a été dequeued à nouveau, le thread de travail vérifie si la tâche est terminée, si c'est le cas, la tâche suivante est exécutée. Ce processus se poursuit, jusqu'à ce que toutes les files d'attente de périphérique aient été épuisées de tâches dans la file d'attente globale.

Des suggestions d'amélioration? Est-ce que je l'ai dit clairement? Sinon, faites le moi savoir, et je ferai de mon mieux pour clarifier.

Merci d'avoir pris le temps de regarder par-dessus. Cordialement.

+0

Une tâche donnée peut-elle être traitée par un seul et même périphérique, ou un périphérique peut-il traiter une tâche? Que voulez-vous dire par "une tâche prend <5ms pour commencer à exécuter"? Voulez-vous dire qu'il doit être démarré dans les 5ms? (Si non, en quoi ce fait est-il pertinent?) –

+0

@Stephen - une tâche prend <5ms pour commencer à s'exécuter, car plusieurs étapes précèdent l'exécution de la tâche, par exemple, le périphérique doit être contacté, etc. –

+0

@Stephen - a une tâche donnée, ou un ensemble de tâches est associé à un appareil unique, alors pour répondre à votre question: non, aucun appareil ne peut traiter de tâche. –

Répondre

1

Que diriez-vous quelque chose comme le ExecutorCompletionService ainsi qu'un ThreadPoolExecutor. Cela vous permet d'effectuer un rappel à la fin, que vous pouvez utiliser pour soumettre les tâches suivantes, et un pool d'unités d'exécution géré, que vous pouvez modifier pour améliorer le débit.

Je vous suggère d'exécuter votre code via un profileur pour voir quels threads bloquent actuellement (il semblerait que ce soit les threads de votre périphérique de production). Je peux recommander YourKit Java Profiler, mais ce n'est pas gratuit.

+0

C'est la première fois que j'entends parler de l'interface CompletionService; Je vous remercie.Après avoir lu la description, mon implémentation actuelle est très similaire à celle de ExecutorCompletionService. Cependant, je vais le tester. Peut-être que cela réduira le temps de traitement de la file d'attente. –

0

Le problème avec votre conception est qu'une seule tâche est exécutée à la fois, ce qui signifie que tout périphérique est inactif pendant l'utilisation d'un autre périphérique. Comme il y a des centaines de périphériques, il ne serait probablement pas une bonne idée d'assigner un thread à chacun de ces périphériques, mais un pool de threads pourrait très bien être utilisé.

+0

Le thread de travail qui utilise la file d'attente d'exécution globale a accès à un pool de threads ExecutorService; donc plusieurs appareils traitent des tâches. Je suis d'accord, qu'un thread par périphérique est la mauvaise approche. Merci pour vos commentaires. –

Questions connexes