Verrous complexes

Les verrous complexes sont des verrous en lecture-écriture qui protègent les sections critiques des unités d'exécution. Les verrous complexes sont préemptables, ce qui signifie qu'une unité d'exécution de noyau peut être préemptée par une autre unité d'exécution de noyau de priorité supérieure alors qu'elle contient un verrou complexe.

Les services de noyau de verrouillage complexes sont les suivants:

Article Descriptif
Lock_init Initialise un verrou complexe.
Lock_islocked Teste si un verrou complexe est verrouillé.
Lock_done Déverrouille un verrou complexe.
Lock_read, Lock_try_read Verrouillage d'un verrou complexe en mode lecture partagée.
Lock_read_to_write, Lock_try_read_to_write Met à niveau un verrou complexe du mode de lecture partagée en mode d'écriture exclusive.
Lock_write, Lock_try_write Verrouillage d'un verrou complexe en mode d'écriture exclusive.
Lock_write_to_read Téléclasse un verrou complexe du mode d'écriture exclusive en mode lecture partagée.
Lock_set_recursive Prépare un verrou complexe pour une utilisation récursive.
Lock_clear_recursive Empêche l'acquisition récursive d'un verrou complexe.

Par défaut, les verrous complexes ne sont pas récursifs (ils ne peuvent pas être acquis en mode d'écriture exclusive plusieurs fois par une seule unité d'exécution). Un verrou complexe peut devenir récursif via le service de noyau Lock_set_recursive . Un verrou complexe récursif n'est pas libéré tant que Lock_done n'est pas appelé une fois pour chaque fois que le verrou a été verrouillé.

Les verrous complexes ne sont pas des verrous de spin ; une unité d'exécution de noyau qui tente d'acquérir un verrou complexe peut tourner brièvement (en temps d'attente: exécuter à plusieurs reprises des instructions qui ne font rien) si le verrou n'est pas libre. Le tableau montre le comportement des unités d'exécution de noyau qui tentent d'acquérir un verrou complexe occupé:

Mode de verrouillage en cours Le propriétaire est en cours d'exécution et aucune autre unité d'exécution n'est Asleep sur cet verrou Le propriétaire est en veille
Exclusif-écriture L'appelant tourne au départ, mais dort si le seuil de rotation maximal est franchi ou si le propriétaire dort plus tard. L'appelant dort immédiatement.
Partagé-lecture en cours d'acquisition pour écriture exclusive L'appelant dort immédiatement.
Partagé-lecture en cours d'acquisition pour lecture partagée Verrouillage accordé immédiatement
Remarque :
  1. Sur les systèmes uniprocesseur, le seuil de rotation maximal est défini sur un, ce qui signifie qu'une unité d'exécution de noyau ne tournera jamais en attente d'un verrou.
  2. Le concept d'un propriétaire unique ne s'applique pas à un verrou détenu en mode lecture partagée.