boucle infinie = CPU 100% ?! - C - Programmation
Marsh Posté le 19-02-2007 à 16:15:09
nORKy a écrit : Bonjour, |
Il faut que tu met un mouchoir, et que tu ecrit dessu "we cannot guess your code source", et tu le place
entre ton modem et ta ligne de téléphone.
Comment se fait-il ??
c'est simple : Grâce aux mouchoirs stratégiquement posé sur ton câble modem, tu va réussir à faire dormir un peut le CPU, ce qui fait que ton sniffer ne bouffera plus 100% de CPU !
Et voilà ... remarque si ça marche pas c'est que la couleur de ton mouchoir n'est pas assez opaque...
Marsh Posté le 19-02-2007 à 16:38:47
ReplyMarsh Posté le 19-02-2007 à 20:28:47
Elmoricq a écrit : Il manque un point-virgule à la ligne 42. |
Je dirais plutôt "un ; en trop à la ligne 42" :
Code :
|
Marsh Posté le 19-02-2007 à 21:47:52
Tu devrais poster un peu de code pour qu'on se rende mieux compte. Etant donné que la libpcap est plutot fiable, ca doit certainement venir d'une erreur de ta part.
Marsh Posté le 19-02-2007 à 22:58:01
Emmanuel Delahaye a écrit : Je dirais plutôt "un ; en trop à la ligne 42" :
|
ah oui, forcément, s'il écrit n'importe quoi...
Marsh Posté le 20-02-2007 à 09:22:00
Finalement, c'est pas la libpcap :-)
En fait, j'ai un autre thread qui fait une boucle infinie (qui est obligatoire)
C'est une boucle qui vérifie 'en gros' si il y a eut des timeouts. Il regarde des structures (liste chainée) avec des temps X et regarde si un temp X + un temp Y est inférieur à un temp T.
Puis, il recommence.
Mais comme je peux tolérer une marge, j'ai rajouté un usleep de 1000 (0.1 s ?) à la fin du parcour et je ne mange plus rien de mon CPU
Marsh Posté le 20-02-2007 à 10:05:21
nORKy a écrit : usleep de 1000 (0.1 s ?) |
Ca fait 1 milli-seconde. T'as calculé le temps complet d'un cycle d'une boucle ? pour la marge d'erreur
Marsh Posté le 20-02-2007 à 10:19:24
nORKy a écrit : En fait, j'ai un autre thread qui fait une boucle infinie (qui est obligatoire) |
Si tu fais une boucle 'blanche', tu bouffes 100% du CPU. C'est horrible. Il faut mettre une suspension (sleep(1) : 1 ms suffit en général)
Marsh Posté le 20-02-2007 à 10:29:31
Emmanuel Delahaye a écrit : Si tu fais une boucle 'blanche', tu bouffe 100% du CPU. C'est horrible. Il faut mettre une suspension (sleep(1) : 1 ms suffit en général) |
ou bien arrêter de faire du polling et faire en sorte que la source de données génère des événements.
Marsh Posté le 20-02-2007 à 10:39:40
Taz a écrit : ou bien arrêter de faire du polling et faire en sorte que la source de données génère des événements. |
Question de conception. Les évènements, c'est bien théoriquement, mais on peut en louper. Le polling est souvent plus sûr et surtout plus siple à mettre en oeuvre...
Tout dépend de ce qu'on fait... Ici, par exemple, si il est question de gérer des timers logiciels (timeouts, généralement d'une précision de 1 seconde), un simple polling à 10 ou 100 ms devrait suffire...
Marsh Posté le 20-02-2007 à 13:46:38
Beh, c'est bien ce que j'ai dit :-) mon usleep corrige très bien mon problème.
Merci beaucoup
Marsh Posté le 20-02-2007 à 14:01:23
Pourquoi pas organiser la gestion de ta boucle avec un sémaphore ?
Pas de données: je dors 10ms. Des données: je bosse.
Marsh Posté le 21-02-2007 à 11:32:18
Beh, si il y a des données, ca veut dire que j'ai toujours une boucle infinie quand même
J'explique mieux.
Imaginez une liste chainée. Chaque élément est représente un "truc". Chaque truc possède un temps X. Ce temps X est mis à jour régulièrement par le processus principale selon certaines condition.
Le thread lui, parcour la liste chainé à l'infinie et vérifie que ce temps X + un temps Y défini est inférieur au temps actuel T (principe du timeout en gros).
Si ce temps est supérieur, l'élément est retiré de la liste.
Je peux donc avoir tous le temps des données dans ma liste chainée si mon processus principale le désire.
.. et donc parcour sans arret la liste, ... et donc plus de pause, ... et donc, CPU qui ne s'arrete pas.
Mes temps X et Y sont mesuré en plusieurs dizaine de seconde, donc, arreté mon thread toute les 100ms ne gène pas le déroulement de mon prog, donc, actuellement, je pense que je vais rester comme ca
J'espère que j'ai été clair :=)
Marsh Posté le 19-02-2007 à 16:04:59
Bonjour,
Quelqu'un serait me dire pourquoi mon sniffer (utilisant libpcap) qui est dans un pthread me bouffe 100% CPU ??
Merci
Message édité par nORKy le 20-02-2007 à 09:22:24