OVH Cloud OVH Cloud

mode User ou Kernel pour optimiser ?

4 réponses
Avatar
lolosoftprodel
bonjour,

j'ai une application (actuellement en appli win32 avec boite de
dialogue, classes MFC ...)
dans cette application je lance un thread de travail uniquement (sans
affichage, appels MFC ...)

ce thread doit mouliner aussi vite que possible :
voici en r=E9sum=E9 principal ce thread :
DWORD WINAPI ThreadExecution(LPVOID pParam)
{
while(!TerminateThreadExecution)
{
++CountLoop;
Travail ();
SleepEx(0,TRUE);
}
TerminateThreadExecutionSequentiel=3DFALSE;
return 0;
}

je calcule le nombre de passages mis sur des echantillons de 64 ms
(dans un autre timer de type timer multimedia =E0 1 ms) pour en deduire
avec le plus de precision possible le timing.
(je tourne environ 1 tour de boucle =3D 100 =B5s)

le temps semble constant meme si je "joue" avec l'applicatiopn , bouge
la fenetre ....
mais lorsque je commence a mettre d'autres applis (ex : explorer avec
RFM en direct) ou meme le fait d'ouvrir ou de fermer d'autres apllis,
le temps s'effondre et je perds ma stabilit=E9 (tout cela est
comprehensible et inevitable).

or en voyant les temps, je me posais la question suivante :
est ce qu'en mettant ce bout de code
"Travail();"
dans une boucle d'un driver en mode kernel que je piloterais par mon
aplli, les performances seraient am=E9lior=E9es ?
=20
=20
tous commentaires accept=E9s !!
merci d'avance.
--=20

Laurent.

4 réponses

Avatar
Cyrille Szymanski
"lolosoftprodel" wrote in
news::

ce thread doit mouliner aussi vite que possible :



C'est à dire ? Il faut qu'il s'exécute le plus rapidement possible,
c'est à dire qu'il soit prioritaire et qu'il utilise le plus de
ressources CPU possible ?


DWORD WINAPI ThreadExecution(LPVOID pParam)
{
while(!TerminateThreadExecution)
{
++CountLoop;
Travail ();
SleepEx(0,TRUE);
}
TerminateThreadExecutionSequentielúLSE;
return 0;
}

(je tourne environ 1 tour de boucle = 100 µs)



Ça c'est sans le SleepEx dans la boucle non ? Parce qu'avec je pense que
tu obtiens 1 tour de boucle > 10 ms (à cause de l'ordonnanceur).

lorsque je commence a mettre d'autres applis (ex : explorer avec
RFM en direct) ou meme le fait d'ouvrir ou de fermer d'autres apllis,
le temps s'effondre et je perds ma stabilité (tout cela est
comprehensible et inevitable).



Il faut essayer en augmentant la priorité du processus qui fait les
calculs.


or en voyant les temps, je me posais la question suivante :
est ce qu'en mettant ce bout de code
"Travail();"
dans une boucle d'un driver en mode kernel que je piloterais par mon
aplli, les performances seraient améliorées ?



Voir une autre discussion il y a peu de temps sur ce ng : "Conception de
thread" du 24 mars.

http://minilien.com/?owijrKbOfv

http://groups.google.fr/group/fr.comp.os.ms-
windows.programmation/browse_thread/thread/0affecd46e802b5a/3229ae2bb51c0
b14#3229ae2bb51c0b14

--
Cyrille Szymanski
Avatar
LoloSoft
...
> ce thread doit mouliner aussi vite que possible :



C'est à dire ? Il faut qu'il s'exécute le plus rapidement possible,
c'est à dire qu'il soit prioritaire et qu'il utilise le plus de
ressources CPU possible ?



en theorie, il doit tourner avec le CPU à 100% mais en laissant un peu les
autres applis réagir (SleepEx...)

