Chapitre 8. Notes sur le verrouillage

Table des matières
8.1. Les mutex
8.2. Les verrous du gestionnaire de verrous (Lock Manager)
8.3. Variables protégées atomiquement

Ce chapître est maintenu par The FreeBSD SMP Next Generation Project. Envoyez leur directement les commentaires et les suggestions à liste de diffusion concernant le traitement symétrique multiprocesseurs (SMP) sous FreeBSD.

Ce document souligne le verrouillage utilisé dans le noyau FreeBSD pour permettre d'utiliser du vrai multi-processeur à l'intérieur du noyau. Le verrouillage peut être réalisé par différents moyens. Les structures de données puvent être protégées par des mutex ou lockmgr(9) verrous. Quelques variables sont protégées simplement par l'utilisation continuelle d'opérations atomiques pour y accéder.

8.1. Les mutex

Un mutex est simplement un verrou utilisé pour garantir exclusion mutuelle. Spécifiquement, un mutex ne peut appartenir qu'à une entité à la fois. Si une autre entité désire obtenir un mutex déjà pris , elle doit attendre jusqu'à ce que le mutex soit relaché. Dans le noyau FreeBSD, les mutex appartiennent aux processus.

Les mutex peuvent être acquis récursivement, mais ils sont conçus pour n'être pris que pendant une courte période. Spécifiquement, le détenteur ne doit pas se suspendre pendant qu'il retient un mutex. Si vous avez besoin de maintenir un verrouillage pendant une suspension, utilisez un lockmgr(9) verrou ("lock").

Chaque mutex a plusieurs intérêts :

Nom de la variable

Nom de la variable struct mtx dans le code source du noyau.

Nom logique

Le nom du mutex lui est assigné par mtx_init. Ce nom est affiché dans les messages de trace KTR, témoigne des erreurs et avertissements et est utilisé pour distinguer les mutex dans les traces.

Type

Le type du mutex en termes de constantes nommées MTX_*. La signification de chaque constante nommée est documentée dans mutex(9).

MTX_DEF

Un mutex endormi

MTX_SPIN

Un mutex tournant

MTX_COLD

Ce mutex est initialisé très tard. Toutefois, il doit être déclaré via MUTEX_DECLARE, et la constante nommée MTX_COLD doit être passée à mtx_init.

MTX_TOPHALF

Ce mutex tournant ne désactive pas les interruptions.

MTX_NORECURSE

Ce mutex n'a pas la permission d'être recursif.

Protégés

Une liste de structures de données ou des membres de structure de données que cette entrée protège. Pour les membres de structures de données, le nom sera de la forme structure name.member name.

Fonctions dépendantes

Les fonctions qui peuvent seulement être appelées si ce mutex est pris.

Tableau 8-1. Liste du mutex

Nom de la variable Nom logique Type Protégés Fonctions dépendantes
sched_lock “sched lock” MTX_SPIN | MTX_COLD _gmonparam, cnt.v_swtch, cp_time, curpriority, mtx.mtx_blocked, mtx.mtx_contested, proc.p_contested, proc.p_blocked, proc.p_flag (P_PROFIL XXX, P_INMEM, P_SINTR, P_TIMEOUT, P_SWAPINREQ XXX, P_INMEN XXX), proc.p_nice, proc.p_procq, proc.p_blocked, proc.p_estcpu, proc.p_nativepri, proc.p_priority, proc.p_usrpri, proc.p_rtprio, proc.p_rqindex, proc.p_stats->p_prof, proc.p_stats->p_ru, proc.p_stat, proc.p_cpticks, proc.p_iticks, proc.p_uticks, proc.p_sticks, proc.p_swtime, proc.p_slptime, proc.p_runtime, proc.p_pctcpu, proc.p_oncpu, proc.p_asleep, proc.p_wchan, proc.p_wmesg, proc.p_slpq, proc.p_vmspace (XXX - in statclock), pscnt, slpque, itqueuebits, itqueues, rtqueuebits, rtqueues, queuebits, queues, idqueuebits, idqueues, switchtime, setrunqueue, remrunqueue, mi_switch, chooseproc, schedclock, resetpriority, updatepri, maybe_resched, cpu_switch, cpu_throw
vm86pcb_lock “vm86pcb lock” MTX_DEF | MTX_COLD vm86pcb vm86_bioscall
Giant “Giant” MTX_DEF | MTX_COLD nearly everything lots
callout_lock “callout lock” MTX_SPIN callfree, callwheel, nextsoftcheck, proc.p_itcallout, proc.p_slpcallout, softticks, ticks  

Ce document, ainsi que d'autres peut être téléchargé sur ftp.FreeBSD.org/pub/FreeBSD/doc/.

Pour toutes questions à propos de FreeBSD, lisez la documentation avant de contacter <[email protected]>.
Pour les questions sur cette documentation, contactez <[email protected]>.