Question sur l'algorithme de section critique
-
06-07-2019 - |
Question
Les Concepts de système d’exploitation de la 6e édition présentent un algorithme trival permettant d’implémenter la section circulaire.
do{
while (turn != i);
critical section
trun = j;
remainder section
} while(1);
Remarque , Pi est le processus avec l'identifiant i, Pj est le processus avec l'identifiant j.Pour simplifier la question, le livre limite les i, j à 0 et 1, les deux processus constituant l'environnement.
La Question1 consiste à appliquer cet algorithme à résorber l'exigence Progress , qui est l'une des trois exigences de la solution de section circulaire.
À mon avis, lorsque Pi se trouve dans la section restante, elle ne peut pas participer à la décision quant à savoir si Pj peut ou non entrer dans la section critique. Il est ensuite lié à l'exigence.
Ou bien ma compréhension des exigences de progrès est totalement fausse.Alors parce que si Pi se retirait de la section restante, il ne pourrait pas entrer immédiatement dans la section cirtique, cela enfreindrait la règle.
Question2 ,
Si turn == 0 et que P1 est prêt à entrer sa section critique, P1 ne peut pas faire donc, même si P0 peut être dans son section restante
Pour autant que je sache, je ne pouvais pas comprendre pourquoi turn == 0 et que p0 soit dans la section restante pourrait exister simultanément ...
Donc, cette déclaration est fausse?
La solution
Supposons que turn = 0
initialement. P0 fait sa section critique et définit turn = 1
. Maintenant, P1 doit exécuter sa section critique avant que P0 puisse l'exécuter à nouveau. Mais le fait que les deux discussions aient une section critique ne signifie pas qu’ils vont vouloir en alterner l’utilisation de cette façon: en fait, P1 risque de ne jamais prendre son tour. (Et dans le cas général, vous ne pouvez pas déterminer cela au moment de la compilation .)
En gros, le problème est que les threads sont obligés d'alterner leurs tours , même si l'un d'entre eux ne veut pas entrer dans sa section critique pendant un temps indéfiniment.
Au fait, votre réponse à la question 1 est correcte. L'algorithme n'échoue pas avec la condition Progression , il échoue avec la condition En attente .
.