2009-05-15 12 views
7

Quel est le meilleur algorithme pour implémenter une bibliothèque de minuteur simple. La bibliothèque devrait permettre aux suivantes:Algorithme de minuterie efficace

  1. minuteries à commencé
  2. Timers être arrêté
  3. minuteries à vérifier si elles sont toujours en cours d'exécution

On Timer expiration d'une fonction de rappel sera appelé.

Le module de temporisation permettra aux temporisateurs d'avoir une résolution temporelle de Ns et le module recevra un coup de pied toutes les Ns pour inviter le module à vérifier les temporisateurs expirés.

De nombreuses minuteries peuvent être actives simultanément.

Le meilleur algorithme doit atteindre les objectifs suivants

  1. robuste à minuteries en cours de démarrage/arrêt pendant le traitement d'une minuterie de rappel d'expiration
  2. Autoriser minuteries à lancer, arrêté et vérifié rapidement
  3. Avez un faible encombrement mémoire

salutations

+0

Dans quelle langue devrait être la solution? –

+0

Je suis plus intéressé par l'algorithme que par l'implémentation. Si cela vous aide à savoir, je l'implémenterais probablement en C. Cordialement –

Répondre

8

meilleur algorithme que je l'ai vu pour minuteries est une roue de minuterie trouve dans le document de recherche Hashed and Hierarchical Timing Wheels: Data Structures for the Efficient Implementation of a Timer Facility

Je sais en Java il y a une implémentation avec Netty, JBoss et je suis sûr d'ailleurs aussi que vous pouvez utiliser, si vous écrivons en Java.

+1

L'article référencé discute différents algorithmes de minuterie et où ils peuvent être utilisés de manière appropriée. Si le lien échoue dans le futur, il peut être utile de savoir que le titre est "Roues de synchronisation hachées et hiérarchiques: Structures de données pour l'implémentation efficace d'une installation de temporisation" –

+1

Avant de lire votre réponse, je n'étais pas au courant de la classe NettyIO [ HashedWheelTimer] (http://netty.io/4.0/api/io/netty/util/HashedWheelTimer.html), mais l'implémentation semble excellente. Sans jeu de mots: Ne pas réinventer la roue! – kevinarpe

+1

Il existe également une implémentation C ici: http://www.25thandclement.com/~william/projects/timeout.c.html – starseeker

1

O n Les systèmes POSIX-ish, vous pouvez utiliser la famille de fonctions timer_create/timer_settime pour fournir beaucoup de ceci "gratuitement".

+1

Salut Kristopher, Je vais jeter un oeil à ces derniers mais je suis plus intéressé par l'algorithme que de prendre une bibliothèque de stock. Observe –

2

Les minuteurs sont généralement mieux implémentés dans un noyau de système d'exploitation, au niveau de l'assemblage/C, en utilisant des fonctionnalités spécifiques à la plate-forme telles que les minuteurs APIC dans la mesure du possible.

Vous pouvez consulter http://lwn.net/Articles/167897/ pour plus de détails sur l'implémentation de Linux et parcourir le code source Linux pour voir les implémentations fonctionnelles.

Questions connexes