[Kos-dev] Reentrance de reschedule : un solution ?
Hlide
kos-dev@enix.org
Tue, 26 Jun 2001 23:25:05 +0200
Bon j'ai parfaitement saisi la solution que propose D2, de même que celle de
Thomas. Néanmoins je préfère celle de David qui est plus flexible et plus
efficace pour les raisons suivantes :
1) Thomas : tu proposes que les BH soient effectués SYSTEMATIQUEMENT dans
un thread séparé de celui interrompu. Ce changement de contexte s'avère
totalement inutile si on peut garantir que le BH ne sera pas bloquant - on a
donc une perte d'efficacité.
2) David propose que les BH soient non bloquants et qu'il existe une
troisième classe qui peut être bloquante : les threads mandataires ou
proxies. C'est au programmeur de décider si il utilisera un BH ou un proxy.
Les BH sont donc plus efficaces. Quant aux threads mandataires, on les
utilise en dernier recours.
Cependant il reste des éceuils :
3) Si on sait que le code du programmeur exécuté dans un proxy n'est pas
systématiquement bloquant ou qu'il l'est très rarement - on a alors
effectivement une solution pas optimale.
4) Si le programmeur décide d'utiliser un BH avec une ressource bloquante,
c'est la catastrophe, car on va effectivement bloqué une tâche victime.
Qouiqu'il en soit, je suis tenté - comme David - de penser que les BH
doivent être non-bloquants. Pourquoi ? il est hors de question qu'un
périphérique soit bloqué à cause un BH bloqué.
Mais admettons la possibilité des BH bloquants.
Si l'on cherche la solution optimale, on doit tenir compte de deux choses :
- réduire les changements de contexte entre le BH et les tâches des victimes
au strict minimum.
- n'avoir recours à un thread séparé que s'il y a un réel blocage.
Deux constats :
- un BH n'a pas connaissance du contenu de la pile qui lui est antérieure.
Un soucis de moins.
- la pile du BH peut contenir des pointeurs se référant à elle-même, ce qui
invalide la possibilité de recopier cette pile dans une autre pile pour
dupliquer le thread. Un soucis de plus.
Dupliquer la tâche victime juste avant le blocage n'est pas envisageable à
cause du deuxième constat.
Par contre, un BH pourrait avoir sa propre pile. Il s'exécuterait dans un
premier temps dans la tâche victime. Si un blocage se présente, une liste
d'attente des BH bloqué prend en charge le BH en récupérant sa pile et on
restaure la pile d'origine à la tâche victime pour que celle-ci puisse
continuer quand ce sera son tour. Dans tous les cas, à la terminaison d'un
BH la pile d'origine est restituée à la tâche victime.
C'est une solution qui semble à cheval entre celle de Thomas et celle de
David.
Je vais réfléchir un peu là-dessus et vous apporter quelques sources pour
étudier l'intérêt et la faisabilité.
A la prochaine.