[Kos-dev] Reentrance de reschedule : un solution ?
d2
kos-dev@enix.org
26 Jun 2001 11:50:08 +0200
>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@ifrance.com> writes:
Thomas> cela correspond en quelque sorte a la solution que j'ai
Thomas> proposee dans le mail que je viens d'envoyer, en reponse a
Thomas> Hlide me semble-t-il ?
Dans le draft-0, j'avais evoque (cf 1.3.2) un inconvenient a la
methode que tu rappelles dans ton mail : systematquement deleguer un
thread a chaque interruption est lourd (chgt de contexte
systematique). C'est pour ca que je proposais une solution plus
souple, a 3 niveaux :
- ce que tu appelles "le prehandler" : non interruptible
- ce que j'appelle le Bottom Half (ou wait queue Linux): dans le
contexte de l'ISR normal = celui du thread interrompu =>
interruptible mais non bloquable. Se charge du reschedule()
(uniquement pour l'interruption la plus externe) + iret.
- les threads proxy (ie mandataires) : choisis a la volee dans un
pool pre-alloue de threads : pour les traitements interruptibles
et bloquables. Le reschedule est implicite a chaque bloquage, et a
chaque terminaison de traitement.
C'est le programmeur qui determine dans quelle "categorie"
(pre-handler, BH, proxy) il ecrit les differents traitements des
interruptions.
Schematiquement, on aurait :
| ================= ISR ====+=========== |reschedule(*) |============|
| | | + | proxy |
|<--- Non Interruptible --> | <-- BH --> |iret |<---------->|
(*) : quand nested_level == 1
Sachant que dans les proxies "Le reschedule est implicite a chaque
bloquage, et a chaque terminaison de traitement".
Ca ressemble a la solution rappelee par Thomas, a ceci pres qu'on
rajoute un etage intermediaire (le BH), afin de ne pas causer
systematiquement de chgt de contexte a chaque traitement un peu
complique et non-bloquant dans les interruptions.
Voila.
--
d2