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.
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 struct mtx dans le code source du noyau.
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.
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.
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
.
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>.