Je pense que dans l'algorithme de Peterson pour l' exclusion mutuelle , si le processus premier à entrer dans la section critique devait mourir ou être annulée, l'autre processus serait toujours en boucle, en attendant d'entrer dans la section critique.
Dans l'image, si le processus 1 est arrêté, le reste des processus derrière le processus 1 s'exécutera jusqu'à l'endroit où se trouve le processus 1 mais en boucle.
Que se passe-t-il si le processus qui atteint la section critique meurt avant de le quitter?
Réponses:
Cela dépend de la façon dont les verrous sont mis en œuvre. Si vous le faites comme dans l'article Wikipedia, c'est-à-dire en gardant la section critique avec un booléen par processus¹, vous êtes certainement en difficulté. Si un processus meurt, il ne réinitialise jamais son indicateur, de sorte que l'autre processus boucle pour toujours.
En pratique, vous pouvez protéger votre code contre de nombreuses façons de mourir. Par exemple, prenez cette implémentation de style Java:
Cela garantira que l'indicateur est réinitialisé quoi qu'il arrive dans la section critique, tant que le système gère l'erreur. En Java, cela est vrai même pour les débordements de pile et de tas. Donc, à moins que le processus ne disparaisse littéralement (
kill
², panne de processeur, déconnexion du réseau, ...), vous êtes en sécurité. Notez que la plupart des logiciels non critiques échouent dans ces cas - comment peut-il gérer une erreur s'il n'est pas en cours d'exécution? - donc cela doit être accepté dans de nombreux cas. Vous pouvez gérer les incohérences au redémarrage si nécessaire.Si vous utilisez des verrous appropriés au niveau de la langue, le système d'exécution peut gérer les propriétaires de verrouillage disparaissant, c'est-à-dire libérer les verrous avec les propriétaires morts. Vous pouvez simuler cela vous-même en donnant à chaque processus un interrupteur d'homme mort que les autres peuvent lire, ou vérifier directement si le processus de possession de la serrure est toujours actif (si le système le prend en charge).
finalize
devrait s'exécuter même surkill
, mais ce n'est pas garanti par la spécification.kill -9
est probablement une condamnation à mort pour toute solution qui nécessite que le processus mourant fasse quelque chose.la source
Examinez les hypothèses, en particulier qu'aucun processus ne reste indéfiniment dans la section critique (cela inclut certainement le simple fait de partir). Je ne pense pas qu'il existe un moyen de résoudre ce problème général avec un mécanisme de synchronisation.
la source