Livre de chevet du développeur FreeBSD
Précédent |  | Suivant

# Chapitre 8. Notes sur le verrouillage

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` |

Précédent | Sommaire | Suivant
Histoire du noyau Unix | Niveau supérieur | Les verrous du gestionnaire de verrous (Lock Manager)

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 <questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez <doc@FreeBSD.org>.