> (je tourne environ 1 tour de boucle = 100 µs)
Ça c'est sans le SleepEx dans la boucle non ? Parce qu'avec je pense que
tu obtiens 1 tour de boucle > 10 ms (à cause de l'ordonnanceur).



non avec le SleepEx !
...
Il faut essayer en augmentant la priorité du processus qui fait les
calculs.


...
le probleme est que si j'augmente la priorité, plus rien ne tourne derriere
normalement car je communique avec d'autres applis qui elles ne sont pas
forcement en priorité ABOVENORMAL ou HAUTE
...
Voir une autre discussion il y a peu de temps sur ce ng : "Conception de
thread" du 24 mars.




merci pour les liens , je vais jeter un coup d'oeil.
http://minilien.com/?owijrKbOfv
http://groups.google.fr/group/fr.comp.os.ms-



Laurent.
Avatar
Arnaud Debaene
LoloSoft wrote:
...
ce thread doit mouliner aussi vite que possible :





C'est à dire ? Il faut qu'il s'exécute le plus rapidement possible,
c'est à dire qu'il soit prioritaire et qu'il utilise le plus de
ressources CPU possible ?



en theorie, il doit tourner avec le CPU à 100% mais en laissant un
peu les autres applis réagir (SleepEx...)



Ca ne sert à rien de faire un SleepEx, si ce n'est à dégrader les
performances de tout le système : Fais ta boucle aussi serrée que possible,
et c'est tout.
Windows est un système multi-tâches *préemptif*, ce qui veut dire qu'il
répartit de manière équitable le processeur entre les threads qui le
demandent. Si par exemple 2 applis calculatoires tournent en boucle serrée
en même temps, chacune aura 50% du CPU (alors que si 1 seule appli tournait,
elle aurait 100% du CPU).

Si tu veux éviter le "jitter" sur le temps de calcul lorsque le système est
chargé, la seule chose à faire est d'augmenter la priorité de ton thread,
mais de toute façon Windows n'est pas un OS temps réel, et tu n'auras
*jamais* aucune garantie de temps d'exécution (notamment, tu ne pourras
jamais masquer les interruptions et les DPC, que tu sois en mode user ou
kernel - enfin en mode kernel tu pourrais mais c'est la garantie de faire
exploser ton système et de terminer avec un beau BSOD ;-).

le probleme est que si j'augmente la priorité, plus rien ne tourne
derriere normalement car je communique avec d'autres applis qui elles
ne sont pas forcement en priorité ABOVENORMAL ou HAUTE



Alors il faut que tu te synchronises avec ces autres applis : une fois que
tu leur a envoyé des données, tu attends sur un événement qu'elles lèvent
quand elles ont traitées les données en question.
Si ce n'est pas possible, il faut redesigner ton système pour que la boucle
de temps "critique" fasse moins de choses, et que tu délègues une partie du
travail à une tache plus basse priorité avec une file d'attente (buffer
circulaire ou autre) entre les 2.

Ceci-dit, comme tu ne nous a pas expliqué ce que fais ton système, il est
impossible de te conseiller sérieusement : pourquoi est-ce que c'est
important que ta boucle de travail ait une durée constante? Tu fais du
streaming ou de l'acquisition?

En conclusion, sauf cas très particulier, c'est *normal* que le processeur
soit partagé entre les applis qui le demandent : c'est la conception même du
système qui veut çà et il n'y a pas grand chose à faire pour aller contre
(sans changer d'OS).
Dans tous les cas, faire du calcul en mode kernel est une TRES mauvaise idée
: tu ralentiras globalement ton système à cause des transitions user/kernel
et tu le fragiliseras parce que du code en mode noyau peut faire exploser la
machine n'importe quand. Et enfin, à priorité égale, un thread kernel n'est
pas différent d'un thread user et n'ira pas plus vite.

Arnaud
MVP - VC
Avatar
LoloSoft
merci pour les reponses.
je vais essayer de reformuler ma demande et mon projet en l'expliquant un
peu : d'ici mercredi car ...vacances

@+
--

à propos du SleepEx , j'avais essayé sans
mais on a plus la main ....

Laurent.

"Arnaud Debaene" a écrit dans le message de
news: 430df18f$0$2940$
Ceci-dit, comme tu ne nous a pas expliqué ce que fais ton système, il est
impossible de te conseiller sérieusement : pourquoi est-ce que c'est
important que ta boucle de travail ait une durée constante? Tu fais du
streaming ou de l'acquisition?