[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