boucle infinie = CPU 100% ?!

boucle infinie = CPU 100% ?! - C - Programmation

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 cité 1 fois
Message édité par nORKy le 20-02-2007 à 09:22:24
Reply

Marsh Posté le 19-02-2007 à 16:04:59   

Reply

Marsh Posté le 19-02-2007 à 16:15:09    

nORKy a écrit :

Bonjour,
 
Quelqu'un serait me dire pourquoi mon sniffer (utilisant libpcap) qui est dans un pthread me bouffe 100% CPU ??
Merci


 
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...
 

Reply

Marsh Posté le 19-02-2007 à 16:38:47    

Il manque un point-virgule à la ligne 42.

Reply

Marsh 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 :
  1. while (!fin); /* ligne 42 */
  2.        {
  3.             ...
  4.        }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 19-02-2007 à 21:35:43    

Bien vu [:god]

Reply

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.

Reply

Marsh Posté le 19-02-2007 à 22:58:01    

Emmanuel Delahaye a écrit :

Je dirais plutôt "un ; en trop à la ligne 42" :  

Code :
  1. while (!fin); /* ligne 42 */
  2.        {
  3.             ...
  4.        }



 
ah oui, forcément, s'il écrit n'importe quoi... :fou:

Reply

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

Reply

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


Message édité par lkolrn le 20-02-2007 à 10:21:51
Reply

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)

Message cité 1 fois
Message édité par Emmanuel Delahaye le 20-02-2007 à 10:33:05

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 20-02-2007 à 10:19:24   

Reply

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.

Reply

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...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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

Reply

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.

Reply

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 :=)


Message édité par nORKy le 21-02-2007 à 11:33:10
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed