processus et boucle infinie -> ressources CPU à 100% ou pas? - C - Programmation
Marsh Posté le 26-02-2006 à 20:50:50
namerh a écrit : supposons que je crée une boucle infinie au sein d'un processus ou d'un thread.. |
Ben si, et sous Linux 2.4 (non préemptif), ça tue. Inclus un usleep(100) dans la boucle, ca va donner de l'air.
Tu parles de CreateProcess() (Windows). Ca va ramer sérieusement. Inclus un Sleep(1)...
Mais il y a certainement un problème de conception. Que veux-tu faire exactement ?
Marsh Posté le 26-02-2006 à 21:38:17
Emmanuel Delahaye a écrit : Mais il y a certainement un problème de conception. Que veux-tu faire exactement ? |
Ralentir la bécane à mort ou la rendre inopérante ?
Marsh Posté le 26-02-2006 à 21:38:26
Linux 2.4 pas préemptif
Enfin comme déja demandé, que veux tu faire ?
Si un programme a besoin de faire des calculs lourds (il n'attend rien de l'extérieur, il ne donne pas de temps aux autres à coup de Sleep() et autres,...), c'est normal que le processeur se trouve utilisé à fond tant que le calcul n'est pas fini...
Marsh Posté le 26-02-2006 à 21:45:50
Mackila a écrit : Linux 2.4 pas préemptif |
http://sic.epfl.ch/SA/publications [...] ge9ag.html
"Par défaut, le noyau de Linux 2.4 n'est pas préemptif."
Marsh Posté le 26-02-2006 à 21:46:48
ah désolé je n'ai pas précisé que le système utilisé est préemptif..
donc je repose la question, un sleep() est-il toujours nécessaire à l'intérieur d'une boucle infinie, meme sur un système préemptif?
(ce que je fais est classé top secret .. bon disons que je m'initie à la prog système.. et que j'ai besoin d'un thread qui utilise une boucle non-stop pour gérer des événements clavier.. voila en gros.. mais ça dépasse l'objet de ma question )
Marsh Posté le 26-02-2006 à 21:50:57
namerh a écrit : ah désolé je n'ai pas précisé que le système utilisé est préemptif.. |
C'est moins critique qu'en coopératif, mais c'est quand même bien crade et c'est pas gentil pour les autres processus et threads...
Citation : (ce que je fais est classé top secret .. bon disons que je m'initie à la prog système.. et que j'ai besoin d'un thread qui utilise une boucle non-stop pour gérer des événements clavier.. voila en gros.. mais ça dépasse l'objet de ma question ) |
Les évènements hardware, je les gère (Linux 2.4 embarqué pour Power PC) avec un thread de polling à 100 µs :
usleep (100); |
Marsh Posté le 26-02-2006 à 21:53:32
Ecoute, tu fais ce que tu veux. Si tu veux faire une boucle infinie sans pause et donner au process correspondant realtime priority, be my guest.
Avec un sleep, il sera peut-être possible d'utiliser la machine, par exemple pour interrompre le process de ton projet secret de hack massif si ça venait à mal tourner.
Marsh Posté le 26-02-2006 à 21:53:59
ok merci.. ça correspond à mes observations..
mes acquis théoriques sur la notion de préemption n'était pas bien assimilés.. je pensais que meme une boucle pouvait etre momentanément suspendue pour laisser un autre thread s'executer mais apparemment pas (sauf si on le prévoit en faisant un sleep)
Marsh Posté le 26-02-2006 à 21:56:22
namerh a écrit : mes acquis théoriques sur la notion de préemption n'était pas bien assimilés.. je pensais que meme une boucle pouvait etre momentanément suspendue pour laisser un autre thread s'executer mais apparemment pas (sauf si on le prévoit en faisant un sleep) |
Marsh Posté le 26-02-2006 à 21:57:02
Emmanuel Delahaye a écrit : http://sic.epfl.ch/SA/publications [...] ge9ag.html |
Pour 2.4, il y a les patchs low-latency d'Andrew Morton et premmption de Robert Love.
Marsh Posté le 27-02-2006 à 04:40:56
Emmanuel Delahaye a écrit : http://sic.epfl.ch/SA/publications [...] ge9ag.html |
C'est le noyau lui-même qui n'est pas préemptif, mais les applis sont préemptées... Même en 2.4, une appli qui fait une boucle infinie en user space perd le cpu si un autre process a besoin du cpu. C'est la définition d'un système préemptif. Linux 2.4 est un système préemptif.
Celà dit, que le système soit préemptif ou non ne change pas grand chose au problème. Si tu peux faire autrement, faire une boucle infinie "active" n'est jamais une bonne solution. Il y a surement moyen d'endomir ton thread en attendant l'évenement qui l'intéresse.
Marsh Posté le 27-02-2006 à 08:48:12
matafan a écrit : C'est le noyau lui-même qui n'est pas préemptif, mais les applis sont préemptées... |
Ah, ok. J'écris plus de drivers que d'applications, désolé !
Marsh Posté le 26-02-2006 à 20:40:09
supposons que je crée une boucle infinie au sein d'un processus ou d'un thread..
à l'execution, on n'aura pas 100% des ressources du CPU occupées, si?
j'ai fait qques essais avec un createprocess() mais ma boucle monopolise le CPU.. donc j'ai un doute..
merci
Edit:
P.S. sur un O.S. préemptif !
Message édité par namerh le 26-02-2006 à 21:45:18