Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 145 additions & 0 deletions documentation/content/pt-br/books/arch-handbook/locking/_index.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
---
description: 'Notas sobre Bloqueios (Locking)'
next: books/arch-handbook/kobj
params:
path: /books/arch-handbook/locking/
prev: books/arch-handbook/boot
showBookMenu: 'true'
tags: ["locking", "notes", "SMP", "Mutexes"]
title: 'Capítulo 2. Notas sobre Bloqueios'
weight: 3
---

[[locking]]
= Notas sobre Bloqueios (Locking)
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 2
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/arch-handbook/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

_Este capítulo é mantido pelo Projeto FreeBSD SMP Next Generation._

Este documento descreve o sistema de bloqueio usado no kernel do FreeBSD para permitir o multiprocessamento eficiente dentro do kernel. O bloqueio pode ser obtido por diversos meios. Estruturas de dados podem ser protegidas por mutexes ou por bloqueios (man:lockmgr[9] locks). Algumas variáveis ​​são protegidas simplesmente pelo uso de operações atômicas para acessá-las.

[[locking-mutexes]]
== Mutexes

Um mutex é simplesmente um mecanismo de bloqueio usado para garantir exclusão mútua. Especificamente, um mutex só pode pertencer a uma entidade por vez. Se outra entidade desejar obter um mutex que já esteja em uso, ela deverá esperar até que o mutex seja liberado. No kernel do FreeBSD, os mutexes pertencem aos processos.

Os mutexes podem ser adquiridos recursivamente, mas destinam-se a ser mantidos por um curto período de tempo. Especificamente, não se pode dormir enquanto se mantém um mutex. Se precisar manter um bloqueio durante um período de sono, use um bloqueio man:lockmgr[9].

Cada mutex possui diversas propriedades de interesse:

Nome da variável::
O nome da variável struct mtx no código-fonte do kernel.

Nome lógico::
O nome do mutex atribuído a ele por `mtx_init`. Esse nome é exibido nas mensagens de rastreamento do KTR e nos erros e avisos de testemunha, sendo usado para distinguir mutexes no código de testemunha.

Tipo::
O tipo do mutex em termos dos sinalizadores `MTX_*`. O significado de cada sinalizador está relacionado ao seu significado conforme documentado em man:mutex[9].

`MTX_DEF`:::
Um mutex de sono

`MTX_SPIN`:::
Um spin mutex

`MTX_RECURSE`:::
Este mutex tem permissão para recursão.

Protegidos::
Uma lista de estruturas de dados ou membros de estruturas de dados que esta entrada protege. Para membros de estruturas de dados, o nome estará no formato `nome da estrutura`.`nome do membro`.

Funções Dependentes::
Funções que só podem ser chamadas se este mutex estiver ativo.

.Lista de Mutex
[cols="15%,10%,10%,55%,20%", frame="all", options="header"]
|===
| Nome da variável
| Nome lógico
| Tipo
| Protegidos
| Funções Dependentes

|sched_lock
|"sched lock"
|`MTX_SPIN` \| `MTX_RECURSE`
|`_gmonparam`, `cnt.v_swtch`, `cp_time`, `curpriority`, `mtx`.`mtx_blocked`, `mtx`.`mtx_contested`, `proc`.`p_procq`, `proc`.`p_slpq`, `proc`.`p_sflag`, `proc`.`p_stat`, `proc`.`p_estcpu`, `proc`.`p_cpticks` `proc`.`p_pctcpu`, `proc`.`p_wchan`, `proc`.`p_wmesg`, `proc`.`p_swtime`, `proc`.`p_slptime`, `proc`.`p_runtime`, `proc`.`p_uu`, `proc`.`p_su`, `proc`.`p_iu`, `proc`.`p_uticks`, `proc`.`p_sticks`, `proc`.`p_iticks`, `proc`.`p_oncpu`, `proc`.`p_lastcpu`, `proc`.`p_rqindex`, `proc`.`p_heldmtx`, `proc`.`p_blocked`, `proc`.`p_mtxname`, `proc`.`p_contested`, `proc`.`p_priority`, `proc`.`p_usrpri`, `proc`.`p_nativepri`, `proc`.`p_nice`, `proc`.`p_rtprio`, `pscnt`, `slpque`, `itqueuebits`, `itqueues`, `rtqueuebits`, `rtqueues`, `queuebits`, `queues`, `idqueuebits`, `idqueues`, `switchtime`, `switchticks`
|`setrunqueue`, `remrunqueue`, `mi_switch`, `chooseproc`, `schedclock`, `resetpriority`, `updatepri`, `maybe_resched`, `cpu_switch`, `cpu_throw`, `need_resched`, `resched_wanted`, `clear_resched`, `aston`, `astoff`, `astpending`, `calcru`, `proc_compare`

|vm86pcb_lock
|"vm86pcb lock"
|`MTX_DEF`
|`vm86pcb`
|`vm86_bioscall`

|Giant
|"Giant"
|`MTX_DEF` \| `MTX_RECURSE`
|quase tudo
|muitas

|callout_lock
|"callout lock"
|`MTX_SPIN` \| `MTX_RECURSE`
|`callfree`, `callwheel`, `nextsoftcheck`, `proc`.`p_itcallout`, `proc`.`p_slpcallout`, `softticks`, `ticks`
|
|===

[[locking-sx]]
== Shared Exclusive Locks

Esses bloqueios fornecem funcionalidade básica de leitura e gravação e podem ser mantidos por um processo inativo. Atualmente, eles são suportados por man:lockmgr[9].

.Shared Exclusive Lock List
[cols="20%,80%", options="header"]
|===
| Nome da variável
| Protegidos

|`allproc_lock`
|`allproc` `zombproc` `pidhashtbl` `proc`.`p_list` `proc`.`p_hash` `nextpid`

|`proctree_lock`
|`proc`.`p_children` `proc`.`p_sibling`
|===

[[locking-atomic]]
== Atomically Protected Variables

Uma variável atomicamente protegida é uma variável especial que não é protegida por um bloqueio explícito. Em vez disso, todos os acessos a dados da variável usam operações atômicas especiais, conforme descrito em man:atomic[9]. Pouquíssimas variáveis ​​são tratadas dessa forma, embora outras primitivas de sincronização, como mutexes, sejam implementadas com variáveis ​​atomicamente protegidas.

* `mtx`.`mtx_lock`
Binary file not shown.
Loading
Loading