[SOS] Dupliquer une tâche ...
David Decotigny
david.decotigny at free.fr
Lun 6 Mar 10:10:12 CET 2006
Bonjour,
Je vais repondre dans le vide : je n'ai rien testé.
Au niveau user, il est bien evident que tes 2 threads vont executer le
meme code issu de la meme chaine d'appels de fonctions. Donc en theorie,
c'est simple : il "suffit" de reguler, par des synchros, les acces
concurrents aux objets partagés. Mais en pratique, reperer ces objets
partagés peut être tres delicat dans ce cas, et plus subtil que
d'habitude (quand tes 2 threads ne sont pas issus de la meme chaine
d'appels de fonctions).
Je pense qu'il peut y avoir des cas delicats dans lesquels meme les
variables "locales" a tes threads (allouées dans la pile) se retrouvent
partagées par tes 2 threads. Dans ce cas ça pose probleme car tu n'avais
pas prévu qu'il y ait acces concurrents sur ces objets ! Un exemple ? Je
ne suis pas sûr de celui-là, mais tentons... Avant d'appeler ton
syscall, une des fonctions appelantes alloue des choses dans sa pile,
puis fait ton syscall, qui retourne dans cette fonction appelante qui
fait joujou avec ces choses dans la pile : il y aura alors 2 threads
dans cette fonction appelante, qui feront joujou avec la pile. Or, ce
que je crains, c'est qu'il se peut que le code du nouveau thread accede
a la pile du thread "parent" (celui qui a fait ton syscall), et pas a sa
propre pile comme on pourrait l'imaginer ! Ca depend comment ladite
fonction appelante est /codée/... et ça peut etre code avec les pieds
(en appli user, on ne peut faire aucune hypothese sur la proprete du
codage) ! Donc je pense qu'en general tu ne peux pas avoir de garantie
qu'il n'y aura pas de partage non-voulu de variables locales allouées
dans la pile. Ou alors il faut que tu emettes des regles de codage
strictes. Et de toute façon il faudra aussi verifier que le compilo ne
fait pas de choses bizarres avec des variables allouees dans la pile
(genre que lui-meme ne génère pas de partage non voulu de variables de
piles). Mais, avec gcc, je ne pense pas (à vérifier). Bref, au niveau
user, cette technique me parait assez (très ?) dangereuse.
Maintenant, au niveau noyau ça ne devrait pas poser tous ces problemes.
A une seule condition cependant ! Si ton OS suit le meme fonctionnement
que SOS, il faut que tu aies cree un contexte noyau tout neuf pour ton
nouveau thread user. C'est sûr que si ton OS fait la meme hypothese
simplificatrice que SOS (1 contexte noyau par thread user), et que tes 2
threads user partagent le meme contexte noyau, ça va exploser. Si ton OS
ne fait pas la meme hypothese, a toi de bien reflechir.
Bonne journee,
--
David Decotigny -- http://david.decotigny.free.fr
Plus d'informations sur la liste de diffusion Sos