[SOS] Re: Evolution ?
David Decotigny
david.decotigny at free.fr
Mer 6 Avr 18:43:14 CEST 2005
Bonjour,
D'abord, pour répondre à Xavier qui a sûrement été beaucoup influencé
par http://www.acm.org/classics/oct95/ , oui : dans SOS il y a quelques
goto. Et ce n'est pas fini, il y en aura quelques autres encore (pas
trop, rassure-toi). Ce n'est pas que je garde des vieilles habitudes du
basic, c'est juste que dans certaines fonctions ça aide à la lisibilité
du code et à la maintenabilité aussi. Pour les fonctions qui doivent
fabriquer des choses en cours de route et qui doivent les "défabriquer"
en cas d'erreur, c'est très pratique, ça évite les redondances de code
(source d'oublis en cas de modif) ou les imbrications de if/else.
L'ideal eût été d'avoir un systeme d'exceptions au niveau du langage...
c'est là que Ada eût été tres apprecie.
weisenhorn.geoffroy at club-internet.fr wrote:
> Mais j'ai une question comment fait on dans sos pour terminer un thread
> il n'y a pas de thread Trash
> comme dans Koalys ?
Non et c'est volontaire. Dans SOS, les threads *noyau* n'ont le droit de
terminer que de leur propre initiative (ie terminaison dite "synchrone"
: appel a sos_thread_exit). La difficulte d'un systeme de terminaison
assynchrone (ie ce que tu cherches) est la suivante. Imagine qu'on
termine un thread qui possede un mutex. Dans ce cas, ceux qui sont en
attente du mutex ne seront jamais reveilles ? Evidemment, pour cette
question, il y a une reponse systematique : pour tout thread noyau qui
possede l'acces a une ressource, celle-ci est mise dans une "liste des
ressources possedees par le thread", et on appelle un callback sur
chacune de ces ressources quand le thread est termine. Je ne suis pas
sûr que cette solution ne soit pas source d'interblocage, mais a vue de
nez ça fait ce qu'on veut : ca marche bien meme en cas de terminaison
assynchrone. Techniquement, c'est une solution envisageable a faible coût.
Dans SOS, on n'a pas implanté ça. Mais on n'en n'a pas vraiment besoin
car à terme (je ne sais pas encore quand), ce genre de choses se fera
via l'espace utilisateur. De la meme facon que dans Unix : si un
processus P1 veut terminer un autre processus P2, un "signal" est envoye
a P2, ce qui correspond a l'execution d'une routine user dans le
processus P2, et cette routine peut faire ce qu'elle veut, en
particulier faire exit(). Bref, meme avec ce genre de mecanisme
assynchrone (au niveau *user*), ca se termine toujours par une
terminaison synchrone du thread *noyau* ET dans de bonnes conditions.
Car en effet, au final c'est un thread utilisateur en mode utilisateur
qui demande a SE terminer, donc on est sûr qu'il ne possede aucune
*synchro noyau* bas-niveau (sinon c'est que le noyau se vautre qqpart :
un thread noyau ne doit posseder aucune synchro noyau [ksynch] quand il
repasse en mode user) : le thread noyau "possede" juste les *synchro
user et ressources user* (en gros, je parle des "file descriptors"). Et
celles-ci, on sait les gerer parfaitement en cas de terminaison puisque
"exit" doit deja savoir les gerer. Bref, avec cette solution, on n'a pas
de cas particulier a gerer au niveau du noyau : juste un cas d'appel a
"exit" user tout a fait normal.
Voila le pourquoi de la chose. Mais encore une fois, le code de SOS
devrait pouvoir servir de base a faire des experiences. Le but n'est pas
de proposer un OS "ficelé" prêt à etre installe et a regarder "tourner".
C'est que vous compreniez comment ça marche pour changer des bouts,
etudier, et... faire mieux ! Je pense que cette "fonctionnalite" qui,
selon vous, "manque", ce serait un bon exercice pour voir les problemes
qui peuvent se poser (s'il en existe).
Tiens, pendant que j'y suis, voici une autre idee de truc interessant a
regarder : au niveau de kmem_vmm, on gere des regions classees par
adresses croissantes. Mais ce classement se fait de façon naïve, ie par
des listes ! Une idee d'amelioration serait d'utiliser des arbres, on
gagnerait enormement en complexite (O(log n) contre O(n)) donc en
rapidité. Si on ne l'a pas fait, c'est pour que le code de SOS ne soit
pas trop chargé avec une implantation des arbres binaires (p.ex
splay-trees comme dans KOS) très efficace, mais finalement pas
fondamentale puisqu'on peut obtenir la meme fonctionnalite avec des
listes. Dans l'article 7.5 vous pourrez remarquer le meme "probleme" : a
deux endroits, des listes classées auraient pu avantageusement etre
remplacées par des arbres.
Je pourrais donner d'autres idees de modifs. Si des gens sont
interesses, nous serions ravis de rajouter leurs contributions sur le
site de sos !
Bonne journee,
--
David Decotigny -- http://david.decotigny.free.fr
Plus d'informations sur la liste de diffusion Sos