Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-doc
Path: blob/main/documentation/content/ru/books/arch-handbook/smp/_index.po
18098 views
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
# Vladlen Popolitov <[email protected]>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: FreeBSD Documentation VERSION\n"
"POT-Creation-Date: 2025-05-01 19:56-0300\n"
"PO-Revision-Date: 2026-03-08 09:11+0000\n"
"Last-Translator: Vladlen Popolitov <[email protected]>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksarch-handbooksmp_index/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.17\n"

#. type: Title =
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:1
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:14
#, no-wrap
msgid "SMPng Design Document"
msgstr "Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ SMPng"

#. type: YAML Front Matter: title
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:1
#, no-wrap
msgid "Chapter 8. SMPng Design Document"
msgstr "Π“Π»Π°Π²Π° 8. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ SMPng"

#. type: Title ==
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:52
#, no-wrap
msgid "Introduction"
msgstr "Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:55
msgid ""
"This document presents the current design and implementation of the SMPng "
"Architecture. First, the basic primitives and tools are introduced. Next, a "
"general architecture for the FreeBSD kernel's synchronization and execution "
"model is laid out. Then, locking strategies for specific subsystems are "
"discussed, documenting the approaches taken to introduce fine-grained "
"synchronization and parallelism for each subsystem. Finally, detailed "
"implementation notes are provided to motivate design choices, and make the "
"reader aware of important implications involving the use of specific "
"primitives."
msgstr ""
"Π’ этом Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ прСдставлСны тСкущая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΈ рСализация SMPng. "
"Π‘Π½Π°Ρ‡Π°Π»Π° вводятся основныС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ ΠΈ инструмСнты. Π—Π°Ρ‚Π΅ΠΌ излагаСтся общая "
"Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ синхронизации ΠΈ выполнСния ядра FreeBSD. Π”Π°Π»Π΅Π΅ "
"ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ стратСгии Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… подсистСм, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ "
"ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΡŽ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ синхронизации ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ "
"подсистСмы. Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ приводятся ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, "
"ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π±ΠΎΡ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ читатСля ΠΎ Π²Π°ΠΆΠ½Ρ‹Ρ… "
"послСдствиях использования ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:57
msgid ""
"This document is a work-in-progress, and will be updated to reflect on-going "
"design and implementation activities associated with the SMPng Project. Many "
"sections currently exist only in outline form, but will be fleshed out as "
"work proceeds. Updates or suggestions regarding the document may be directed "
"to the document editors."
msgstr ""
"Π­Ρ‚ΠΎΡ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ находится Π² стадии Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π² "
"соотвСтствии с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, связанными с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ "
"SMPng. МногиС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ Π² настоящСС врСмя ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π²ΠΈΠ΄Π΅ набросков, "
"Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ продвиТСния Ρ€Π°Π±ΠΎΡ‚Ρ‹. ОбновлСния ΠΈΠ»ΠΈ прСдлоТСния "
"ΠΏΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:63
msgid ""
"The goal of SMPng is to allow concurrency in the kernel. The kernel is "
"basically one rather large and complex program. To make the kernel multi-"
"threaded we use some of the same tools used to make other programs multi-"
"threaded. These include mutexes, shared/exclusive locks, semaphores, and "
"condition variables. For the definitions of these and other SMP-related "
"terms, please see the crossref:smp[smp-glossary, Glossary] section of this "
"article."
msgstr ""
"ЦСль SMPng β€” ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ Π² ядрС. Π―Π΄Ρ€ΠΎ прСдставляСт собой ΠΎΠ΄Π½Ρƒ "
"довольно Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΈ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ядро ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ, ΠΌΡ‹ "
"ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚Π΅ ΠΆΠ΅ инструмСнты, Ρ‡Ρ‚ΠΎ ΠΈ для многопоточности Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. К "
"Π½ΠΈΠΌ относятся ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹, раздСляСмыС/ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, сСмафоры ΠΈ "
"условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ этих ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ², связанных с "
"SMP, см. Ρ€Π°Π·Π΄Π΅Π» crossref:smp[smp-glossary, Глоссарий] Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅."

#. type: Title ==
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:65
#, no-wrap
msgid "Basic Tools and Locking Fundamentals"
msgstr "ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ инструмСнты ΠΈ основы Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ"

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:67
#, no-wrap
msgid "Atomic Instructions and Memory Barriers"
msgstr "АтомарныС инструкции ΠΈ Π±Π°Ρ€ΡŒΠ΅Ρ€Ρ‹ памяти"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:70
msgid ""
"There are several existing treatments of memory barriers and atomic "
"instructions, so this section will not include a lot of detail. To put it "
"simply, one can not go around reading variables without a lock if a lock is "
"used to protect writes to that variable. This becomes obvious when you "
"consider that memory barriers simply determine relative order of memory "
"operations; they do not make any guarantee about timing of memory "
"operations. That is, a memory barrier does not force the contents of a CPU's "
"local cache or store buffer to flush. Instead, the memory barrier at lock "
"release simply ensures that all writes to the protected data will be visible "
"to other CPU's or devices if the write to release the lock is visible. The "
"CPU is free to keep that data in its cache or store buffer as long as it "
"wants. However, if another CPU performs an atomic instruction on the same "
"datum, the first CPU must guarantee that the updated value is made visible "
"to the second CPU along with any other operations that memory barriers may "
"require."
msgstr ""
"МоТно Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ описаний Π±Π°Ρ€ΡŒΠ΅Ρ€ΠΎΠ² памяти ΠΈ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… инструкций, поэтому Π² "
"этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. ΠŸΡ€ΠΎΡ‰Π΅ говоря, нСльзя Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ "
"Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ записи Π² эту "
"ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Π­Ρ‚ΠΎ становится ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ссли ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Ρ‹ памяти лишь "
"ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ порядок ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ; ΠΎΠ½ΠΈ Π½Π΅ Π΄Π°ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… "
"Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π±Π°Ρ€ΡŒΠ΅Ρ€ "
"памяти Π½Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΊ сбросу содСрТимого локального кэша ΠΈΠ»ΠΈ Π±ΡƒΡ„Π΅Ρ€Π° записи "
"процСссора. ВмСсто этого, Π±Π°Ρ€ΡŒΠ΅Ρ€ памяти ΠΏΡ€ΠΈ освобоТдСнии Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ просто "
"Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ всС записи Π² Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌ "
"процСссорам ΠΈΠ»ΠΈ устройствам, Ссли Π²ΠΈΠ΄Π½Π° запись, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. "
"ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅ Π² своём кэшС ΠΈΠ»ΠΈ Π±ΡƒΡ„Π΅Ρ€Π΅ записи сколько "
"ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π΄ΠΎΠ»Π³ΠΎ. Однако, Ссли Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСссор выполняСт Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ "
"Π½Π°Π΄ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ процСссор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½ΠΎΠ΅ "
"Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π½ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ процСссору, наряду с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ опСрациями, "
"ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ согласно Π±Π°Ρ€ΡŒΠ΅Ρ€Π°ΠΌ памяти."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:72
msgid ""
"For example, assuming a simple model where data is considered visible when "
"it is in main memory (or a global cache), when an atomic instruction is "
"triggered on one CPU, other CPU's store buffers and caches must flush any "
"writes to that same cache line along with any pending operations behind a "
"memory barrier."
msgstr ""
"НапримСр, прСдполагая ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ модСль, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ, "
"ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ находятся Π² основной памяти (ΠΈΠ»ΠΈ Π² глобальном кэшС), ΠΊΠΎΠ³Π΄Π° "
"начинаСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ инструкции Π½Π° ΠΎΠ΄Π½ΠΎΠΌ процСссорС, Π±ΡƒΡ„Π΅Ρ€Ρ‹ "
"записи ΠΈ кэши Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссоров Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС записи Π² Ρ‚Ρƒ ΠΆΠ΅ строку "
"кэша вмСстС с Π»ΡŽΠ±Ρ‹ΠΌΠΈ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΌΠΈ опСрациями Π·Π° Π±Π°Ρ€ΡŒΠ΅Ρ€ΠΎΠΌ памяти."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:74
msgid ""
"This requires one to take special care when using an item protected by "
"atomic instructions. For example, in the sleep mutex implementation, we have "
"to use an `atomic_cmpset` rather than an `atomic_set` to turn on the "
"`MTX_CONTESTED` bit. The reason is that we read the value of `mtx_lock` into "
"a variable and then make a decision based on that read. However, the value "
"we read may be stale, or it may change while we are making our decision. "
"Thus, when the `atomic_set` executed, it may end up setting the bit on "
"another value than the one we made the decision on. Thus, we have to use an "
"`atomic_cmpset` to set the value only if the value we made the decision on "
"is up-to-date and valid."
msgstr ""
"Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ особой остороТности ΠΏΡ€ΠΈ использовании элСмСнта, Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ "
"Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ инструкциями. НапримСр, Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° сна ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ "
"ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `atomic_cmpset` вмСсто `atomic_set` для установки Π±ΠΈΡ‚Π° "
"`MTX_CONTESTED`. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ считываСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `mtx_lock` Π² "
"ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° основС этого чтСния. Однако "
"Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ, "
"ΠΏΠΎΠΊΠ° ΠΌΡ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° выполняСтся `atomic_set`, "
"это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ установкС Π±ΠΈΡ‚Π° Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π½Π° "
"ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ основывали своё Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ "
"`atomic_cmpset`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли "
"Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ приняли Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:76
msgid ""
"Finally, atomic instructions only allow one item to be updated or read. If "
"one needs to atomically update several items, then a lock must be used "
"instead. For example, if two counters must be read and have values that are "
"consistent relative to each other, then those counters must be protected by "
"a lock rather than by separate atomic instructions."
msgstr ""
"НаконСц, Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ инструкции ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ "
"элСмСнт. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ нСсколько элСмСнтов, вмСсто этого "
"слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. НапримСр, Ссли трСбуСтся ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π²Π° "
"счётчика ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… значСния, согласованныС Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, Ρ‚ΠΎ эти "
"счётчики Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, Π° Π½Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ "
"инструкциями."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:77
#, no-wrap
msgid "Read Locks Versus Write Locks"
msgstr "Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° запись"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:80
msgid ""
"Read locks do not need to be as strong as write locks. Both types of locks "
"need to ensure that the data they are accessing is not stale. However, only "
"write access requires exclusive access. Multiple threads can safely read a "
"value. Using different types of locks for reads and writes can be "
"implemented in a number of ways."
msgstr ""
"Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ строгости, ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° "
"запись. Оба Ρ‚ΠΈΠΏΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ "
"ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ, Π½Π΅ устарСли. Однако запись Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ монопольного доступа. "
"НСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ бСзопасно Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ИспользованиС Ρ€Π°Π·Π½Ρ‹Ρ… "
"Ρ‚ΠΈΠΏΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ для чтСния ΠΈ записи ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ нСсколькими "
"способами."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:82
msgid ""
"First, sx locks can be used in this manner by using an exclusive lock when "
"writing and a shared lock when reading. This method is quite straightforward."
msgstr ""
"Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ sx ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: монопольная "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΡ€ΠΈ записи ΠΈ раздСляСмая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ "
"достаточно прост."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:84
msgid ""
"A second method is a bit more obscure. You can protect a datum with multiple "
"locks. Then for reading that data you simply need to have a read lock of one "
"of the locks. However, to write to the data, you need to have a write lock "
"of all of the locks. This can make writing rather expensive but can be "
"useful when data is accessed in various ways. For example, the parent "
"process pointer is protected by both the `proctree_lock` sx lock and the per-"
"process mutex. Sometimes the proc lock is easier as we are just checking to "
"see who a parent of a process is that we already have locked. However, other "
"places such as `inferior` need to walk the tree of processes via parent "
"pointers and locking each process would be prohibitive as well as a pain to "
"guarantee that the condition you are checking remains valid for both the "
"check and the actions taken as a result of the check."
msgstr ""
"Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ нСсколько ΠΌΠ΅Π½Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ нСсколькими "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ. Для чтСния Π΄Π°Π½Π½Ρ‹Ρ… достаточно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ "
"ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ. Однако для записи Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ "
"Π½Π° запись всСх Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ запись довольно Π·Π°Ρ‚Ρ€Π°Ρ‚Π½ΠΎΠΉ, Π½ΠΎ "
"ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ доступны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами. НапримСр, "
"ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½ ΠΊΠ°ΠΊ `proctree_lock` sx-"
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ процСсса. Иногда Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° процСсса ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅, "
"Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ просто провСряСм, ΠΊΡ‚ΠΎ являСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ ΡƒΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ "
"процСсса. Однако Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ `inferior`, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ "
"Π΄Π΅Ρ€Π΅Π²ΠΎ процСссов Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° родитСля, ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса "
"Π±Ρ‹Π»Π° Π±Ρ‹ слишком Π·Π°Ρ‚Ρ€Π°Ρ‚Π½ΠΎΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ слоТной для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ "
"провСряСмоС условиС остаётся Π²Π΅Ρ€Π½Ρ‹ΠΌ ΠΊΠ°ΠΊ Π²ΠΎ врСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΈ "
"Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ дСйствий, основанных Π½Π° этой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:85
#, no-wrap
msgid "Locking Conditions and Results"
msgstr "Условия ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:88
msgid ""
"If you need a lock to check the state of a variable so that you can take an "
"action based on the state you read, you can not just hold the lock while "
"reading the variable and then drop the lock before you act on the value you "
"read. Once you drop the lock, the variable can change rendering your "
"decision invalid. Thus, you must hold the lock both while reading the "
"variable and while performing the action as a result of the test."
msgstr ""
"Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ состояния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ "
"Π±Ρ‹Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ дСйствиС Π½Π° основС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½ΠΎΠ³ΠΎ состояния, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ "
"просто ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π²ΠΎ врСмя чтСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ½ΡΡ‚ΡŒ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ дСйствия Π½Π° основС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½ΠΎΠ³ΠΎ значСния. Как "
"Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ снимаСтС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, пСрСмСнная ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ сдСлаСт вашС "
"Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΊΠ°ΠΊ "
"Π²ΠΎ врСмя чтСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ Π²ΠΎ врСмя выполнСния дСйствия Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ "
"ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ."

#. type: Title ==
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:90
#, no-wrap
msgid "General Architecture and Design"
msgstr "ΠžΠ±Ρ‰Π°Ρ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½"

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:92
#, no-wrap
msgid "Interrupt Handling"
msgstr "ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:95
msgid ""
"Following the pattern of several other multi-threaded UNIX(R) kernels, "
"FreeBSD deals with interrupt handlers by giving them their own thread "
"context. Providing a context for interrupt handlers allows them to block on "
"locks. To help avoid latency, however, interrupt threads run at real-time "
"kernel priority. Thus, interrupt handlers should not execute for very long "
"to avoid starving other kernel threads. In addition, since multiple handlers "
"may share an interrupt thread, interrupt handlers should not sleep or use a "
"sleepable lock to avoid starving another interrupt handler."
msgstr ""
"БлСдуя ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ядСр UNIX(R), FreeBSD "
"Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, прСдоставив ΠΈΠΌ собствСнный контСкст "
"ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ контСкста для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ позволяСт ΠΈΠΌ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ…. Однако, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ, ΠΏΠΎΡ‚ΠΎΠΊΠΈ "
"ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ядрС. "
"Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ слишком Π΄ΠΎΠ»Π³ΠΎ, "
"Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π»ΠΈΡˆΠ°Ρ‚ΡŒ рСсурсов Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ядра. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСсколько "
"ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ "
"ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌ сна ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, "
"Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ сон, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π»ΠΈΡˆΠ°Ρ‚ΡŒ рСсурсов Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:97
msgid ""
"The interrupt threads currently in FreeBSD are referred to as heavyweight "
"interrupt threads. They are called this because switching to an interrupt "
"thread involves a full context switch. In the initial implementation, the "
"kernel was not preemptive and thus interrupts that interrupted a kernel "
"thread would have to wait until the kernel thread blocked or returned to "
"userland before they would have an opportunity to run."
msgstr ""
"Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π² FreeBSD Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ тяТСловСсными "
"ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ. Они ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ "
"ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСрывания Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΏΠΎΠ»Π½ΠΎΠ΅ "
"ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ядро Π½Π΅ Π±Ρ‹Π»ΠΎ "
"Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰ΠΈΠΌ, поэтому прСрывания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ ядра, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ "
"ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ ядра Π½Π΅ заблокируСтся ΠΈΠ»ΠΈ Π½Π΅ вСрнётся Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ "
"пространство, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρƒ Π½ΠΈΡ… появится Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:99
msgid ""
"To deal with the latency problems, the kernel in FreeBSD has been made "
"preemptive. Currently, we only preempt a kernel thread when we release a "
"sleep mutex or when an interrupt comes in. However, the plan is to make the "
"FreeBSD kernel fully preemptive as described below."
msgstr ""
"Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ ядро FreeBSD стало Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰ΠΈΠΌ. Π’ настоящСС "
"врСмя вытСснСниС ΠΏΠΎΡ‚ΠΎΠΊΠ° ядра происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ освобоТдСнии ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° сна "
"ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ поступлСнии прСрывания. Однако планируСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ядро FreeBSD "
"ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰ΠΈΠΌ, ΠΊΠ°ΠΊ описано Π½ΠΈΠΆΠ΅."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:101
msgid ""
"Not all interrupt handlers execute in a thread context. Instead, some "
"handlers execute directly in primary interrupt context. These interrupt "
"handlers are currently misnamed \"fast\" interrupt handlers since the "
"`INTR_FAST` flag used in earlier versions of the kernel is used to mark "
"these handlers. The only interrupts which currently use these types of "
"interrupt handlers are clock interrupts and serial I/O device interrupts. "
"Since these handlers do not have their own context, they may not acquire "
"blocking locks and thus may only use spin mutexes."
msgstr ""
"НС всС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² контСкстС ΠΏΠΎΡ‚ΠΎΠΊΠ°. ВмСсто этого, "
"Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ нСпосрСдствСнно Π² основном контСкстС "
"прСрывания. Π­Ρ‚ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π² настоящСС врСмя ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ "
"\"быстрыми\" ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для ΠΈΡ… обозначСния "
"примСняСтся Ρ„Π»Π°Π³ `INTR_FAST`, использовавшийся Π² Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях ядра. "
"ЕдинствСнныС прСрывания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² настоящСС врСмя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ "
"ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, β€” это прСрывания ΠΎΡ‚ часов ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… "
"устройств Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ собствСнного "
"контСкста, ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, "
"ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ спин-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:103
msgid ""
"Finally, there is one optional optimization that can be added in MD code "
"called lightweight context switches. Since an interrupt thread executes in a "
"kernel context, it can borrow the vmspace of any process. Thus, in a "
"lightweight context switch, the switch to the interrupt thread does not "
"switch vmspaces but borrows the vmspace of the interrupted thread. In order "
"to ensure that the vmspace of the interrupted thread does not disappear out "
"from under us, the interrupted thread is not allowed to execute until the "
"interrupt thread is no longer borrowing its vmspace. This can happen when "
"the interrupt thread either blocks or finishes. If an interrupt thread "
"blocks, then it will use its own context when it is made runnable again. "
"Thus, it can release the interrupted thread."
msgstr ""
"НаконСц, сущСствуСт ΠΎΠ΄Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ оптимизация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ "
"Π² ΠΊΠΎΠ΄ MD, называСмая лСгковСсными ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ контСкста. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊ "
"ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСрывания выполняСтся Π² контСкстС ядра, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΈΠΌΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ "
"vmspace любого процСсса. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ лСгковСсном ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ "
"контСкста ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСрывания Π½Π΅ мСняСт vmspace, Π° "
"заимствуСт vmspace ΠΏΡ€Π΅Ρ€Π²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π§Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ vmspace "
"ΠΏΡ€Π΅Ρ€Π²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π΅ исчСзнСт Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΏΡ€Π΅Ρ€Π²Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ "
"запрСщаСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСрывания большС Π½Π΅ "
"ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ vmspace. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ "
"прСрывания Π»ΠΈΠ±ΠΎ блокируСтся, Π»ΠΈΠ±ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Если ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ "
"прСрывания блокируСтся, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ запускС ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой "
"собствСнный контСкст. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:105
msgid ""
"The cons of this optimization are that they are very machine specific and "
"complex and thus only worth the effort if their is a large performance "
"improvement. At this point it is probably too early to tell, and in fact, "
"will probably hurt performance as almost all interrupt handlers will "
"immediately block on Giant and require a thread fix-up when they block. "
"Also, an alternative method of interrupt handling has been proposed by Mike "
"Smith that works like so:"
msgstr ""
"НСдостатки этой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΡ‡Π΅Π½ΡŒ спСцифичны для "
"ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ слоТны, поэтому стоят усилий Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС "
"Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, вСроятно, Π΅Ρ‰Ρ‘ "
"Ρ€Π°Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Ρ‹, ΠΈ, фактичСски, это ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°ΠΆΠ΅ ΡƒΡ…ΡƒΠ΄ΡˆΠΈΡ‚ΡŒ "
"ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΡ‡Ρ‚ΠΈ всС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π±ΡƒΠ΄ΡƒΡ‚ "
"Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Giant ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ исправлСния ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΈ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Майк Π‘ΠΌΠΈΡ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ "
"ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:107
msgid ""
"Each interrupt handler has two parts: a predicate which runs in primary "
"interrupt context and a handler which runs in its own thread context."
msgstr ""
"ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прСрывания состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй: ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ "
"выполняСтся Π² основном контСкстС прСрывания, ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ "
"выполняСтся Π² контСкстС собствСнного ΠΏΠΎΡ‚ΠΎΠΊΠ°."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:108
msgid ""
"If an interrupt handler has a predicate, then when an interrupt is "
"triggered, the predicate is run. If the predicate returns true then the "
"interrupt is assumed to be fully handled and the kernel returns from the "
"interrupt. If the predicate returns false or there is no predicate, then the "
"threaded handler is scheduled to run."
msgstr ""
"Если Ρƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° прСрывания Π΅ΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚, Ρ‚ΠΎ ΠΏΡ€ΠΈ срабатывании прСрывания "
"этот ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ выполняСтся. Если ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `true`, "
"ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ считаСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌ, ΠΈ ядро возвращаСтся ΠΈΠ· "
"прСрывания. Если ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `false` ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° Π½Π΅Ρ‚, Ρ‚ΠΎ систСма "
"ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ запуск ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π² контСкстС собствСнного ΠΏΠΎΡ‚ΠΎΠΊΠ°."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:110
msgid ""
"Fitting light weight context switches into this scheme might prove rather "
"complicated. Since we may want to change to this scheme at some point in the "
"future, it is probably best to defer work on light weight context switches "
"until we have settled on the final interrupt handling architecture and "
"determined how light weight context switches might or might not fit into it."
msgstr ""
"ВстраиваниС лСгковСсных ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ контСкста Π² эту схСму ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ "
"довольно слоТным. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° эту схСму Π² "
"Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, вСроятно, Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ лСгковСсными ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ "
"контСкста Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ опрСдСлимся с ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ "
"ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΈ Π½Π΅ выясним, ΠΊΠ°ΠΊ лСгковСсныС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста "
"ΠΌΠΎΠ³ΡƒΡ‚ (ΠΈΠ»ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚) Π² Π½Π΅Ρ‘ Π²ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:111
#, no-wrap
msgid "Kernel Preemption and Critical Sections"
msgstr "Π―Π΄Ρ€ΠΎ с вытСснСниСм ΠΈ критичСскиС сСкции"

#. type: Title ====
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:113
#, no-wrap
msgid "Kernel Preemption in a Nutshell"
msgstr "Π―Π΄Ρ€ΠΎ ΠΈ вытСснСниС Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:116
msgid ""
"Kernel preemption is fairly simple. The basic idea is that a CPU should "
"always be doing the highest priority work available. Well, that is the ideal "
"at least. There are a couple of cases where the expense of achieving the "
"ideal is not worth being perfect."
msgstr ""
"ВытСснСниС ядра довольно просто. Основная идСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ "
"процСссор всСгда Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. "
"Ну, это Π² ΠΈΠ΄Π΅Π°Π»Π΅, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅. Π•ΡΡ‚ΡŒ нСсколько случаСв, ΠΊΠΎΠ³Π΄Π° Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° "
"достиТСниС ΠΈΠ΄Π΅Π°Π»Π° Π½Π΅ стоят ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²Π°."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:118
msgid ""
"Implementing full kernel preemption is very straightforward: when you "
"schedule a thread to be executed by putting it on a run queue, you check to "
"see if its priority is higher than the currently executing thread. If so, "
"you initiate a context switch to that thread."
msgstr ""
"РСализация ΠΏΠΎΠ»Π½ΠΎΠΉ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΉ многозадачности Π² ядрС ΠΎΡ‡Π΅Π½ΡŒ проста: ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ "
"ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°, помСщая Π΅Π³ΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ выполнСния, Π²Ρ‹ "
"провСряСтС, являСтся Π»ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ выполняСмого "
"ΠΏΠΎΡ‚ΠΎΠΊΠ°. Если Π΄Π°, Π²Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста Π½Π° этот ΠΏΠΎΡ‚ΠΎΠΊ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:120
msgid ""
"While locks can protect most data in the case of a preemption, not all of "
"the kernel is preemption safe. For example, if a thread holding a spin mutex "
"preempted and the new thread attempts to grab the same spin mutex, the new "
"thread may spin forever as the interrupted thread may never get a chance to "
"execute. Also, some code such as the code to assign an address space number "
"for a process during `exec` on the Alpha needs to not be preempted as it "
"supports the actual context switch code. Preemption is disabled for these "
"code sections by using a critical section."
msgstr ""
"Π₯отя Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… Π² случаС вытСснСния, Π½Π΅ "
"всС части ядра бСзопасны для вытСснСния. НапримСр, Ссли ΠΏΠΎΡ‚ΠΎΠΊ, ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ "
"спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π±ΡƒΠ΄Π΅Ρ‚ вытСснСн, Π° Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ попытаСтся Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ "
"спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π²Π΅Ρ‡Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ "
"ΠΌΠΎΠΆΠ΅Ρ‚ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ шанс Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄, "
"Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ для назначСния Π½ΠΎΠΌΠ΅Ρ€Π° адрСсного пространства процСссу Π²ΠΎ врСмя "
"`exec` Π½Π° Alpha, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ вытСснСн, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ "
"фактичСский ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста. Для Ρ‚Π°ΠΊΠΈΡ… участков ΠΊΠΎΠ΄Π° вытСснСниС "
"ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ с использованиСм критичСской сСкции."

#. type: Title ====
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:121
#, no-wrap
msgid "Critical Sections"
msgstr "ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π‘Π΅ΠΊΡ†ΠΈΠΈ"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:124
msgid ""
"The responsibility of the critical section API is to prevent context "
"switches inside of a critical section. With a fully preemptive kernel, every "
"`setrunqueue` of a thread other than the current thread is a preemption "
"point. One implementation is for `critical_enter` to set a per-thread flag "
"that is cleared by its counterpart. If `setrunqueue` is called with this "
"flag set, it does not preempt regardless of the priority of the new thread "
"relative to the current thread. However, since critical sections are used in "
"spin mutexes to prevent context switches and multiple spin mutexes can be "
"acquired, the critical section API must support nesting. For this reason the "
"current implementation uses a nesting count instead of a single per-thread "
"flag."
msgstr ""
"ΠžΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ API критичСской сСкции Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ "
"ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста Π²Π½ΡƒΡ‚Ρ€ΠΈ критичСской сСкции. Π’ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΌ "
"ядрС ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² `setrunqueue` для ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ, являСтся "
"Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ вытСснСния. Одна ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ `critical_enter`"
" устанавливаСт Ρ„Π»Π°Π³ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сбрасываСтся Π΅Π³ΠΎ ΠΏΠ°Ρ€Π½ΠΎΠΉ "
"Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Если `setrunqueue` вызываСтся, ΠΊΠΎΠ³Π΄Π° этот Ρ„Π»Π°Π³ установлСн, "
"вытСснСниС Π½Π΅ происходит, нСзависимо ΠΎΡ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° "
"ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ. Однако, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ критичСскиС сСкции ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² "
"спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ… для прСдотвращСния ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ "
"Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ нСсколько спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, API критичСской сСкции Π΄ΠΎΠ»ΠΆΠ΅Π½ "
"ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ тСкущая рСализация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ "
"счСтчик влоТСнности вмСсто ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π»Π°Π³Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:126
msgid ""
"In order to minimize latency, preemptions inside of a critical section are "
"deferred rather than dropped. If a thread that would normally be preempted "
"to is made runnable while the current thread is in a critical section, then "
"a per-thread flag is set to indicate that there is a pending preemption. "
"When the outermost critical section is exited, the flag is checked. If the "
"flag is set, then the current thread is preempted to allow the higher "
"priority thread to run."
msgstr ""
"Для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ прСрывания Π²Π½ΡƒΡ‚Ρ€ΠΈ критичСской сСкции ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ, "
"Π° Π½Π΅ ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ. Если ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… условиях Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ "
"вытСснСн, становится Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, ΠΏΠΎΠΊΠ° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ находится Π² "
"критичСской сСкции, Ρ‚ΠΎ устанавливаСтся Ρ„Π»Π°Π³ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ "
"Π½Π° ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅. ΠŸΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· самой внСшнСй критичСской сСкции Ρ„Π»Π°Π³ "
"провСряСтся. Если Ρ„Π»Π°Π³ установлСн, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ вытСсняСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ "
"ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΡ‚ΠΎΠΊΡƒ с Π±ΠΎΠ»Π΅Π΅ высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:128
msgid ""
"Interrupts pose a problem with regards to spin mutexes. If a low-level "
"interrupt handler needs a lock, it needs to not interrupt any code needing "
"that lock to avoid possible data structure corruption. Currently, providing "
"this mechanism is piggybacked onto critical section API by means of the "
"`cpu_critical_enter` and `cpu_critical_exit` functions. Currently this API "
"disables and re-enables interrupts on all of FreeBSD's current platforms. "
"This approach may not be purely optimal, but it is simple to understand and "
"simple to get right. Theoretically, this second API need only be used for "
"spin mutexes that are used in primary interrupt context. However, to make "
"the code simpler, it is used for all spin mutexes and even all critical "
"sections. It may be desirable to split out the MD API from the MI API and "
"only use it in conjunction with the MI API in the spin mutex implementation. "
"If this approach is taken, then the MD API likely would need a rename to "
"show that it is a separate API."
msgstr ""
"ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΡ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ для спин-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ². Если ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ "
"Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ прСрывания Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒ любой "
"ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½Π° эта Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ поврСТдСния "
"структур Π΄Π°Π½Π½Ρ‹Ρ…. Π’ настоящСС врСмя этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‡Π΅Ρ€Π΅Π· API "
"критичСских сСкций с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ `cpu_critical_enter` ΠΈ "
"`cpu_critical_exit`. БСйчас этот API ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈ снова Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ прСрывания "
"Π½Π° всСх Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… FreeBSD. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ идСально "
"ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ ΠΎΠ½ прост для понимания ΠΈ Π½Π°Π΄Π΅ΠΆΠ΅Π½ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ВСорСтичСски, "
"этот Π²Ρ‚ΠΎΡ€ΠΎΠΉ API Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для спин-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² основном "
"контСкстС ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ. Однако, для упрощСния ΠΊΠΎΠ΄Π°, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для всСх "
"спин-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² ΠΈ Π΄Π°ΠΆΠ΅ для всСх критичСских сСкций. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, стоит ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ "
"MD API ΠΎΡ‚ MI API ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ совмСстно с MI API Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ "
"спин-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ². Если Π±ΡƒΠ΄Π΅Ρ‚ принят Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Ρ‚ΠΎ MD API, вСроятно, "
"потрСбуСтся ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ API."

#. type: Title ====
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:129
#, no-wrap
msgid "Design Tradeoffs"
msgstr "ΠšΠΎΠΌΠΏΡ€ΠΎΠΌΠΈΡΡΡ‹ проСктирования"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:132
msgid ""
"As mentioned earlier, a couple of trade-offs have been made to sacrifice "
"cases where perfect preemption may not always provide the best performance."
msgstr ""
"Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, Π±Ρ‹Π»ΠΈ сдСланы Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ компромиссы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ "
"ΠΏΠΎΠΆΠ΅Ρ€Ρ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ случаями, ΠΊΠΎΠ³Π΄Π° идСальная Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π½Π΅ всСгда "
"обСспСчиваСт Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:134
msgid ""
"The first trade-off is that the preemption code does not take other CPUs "
"into account. Suppose we have a two CPU's A and B with the priority of A's "
"thread as 4 and the priority of B's thread as 2. If CPU B makes a thread "
"with priority 1 runnable, then in theory, we want CPU A to switch to the new "
"thread so that we will be running the two highest priority runnable threads. "
"However, the cost of determining which CPU to enforce a preemption on as "
"well as actually signaling that CPU via an IPI along with the "
"synchronization that would be required would be enormous. Thus, the current "
"code would instead force CPU B to switch to the higher priority thread. Note "
"that this still puts the system in a better position as CPU B is executing a "
"thread of priority 1 rather than a thread of priority 2."
msgstr ""
"ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ компромисс Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ вытСснСния Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ "
"процСссоры. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° процСссора A ΠΈ B, Π³Π΄Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ "
"ΠΏΠΎΡ‚ΠΎΠΊΠ° A Ρ€Π°Π²Π΅Π½ 4, Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° B Ρ€Π°Π²Π΅Π½ 2. Если процСссор B Π΄Π΅Π»Π°Π΅Ρ‚ "
"ΠΏΠΎΡ‚ΠΎΠΊ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ 1 Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, Ρ‚ΠΎ тСорСтичСски ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ "
"процСссор A ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° с "
"Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. Однако ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ опрСдСлСния, Π½Π° ΠΊΠ°ΠΊΠΎΠΉ процСссор "
"Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ вытСснСниС, Π° Ρ‚Π°ΠΊΠΆΠ΅ фактичСская сигнализация этому "
"процСссору Ρ‡Π΅Ρ€Π΅Π· IPI вмСстС с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ синхронизациСй Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌΠΈ. "
"Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ вмСсто этого заставит процСссор B ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ "
"Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ с Π±ΠΎΠ»Π΅Π΅ высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ это всё Ρ€Π°Π²Π½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ "
"состояниС систСмы, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ процСссор B выполняСт ΠΏΠΎΡ‚ΠΎΠΊ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ 1, Π° Π½Π΅ "
"ΠΏΠΎΡ‚ΠΎΠΊ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ 2."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:136
msgid ""
"The second trade-off limits immediate kernel preemption to real-time "
"priority kernel threads. In the simple case of preemption defined above, a "
"thread is always preempted immediately (or as soon as a critical section is "
"exited) if a higher priority thread is made runnable. However, many threads "
"executing in the kernel only execute in a kernel context for a short time "
"before either blocking or returning to userland. Thus, if the kernel "
"preempts these threads to run another non-realtime kernel thread, the kernel "
"may switch out the executing thread just before it is about to sleep or "
"execute. The cache on the CPU must then adjust to the new thread. When the "
"kernel returns to the preempted thread, it must refill all the cache "
"information that was lost. In addition, two extra context switches are "
"performed that could be avoided if the kernel deferred the preemption until "
"the first thread blocked or returned to userland. Thus, by default, the "
"preemption code will only preempt immediately if the higher priority thread "
"is a real-time priority thread."
msgstr ""
"Π’Ρ‚ΠΎΡ€ΠΎΠΉ компромисс ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ вытСснСниС ядра Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ "
"ядра с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. Π’ простом случаС вытСснСния, описанном Π²Ρ‹ΡˆΠ΅, ΠΏΠΎΡ‚ΠΎΠΊ "
"всСгда вытСсняСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ (ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠΈΠ½ΡƒΡ‚Π° критичСская "
"сСкция), Ссли становится доступным ΠΏΠΎΡ‚ΠΎΠΊ с Π±ΠΎΠ»Π΅Π΅ высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. Однако "
"ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π² ядрС, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² контСкстС ядра лишь ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ "
"врСмя ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π»ΠΈΠ±ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π»ΠΈΠ±ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ "
"пространство. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ядро вытСснит эти ΠΏΠΎΡ‚ΠΎΠΊΠΈ для выполнСния "
"Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ядра Π±Π΅Π· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ с "
"выполняСмого ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‚ собираСтся Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ΠΈΠ»ΠΈ "
"ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания. Кэш процСссора Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Ρ‚Π΅ΠΌ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊ "
"Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ. Когда ядро возвращаСтся ΠΊ вытСснСнному ΠΏΠΎΡ‚ΠΎΠΊΡƒ, ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ "
"Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ всС потСрянныС ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Π²Π° "
"Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, Ссли "
"Π±Ρ‹ ядро ΠΎΡ‚Π»ΠΎΠΆΠΈΠ»ΠΎ вытСснСниС Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎΠΊΠ° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ заблокируСтся "
"ΠΈΠ»ΠΈ Π½Π΅ вСрнётся Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ пространство. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ "
"ΠΊΠΎΠ΄ вытСснСния Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли "
"ΠΏΠΎΡ‚ΠΎΠΊ с Π±ΠΎΠ»Π΅Π΅ высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:138
msgid ""
"Turning on full kernel preemption for all kernel threads has value as a "
"debugging aid since it exposes more race conditions. It is especially useful "
"on UP systems were many races are hard to simulate otherwise. Thus, there is "
"a kernel option `FULL_PREEMPTION` to enable preemption for all kernel "
"threads that can be used for debugging purposes."
msgstr ""
"Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠΉ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΉ многозадачности для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ядра ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² "
"качСствС срСдства ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ позволяСт Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ большС состояний Π³ΠΎΠ½ΠΊΠΈ. "
"Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π½Π° однопроцСссорных систСмах (UP), Π³Π΄Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π³ΠΎΠ½ΠΊΠΈ "
"слоТно воспроизвСсти Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ способами. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, сущСствуСт опция ядра "
"`FULL_PREEMPTION` для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ вытСснСния для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ядра, которая "
"ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ†Π΅Π»Π΅ΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:139
#, no-wrap
msgid "Thread Migration"
msgstr "ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:142
msgid ""
"Simply put, a thread migrates when it moves from one CPU to another. In a "
"non-preemptive kernel this can only happen at well-defined points such as "
"when calling `msleep` or returning to userland. However, in the preemptive "
"kernel, an interrupt can force a preemption and possible migration at any "
"time. This can have negative affects on per-CPU data since with the "
"exception of `curthread` and `curpcb` the data can change whenever you "
"migrate. Since you can potentially migrate at any time this renders "
"unprotected per-CPU data access rather useless. Thus it is desirable to be "
"able to disable migration for sections of code that need per-CPU data to be "
"stable."
msgstr ""
"ΠŸΡ€ΠΎΡΡ‚Ρ‹ΠΌΠΈ словами, ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΈΠ³Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ CPU Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π’ "
"Π½Π΅ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌΠΎΠΌ ядрС это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ…, "
"Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ `msleep` ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ пространство. "
"Однако Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌΠΎΠΌ ядрС ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ вытСснСниС ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ "
"ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Π°Π½Π½Ρ‹Ρ…, "
"спСцифичных для CPU, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ `curthread` ΠΈ `curpcb`, "
"Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ любой ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ миграция "
"ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚, это Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½Ρ‹ΠΉ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, "
"спСцифичным для CPU, практичСски бСсполСзным. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ "
"Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ для участков ΠΊΠΎΠ΄Π°, Π³Π΄Π΅ трСбуСтся ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ "
"Π΄Π°Π½Π½Ρ‹Ρ…, спСцифичных для CPU."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:144
msgid ""
"Critical sections currently prevent migration since they do not allow "
"context switches. However, this may be too strong of a requirement to "
"enforce in some cases since a critical section also effectively blocks "
"interrupt threads on the current processor. As a result, another API has "
"been provided to allow the current thread to indicate that if it preempted "
"it should not migrate to another CPU."
msgstr ""
"ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ сСкции Π² настоящСС врСмя ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ "
"Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкстов. Однако это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слишком строгим "
"Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ критичСская сСкция Ρ‚Π°ΠΊΠΆΠ΅ эффСктивно "
"Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ процСссорС. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±Ρ‹Π» "
"прСдоставлСн Π΄Ρ€ΡƒΠ³ΠΎΠΉ API, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли ΠΎΠ½ "
"Π±ΡƒΠ΄Π΅Ρ‚ вытСснСн, ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ CPU."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:146
msgid ""
"This API is known as thread pinning and is provided by the scheduler. The "
"API consists of two functions: `sched_pin` and `sched_unpin`. These "
"functions manage a per-thread nesting count `td_pinned`. A thread is pinned "
"when its nesting count is greater than zero and a thread starts off unpinned "
"with a nesting count of zero. Each scheduler implementation is required to "
"ensure that pinned threads are only executed on the CPU that they were "
"executing on when the `sched_pin` was first called. Since the nesting count "
"is only written to by the thread itself and is only read by other threads "
"when the pinned thread is not executing but while `sched_lock` is held, then "
"`td_pinned` does not need any locking. The `sched_pin` function increments "
"the nesting count and `sched_unpin` decrements the nesting count. Note that "
"these functions only operate on the current thread and bind the current "
"thread to the CPU it is executing on at the time. To bind an arbitrary "
"thread to a specific CPU, the `sched_bind` and `sched_unbind` functions "
"should be used instead."
msgstr ""
"Π­Ρ‚ΠΎΡ‚ API извСстСн ΠΊΠ°ΠΊ Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ прСдоставляСтся ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ. "
"API состоит ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: `sched_pin` ΠΈ `sched_unpin`. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ "
"ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ счСтчиком влоТСнности `td_pinned` для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΠΎΡ‚ΠΎΠΊ "
"считаСтся Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ счСтчик влоТСнности большС нуля, ΠΈ "
"ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹ΠΌ с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ счСтчиком влоТСнности. КаТдая "
"рСализация ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ "
"Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‚ΠΎΠΌ CPU, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ "
"`sched_pin`. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ счСтчик влоТСнности измСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самим ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈ "
"читаСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ "
"выполняСтся, Π½ΠΎ удСрТиваСтся `sched_lock`, Ρ‚ΠΎ `td_pinned` Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Ѐункция `sched_pin` ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ счСтчик влоТСнности, Π° "
"`sched_unpin` ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π΅Π³ΠΎ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ "
"Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΊ CPU, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ "
"выполняСтся Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Для привязки ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊ "
"ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ CPU слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `sched_bind` ΠΈ `sched_unbind`."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:147
#, no-wrap
msgid "Callouts"
msgstr "ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:150
msgid ""
"The `timeout` kernel facility permits kernel services to register functions "
"for execution as part of the `softclock` software interrupt. Events are "
"scheduled based on a desired number of clock ticks, and callbacks to the "
"consumer-provided function will occur at approximately the right time."
msgstr ""
"Ѐункция ядра `timeout` позволяСт слуТбам ядра Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для "
"выполнСния Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ прСрывания `softclock`. Бобытия ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ "
"Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ количСства Ρ‚Π°ΠΊΡ‚ΠΎΠ² часов, ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ прСдоставлСнной "
"ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ врСмя."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:152
msgid ""
"The global list of pending timeout events is protected by a global spin "
"mutex, `callout_lock`; all access to the timeout list must be performed with "
"this mutex held. When `softclock` is woken up, it scans the list of pending "
"timeouts for those that should fire. In order to avoid lock order reversal, "
"the `softclock` thread will release the `callout_lock` mutex when invoking "
"the provided `timeout` callback function. If the `CALLOUT_MPSAFE` flag was "
"not set during registration, then Giant will be grabbed before invoking the "
"callout, and then released afterwards. The `callout_lock` mutex will be re-"
"grabbed before proceeding. The `softclock` code is careful to leave the list "
"in a consistent state while releasing the mutex. If `DIAGNOSTIC` is enabled, "
"then the time taken to execute each function is measured, and a warning is "
"generated if it exceeds a threshold."
msgstr ""
"Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ список ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… событий с Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠΌ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ глобальной спин-"
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ `callout_lock`; любой доступ ΠΊ списку Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ "
"Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ с ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ΠΌ этой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Когда `softclock` пробуТдаСтся, ΠΎΠ½ "
"сканируСт список ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠ² Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ "
"ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ инвСрсии Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΏΠΎΡ‚ΠΎΠΊ `softclock` освобоТдаСт "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ `callout_lock` ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ прСдоставлСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ "
"Π²Ρ‹Π·ΠΎΠ²Π° `timeout`. Если Ρ„Π»Π°Π³ `CALLOUT_MPSAFE` Π½Π΅ Π±Ρ‹Π» установлСн Π²ΠΎ врСмя "
"рСгистрации, Ρ‚ΠΎ `Giant` Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, Π° "
"Π·Π°Ρ‚Π΅ΠΌ освобоТдСн послС Π½Π΅Π³ΠΎ. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° `callout_lock` Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ "
"Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π° ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Код `softclock` Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ "
"список Π² согласованном состоянии Π²ΠΎ врСмя освобоТдСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Если "
"Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ `DIAGNOSTIC`, Ρ‚ΠΎ измСряСтся врСмя выполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Ссли "
"ΠΎΠ½ΠΎ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, гСнСрируСтся ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅."

#. type: Title ==
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:154
#, no-wrap
msgid "Specific Locking Strategies"
msgstr "ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ стратСгии Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ"

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:156
#, no-wrap
msgid "Credentials"
msgstr "Π£Ρ‡Ρ‘Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:159
msgid ""
"`struct ucred` is the kernel's internal credential structure, and is "
"generally used as the basis for process-driven access control within the "
"kernel. BSD-derived systems use a \"copy-on-write\" model for credential "
"data: multiple references may exist for a credential structure, and when a "
"change needs to be made, the structure is duplicated, modified, and then the "
"reference replaced. Due to wide-spread caching of the credential to "
"implement access control on open, this results in substantial memory "
"savings. With a move to fine-grained SMP, this model also saves "
"substantially on locking operations by requiring that modification only "
"occur on an unshared credential, avoiding the need for explicit "
"synchronization when consuming a known-shared credential."
msgstr ""
"`struct ucred` β€” это внутрСнняя структура ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ядра, которая "
"ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС основы для управлСния доступом Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ "
"процСссов Π²Π½ΡƒΡ‚Ρ€ΠΈ ядра. БистСмы, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΡ‚ BSD, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ модСль Β«"
"копирования ΠΏΡ€ΠΈ записи» для ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…: ΠΌΠΎΠ³ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ мноТСствСнныС "
"ссылки Π½Π° структуру ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ ΠΊΠΎΠ³Π΄Π° трСбуСтся внСсти ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, "
"структура дублируСтся, измСняСтся, Π° Π·Π°Ρ‚Π΅ΠΌ ссылка замСняСтся. Благодаря "
"ΡˆΠΈΡ€ΠΎΠΊΠΎ распространённому ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ контроля "
"доступа ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ, это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ экономии памяти. Π‘ "
"ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ Π½Π° Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ SMP (ΡΠΈΠΌΠΌΠ΅Ρ‚Ρ€ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΠΎΡΡ‚ΡŒ), эта "
"модСль Ρ‚Π°ΠΊΠΆΠ΅ сущСствСнно экономит Π½Π° опСрациях Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, трСбуя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ "
"ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для нСраздСляСмых ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, избСгая "
"нСобходимости явной синхронизации ΠΏΡ€ΠΈ использовании извСстных раздСляСмых "
"ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:161
msgid ""
"Credential structures with a single reference are considered mutable; shared "
"credential structures must not be modified or a race condition is risked. A "
"mutex, `cr_mtxp` protects the reference count of `struct ucred` so as to "
"maintain consistency. Any use of the structure requires a valid reference "
"for the duration of the use, or the structure may be released out from under "
"the illegitimate consumer."
msgstr ""
"Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… с СдинствСнной ссылкой ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ измСняСмыми; "
"раздСляСмыС структуры ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, ΠΈΠ½Π°Ρ‡Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ "
"риск состояния Π³ΠΎΠ½ΠΊΠΈ. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ `cr_mtxp` Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ счСтчик ссылок структуры `"
"struct ucred` для поддСрТания согласованности. Π›ΡŽΠ±ΠΎΠ΅ использованиС структуры "
"Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ссылки Π½Π° протяТСнии всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ использования, "
"ΠΈΠ½Π°Ρ‡Π΅ структура ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ освобоТдСна ΠΈΠ·-ΠΏΠΎΠ΄ Π½Π΅Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½ΠΎΠ³ΠΎ потрСбитСля."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:163
msgid ""
"The `struct ucred` mutex is a leaf mutex and is implemented via a mutex pool "
"for performance reasons."
msgstr ""
"ΠœΡŒΡŽΡ‚Π΅ΠΊΡ `struct ucred` являСтся листовым ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡƒΠ» "
"ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² ΠΏΠΎ сообраТСниям ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:165
msgid ""
"Usually, credentials are used in a read-only manner for access control "
"decisions, and in this case `td_ucred` is generally preferred because it "
"requires no locking. When a process' credential is updated the `proc` lock "
"must be held across the check and update operations thus avoid races. The "
"process credential `p_ucred` must be used for check and update operations to "
"prevent time-of-check, time-of-use races."
msgstr ""
"ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния для принятия "
"Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŽ доступа, ΠΈ Π² этом случаС `td_ucred`, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, "
"ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Когда ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ "
"процСсса ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° `proc` Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° протяТСнии "
"ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ обновлСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ состояний Π³ΠΎΠ½ΠΊΠΈ. Π£Ρ‡Ρ‘Ρ‚Π½Ρ‹Π΅ "
"Π΄Π°Π½Π½Ρ‹Π΅ процСсса `p_ucred` Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ "
"обновлСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π³ΠΎΠ½ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ "
"использования."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:167
msgid ""
"If system call invocations will perform access control after an update to "
"the process credential, the value of `td_ucred` must also be refreshed to "
"the current process value. This will prevent use of a stale credential "
"following a change. The kernel automatically refreshes the `td_ucred` "
"pointer in the thread structure from the process `p_ucred` whenever a "
"process enters the kernel, permitting use of a fresh credential for kernel "
"access control."
msgstr ""
"Если ΠΏΡ€ΠΈ систСмных Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ доступа послС "
"обновлСния ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… процСсса, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `td_ucred` Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ "
"ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π΄ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния процСсса. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ использованиС "
"ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… послС измСнСния. Π―Π΄Ρ€ΠΎ автоматичСски обновляСт "
"ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ `td_ucred` Π² структурС ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ· `p_ucred` процСсса всякий Ρ€Π°Π·, "
"ΠΊΠΎΠ³Π΄Π° процСсс Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ядро, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свСТиС ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Π΅ "
"Π΄Π°Π½Π½Ρ‹Π΅ для контроля доступа Π² ядрС."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:168
#, no-wrap
msgid "File Descriptors and File Descriptor Tables"
msgstr "ДСскрипторы Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ дСскрипторов Ρ„Π°ΠΉΠ»ΠΎΠ²"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:171
msgid "Details to follow."
msgstr "ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ·ΠΆΠ΅."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:172
#, no-wrap
msgid "Jail Structures"
msgstr "Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΠΊΠ»Π΅Ρ‚ΠΎΠΊ"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:175
msgid ""
"`struct prison` stores administrative details pertinent to the maintenance "
"of jails created using the man:jail[2] API. This includes the per-jail "
"hostname, IP address, and related settings. This structure is reference-"
"counted since pointers to instances of the structure are shared by many "
"credential structures. A single mutex, `pr_mtx` protects read and write "
"access to the reference count and all mutable variables inside the struct "
"jail. Some variables are set only when the jail is created, and a valid "
"reference to the `struct prison` is sufficient to read these values. The "
"precise locking of each entry is documented via comments in [.filename]#sys/"
"jail.h#."
msgstr ""
"`struct prison` Ρ…Ρ€Π°Π½ΠΈΡ‚ административныС Π΄Π°Π½Π½Ρ‹Π΅, связанныС с обслуТиваниСм "
"ΠΊΠ»Π΅Ρ‚ΠΎΠΊ, созданных с использованиСм API man:jail[2]. Π­Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ имя хоста "
"для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ, IP-адрСс ΠΈ связанныС настройки. Π­Ρ‚Π° структура ΠΈΠΌΠ΅Π΅Ρ‚ "
"счСтчик ссылок, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π΅Ρ‘ экзСмпляры Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ "
"структурами ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Один ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, `pr_mtx`, Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись "
"счётчика ссылок ΠΈ всСх измСняСмых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ `struct jail`. НСкоторыС "
"ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ создании ΠΊΠ»Π΅Ρ‚ΠΊΠΈ, ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ "
"ссылки Π½Π° `struct prison` достаточно для чтСния этих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Вочная "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° Π² коммСнтариях Ρ„Π°ΠΉΠ»Π° [.filename]#"
"sys/jail.h#."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:176
#, no-wrap
msgid "MAC Framework"
msgstr "MAC Framework"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:179
msgid ""
"The TrustedBSD MAC Framework maintains data in a variety of kernel objects, "
"in the form of `struct label`. In general, labels in kernel objects are "
"protected by the same lock as the remainder of the kernel object. For "
"example, the `v_label` label in `struct vnode` is protected by the vnode "
"lock on the vnode."
msgstr ""
"Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ TrustedBSD MAC ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ядра Π² "
"Π²ΠΈΠ΄Π΅ `struct label`. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΠ΅Ρ‚ΠΊΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ядра Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌ ΠΆΠ΅ "
"ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ядра. НапримСр, ΠΌΠ΅Ρ‚ΠΊΠ° "
"`v_label` Π² `struct vnode` защищаСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ vnode."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:181
msgid ""
"In addition to labels maintained in standard kernel objects, the MAC "
"Framework also maintains a list of registered and active policies. The "
"policy list is protected by a global mutex (`mac_policy_list_lock`) and a "
"busy count (also protected by the mutex). Since many access control checks "
"may occur in parallel, entry to the framework for a read-only access to the "
"policy list requires holding the mutex while incrementing (and later "
"decrementing) the busy count. The mutex need not be held for the duration of "
"the MAC entry operation--some operations, such as label operations on file "
"system objects--are long-lived. To modify the policy list, such as during "
"policy registration and de-registration, the mutex must be held and the "
"reference count must be zero, to prevent modification of the list while it "
"is in use."
msgstr ""
"Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ Π² стандартных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ядра, MAC "
"Framework Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ список зарСгистрированных ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ. "
"Бписок ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ глобальной ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ "
"(`mac_policy_list_lock`) ΠΈ счСтчиком использования (Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌ "
"ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ мноТСство ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ контроля доступа ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ "
"ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, Π²Ρ…ΠΎΠ΄ Π² framework для доступа Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊ списку ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ "
"Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ удСрТания ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π²ΠΎ врСмя увСличСния (ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ) "
"счСтчика использования. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π° протяТСнии всСй "
"ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ…ΠΎΠ΄Π° Π² MAC β€” Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ Π½Π° "
"ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя. Для измСнСния "
"списка ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎ врСмя рСгистрации ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ рСгистрации ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ, "
"ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½, Π° счСтчик ссылок Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ "
"ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ списка Π²ΠΎ врСмя Π΅Π³ΠΎ использования."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:183
msgid ""
"A condition variable, `mac_policy_list_not_busy`, is available to threads "
"that need to wait for the list to become unbusy, but this condition variable "
"must only be waited on if the caller is holding no other locks, or a lock "
"order violation may be possible. The busy count, in effect, acts as a form "
"of shared/exclusive lock over access to the framework: the difference is "
"that, unlike with an sx lock, consumers waiting for the list to become "
"unbusy may be starved, rather than permitting lock order problems with "
"regards to the busy count and other locks that may be held on entry to (or "
"inside) the MAC Framework."
msgstr ""
"Условная пСрСмСнная `mac_policy_list_not_busy` доступна для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ "
"Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ освобоТдСния списка, Π½ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π½Π° этой условной "
"ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ допустимо Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΈΠ½Π°Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ порядка Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ. ЀактичСски, "
"счСтчик занятости дСйствуСт ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΠΌΠ° раздСляСмой/ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ "
"доступа ΠΊ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ: ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ sx-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, "
"ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ освобоТдСния списка, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Ρ‚ΡŒΡΡ голоданию, "
"вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ порядка Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ счСтчика "
"занятости ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² (ΠΈΠ»ΠΈ "
"Π²Π½ΡƒΡ‚Ρ€ΠΈ) MAC Framework."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:184
#, no-wrap
msgid "Modules"
msgstr "ΠœΠΎΠ΄ΡƒΠ»ΠΈ"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:187
msgid ""
"For the module subsystem there exists a single lock that is used to protect "
"the shared data. This lock is a shared/exclusive (SX) lock and has a good "
"chance of needing to be acquired (shared or exclusively), therefore there "
"are a few macros that have been added to make access to the lock more easy. "
"These macros can be located in [.filename]#sys/module.h# and are quite basic "
"in terms of usage. The main structures protected under this lock are the "
"`module_t` structures (when shared) and the global `modulelist_t` structure, "
"modules. One should review the related source code in [.filename]#kern/"
"kern_module.c# to further understand the locking strategy."
msgstr ""
"Для подсистСмы ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ сущСствуСт Сдиная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ "
"для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΠ±Ρ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° являСтся shared/exclusive (SX) ΠΈ с "
"высокой Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚Π° (раздСляСмого ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ), "
"поэтому Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ нСсколько макросов для упрощСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ. Π­Ρ‚ΠΈ "
"макросы ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² [.filename]#sys/module.h#, ΠΈ ΠΈΡ… использованиС довольно "
"простоС. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ структуры, Π·Π°Ρ‰ΠΈΡ‰Π°Π΅ΠΌΡ‹Π΅ этой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, β€” это структуры "
"`module_t` (ΠΏΡ€ΠΈ раздСляСмом доступС) ΠΈ глобальная структура `modulelist_t` "
"modules. Для Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ понимания стратСгии Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ рСкомСндуСтся "
"ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ исходный ΠΊΠΎΠ΄ Π² [.filename]#kern/kern_module.c#."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:188
#, no-wrap
msgid "Newbus Device Tree"
msgstr "Π”Π΅Ρ€Π΅Π²ΠΎ устройств Newbus"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:191
msgid ""
"The newbus system will have one sx lock. Readers will hold a shared (read) "
"lock (man:sx_slock[9]) and writers will hold an exclusive (write) lock "
"(man:sx_xlock[9]). Internal functions will not do locking at all. Externally "
"visible ones will lock as needed. Those items that do not matter if the race "
"is won or lost will not be locked, since they tend to be read all over the "
"place (e.g., man:device_get_softc[9]). There will be relatively few changes "
"to the newbus data structures, so a single lock should be sufficient and not "
"impose a performance penalty."
msgstr ""
"БистСма newbus Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ sx. Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ "
"ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ (read) Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ (man:sx_slock[9]), Π° писатСли β€” "
"ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½ΡƒΡŽ (write) Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ (man:sx_xlock[9]). Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ "
"Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π²ΠΎΠΎΠ±Ρ‰Π΅. Π’Π½Π΅ΡˆΠ½Π΅ Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, "
"Π²Ρ‹ΠΈΠ³Ρ€Π°Π½Π° Π³ΠΎΠ½ΠΊΠ° ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π½Π°, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ "
"Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… мСстах (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, man:device_get_softc[9]). ИзмСнСния Π² "
"структурах Π΄Π°Π½Π½Ρ‹Ρ… newbus Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π΄ΠΊΠΈΠΌΠΈ, поэтому ΠΎΠ΄Π½ΠΎΠΉ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ достаточно, ΠΈ это Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ сниТСнию "
"ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:192
#, no-wrap
msgid "Pipes"
msgstr "ΠšΠ°Π½Π°Π»Ρ‹ (pipe)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:195
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:217
msgid "..."
msgstr "..."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:196
#, no-wrap
msgid "Processes and Threads"
msgstr "ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:199
msgid "process hierarchy"
msgstr "иСрархия процСссов"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:201
msgid "proc locks, references"
msgstr "Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ ссылки proc"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:203
msgid ""
"thread-specific copies of proc entries to freeze during system calls, "
"including td_ucred"
msgstr ""
"потокоспСцифичныС ΠΊΠΎΠΏΠΈΠΈ записСй proc для Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΊΠΈ Π²ΠΎ врСмя систСмных "
"Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ td_ucred"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:205
msgid "inter-process operations"
msgstr "мСТпроцСссныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:207
msgid "process groups and sessions"
msgstr "Π³Ρ€ΡƒΠΏΠΏΡ‹ процСссов ΠΈ сСансы"

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:208
#, no-wrap
msgid "Scheduler"
msgstr "ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:211
msgid ""
"Lots of references to `sched_lock` and notes pointing at specific primitives "
"and related magic elsewhere in the document."
msgstr ""
"ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ссылок Π½Π° `sched_lock` ΠΈ примСчания, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ "
"ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ ΠΈ связанныС с Π½ΠΈΠΌΠΈ особСнности Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… частях Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:212
#, no-wrap
msgid "Select and Poll"
msgstr "Select ΠΈ Poll"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:215
msgid ""
"The `select` and `poll` functions permit threads to block waiting on events "
"on file descriptors--most frequently, whether or not the file descriptors "
"are readable or writable."
msgstr ""
"Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ `select` ΠΈ `poll` ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ событий "
"Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторах β€” Ρ‡Π°Ρ‰Π΅ всСго, доступности Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов для "
"чтСния ΠΈΠ»ΠΈ записи."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:218
#, no-wrap
msgid "SIGIO"
msgstr "SIGIO"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:221
msgid ""
"The SIGIO service permits processes to request the delivery of a SIGIO "
"signal to its process group when the read/write status of specified file "
"descriptors changes. At most one process or process group is permitted to "
"register for SIGIO from any given kernel object, and that process or group "
"is referred to as the owner. Each object supporting SIGIO registration "
"contains pointer field that is `NULL` if the object is not registered, or "
"points to a `struct sigio` describing the registration. This field is "
"protected by a global mutex, `sigio_lock`. Callers to SIGIO maintenance "
"functions must pass in this field \"by reference\" so that local register "
"copies of the field are not made when unprotected by the lock."
msgstr ""
"Π‘Π»ΡƒΠΆΠ±Π° SIGIO позволяСт процСссам Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ доставку сигнала SIGIO своСй "
"Π³Ρ€ΡƒΠΏΠΏΠ΅ процСссов ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ статуса чтСния/записи ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… "
"дСскрипторов. НС Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ процСссов ΠΌΠΎΠΆΠ΅Ρ‚ "
"Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ для получСния SIGIO ΠΎΡ‚ любого Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ядра, ΠΈ "
"Ρ‚Π°ΠΊΠΎΠΉ процСсс ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ° называСтся Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, "
"ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ SIGIO, содСрТит ΠΏΠΎΠ»Π΅-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ "
"Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `NULL`, Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ зарСгистрирован, ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° структуру `"
"struct sigio`, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ΠΎ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ "
"ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ `sigio_lock`. Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ обслуТивания SIGIO Π΄ΠΎΠ»ΠΆΠ½Ρ‹ "
"ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ это ΠΏΠΎΠ»Π΅ Β«ΠΏΠΎ ссылкС», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ рСгистра Π½Π΅ "
"создавались Π±Π΅Π· Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:223
msgid ""
"One `struct sigio` is allocated for each registered object associated with "
"any process or process group, and contains back-pointers to the object, "
"owner, signal information, a credential, and the general disposition of the "
"registration. Each process or progress group contains a list of registered "
"`struct sigio` structures, `p_sigiolst` for processes, and `pg_sigiolst` for "
"process groups. These lists are protected by the process or process group "
"locks respectively. Most fields in each `struct sigio` are constant for the "
"duration of the registration, with the exception of the `sio_pgsigio` field "
"which links the `struct sigio` into the process or process group list. "
"Developers implementing new kernel objects supporting SIGIO will, in "
"general, want to avoid holding structure locks while invoking SIGIO "
"supporting functions, such as `fsetown` or `funsetown` to avoid defining a "
"lock order between structure locks and the global SIGIO lock. This is "
"generally possible through use of an elevated reference count on the "
"structure, such as reliance on a file descriptor reference to a pipe during "
"a pipe operation."
msgstr ""
"Один `struct sigio` выдСляСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ зарСгистрированного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, "
"связанного с Π»ΡŽΠ±Ρ‹ΠΌ процСссом ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ процСссов, ΠΈ содСрТит ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ "
"ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сигналС, ΡƒΡ‡Ρ‘Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ "
"состояниС рСгистрации. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ° процСссов содСрТит список "
"зарСгистрированных структур `struct sigio`: `p_sigiolst` для процСссов ΠΈ "
"`pg_sigiolst` для Π³Ρ€ΡƒΠΏΠΏ процСссов. Π­Ρ‚ΠΈ списки Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ процСсса "
"ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ процСссов соотвСтствСнно. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠΎΠ»Π΅ΠΉ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ `struct "
"sigio` ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ постоянными Π½Π° протяТСнии рСгистрации, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ поля "
"`sio_pgsigio`, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ связываСт `struct sigio` со списком процСсса ΠΈΠ»ΠΈ "
"Π³Ρ€ΡƒΠΏΠΏΡ‹ процСссов. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ядра с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ "
"SIGIO, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ удСрТания Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ структур ΠΏΡ€ΠΈ "
"Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ SIGIO, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ `fsetown` ΠΈΠ»ΠΈ `funsetown`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ "
"Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ порядок Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ структур ΠΈ глобальной "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ SIGIO. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π° счСт использования ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ "
"счСтчика ссылок Π½Π° структуру, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡƒΡ‚Π΅ΠΌ ΠΎΠΏΠΎΡ€Ρ‹ Π½Π° ссылку Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ "
"дСскриптора Π½Π° ΠΊΠ°Π½Π°Π» Π²ΠΎ врСмя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΊΠ°Π½Π°Π»ΠΎΠΌ."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:224
#, no-wrap
msgid "Sysctl"
msgstr "Sysctl"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:227
msgid ""
"The `sysctl` MIB service is invoked from both within the kernel and from "
"userland applications using a system call. At least two issues are raised in "
"locking: first, the protection of the structures maintaining the namespace, "
"and second, interactions with kernel variables and functions that are "
"accessed by the sysctl interface. Since sysctl permits the direct export "
"(and modification) of kernel statistics and configuration parameters, the "
"sysctl mechanism must become aware of appropriate locking semantics for "
"those variables. Currently, sysctl makes use of a single global sx lock to "
"serialize use of `sysctl`; however, it is assumed to operate under Giant and "
"other protections are not provided. The remainder of this section speculates "
"on locking and semantic changes to sysctl."
msgstr ""
"БСрвис `sysctl` MIB вызываСтся ΠΊΠ°ΠΊ ΠΈΠ· ядра, Ρ‚Π°ΠΊ ΠΈ ΠΈΠ· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… "
"ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с использованиСм систСмного Π²Ρ‹Π·ΠΎΠ²Π°. По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π΄Π²Π° вопроса "
"Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ: Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π·Π°Ρ‰ΠΈΡ‚Π° структур, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… "
"пространство ΠΈΠΌΠ΅Π½, ΠΈ Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, взаимодСйствиС с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ функциями "
"ядра, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ обращаСтся интСрфСйс `sysctl`. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ `sysctl` позволяСт "
"прямоС экспортированиС (ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅) статистики ядра ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² "
"ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ `sysctl` Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ сСмантики "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ для этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π’ настоящСС врСмя `sysctl` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π΄ΠΈΠ½ΡƒΡŽ "
"Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ sx-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ для сСриализации использования `sysctl`; ΠΎΠ΄Π½Π°ΠΊΠΎ "
"прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ΄ Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ Giant, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π½Π΅ "
"ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ. ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ этого Ρ€Π°Π·Π΄Π΅Π»Π° рассматриваСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ "
"измСнСния Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ… ΠΈ сСмантикС `sysctl`."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:229
msgid ""
"Need to change the order of operations for sysctl's that update values from "
"read old, copyin and copyout, write new to copyin, lock, read old and write "
"new, unlock, copyout. Normal sysctl's that just copyout the old value and "
"set a new value that they copyin may still be able to follow the old model. "
"However, it may be cleaner to use the second model for all of the sysctl "
"handlers to avoid lock operations."
msgstr ""
"НСобходимо ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ порядок ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для sysctl, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ значСния "
"ΠΈΠ· чтСния старого, copyin ΠΈ copyout, записи Π½ΠΎΠ²ΠΎΠ³ΠΎ Π½Π° copyin, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, "
"Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ старого ΠΈ запись Π½ΠΎΠ²ΠΎΠ³ΠΎ, Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, copyout. ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ sysctl, "
"ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просто ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ староС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π½ΠΎΠ²ΠΎΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ΠΈ "
"ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ старой ΠΌΠΎΠ΄Π΅Π»ΠΈ. Однако, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ "
"Ρ‡ΠΈΡ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΡƒΡŽ модСль для всСх ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² sysctl, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ "
"ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:231
msgid ""
"To allow for the common case, a sysctl could embed a pointer to a mutex in "
"the SYSCTL_FOO macros and in the struct. This would work for most sysctl's. "
"For values protected by sx locks, spin mutexes, or other locking strategies "
"besides a single sleep mutex, SYSCTL_PROC nodes could be used to get the "
"locking right."
msgstr ""
"Для упрощСния распространённого случая, sysctl ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° "
"ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π² макросах SYSCTL_FOO ΠΈ Π² структурС. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ для "
"Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° sysctl. Для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½Ρ‹Ρ… sx-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ, спин-"
"ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ стратСгиями синхронизации, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ "
"ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° сна, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ·Π»Ρ‹ SYSCTL_PROC для обСспСчСния ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:232
#, no-wrap
msgid "Taskqueue"
msgstr "ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π·Π°Π΄Π°Ρ‡"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:235
msgid ""
"The taskqueue's interface has two basic locks associated with it in order to "
"protect the related shared data. The `taskqueue_queues_mutex` is meant to "
"serve as a lock to protect the `taskqueue_queues` TAILQ. The other mutex "
"lock associated with this system is the one in the `struct taskqueue` data "
"structure. The use of the synchronization primitive here is to protect the "
"integrity of the data in the `struct taskqueue`. It should be noted that "
"there are no separate macros to assist the user in locking down his/her own "
"work since these locks are most likely not going to be used outside of "
"[.filename]#kern/subr_taskqueue.c#."
msgstr ""
"Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ `taskqueue` ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ основныС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, связанныС с Π½ΠΈΠΌ, для "
"Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ `taskqueue_queues_mutex` "
"ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ TAILQ `taskqueue_queues`. Другая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° "
"ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, связанная с этой систСмой, находится Π² структурС Π΄Π°Π½Π½Ρ‹Ρ… `struct "
"taskqueue`. ИспользованиС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π° синхронизации здСсь Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для "
"Π·Π°Ρ‰ΠΈΡ‚Ρ‹ цСлостности Π΄Π°Π½Π½Ρ‹Ρ… Π² `struct taskqueue`. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ "
"ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… макросов, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ "
"Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, скорСС всСго, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π° "
"ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ [.filename]#kern/subr_taskqueue.c#."

#. type: Title ==
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:237
#, no-wrap
msgid "Implementation Notes"
msgstr "Π—Π°ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ"

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:239
#, no-wrap
msgid "Sleep Queues"
msgstr "ΠžΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:242
msgid ""
"A sleep queue is a structure that holds the list of threads asleep on a wait "
"channel. Each thread that is not asleep on a wait channel carries a sleep "
"queue structure around with it. When a thread blocks on a wait channel, it "
"donates its sleep queue structure to that wait channel. Sleep queues "
"associated with a wait channel are stored in a hash table."
msgstr ""
"ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ сна β€” это структура, которая содСрТит список ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π½Π° "
"ΠΊΠ°Π½Π°Π»Π΅ оТидания. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ находится Π² состоянии оТидания Π½Π° "
"ΠΊΠ°Π½Π°Π»Π΅ оТидания, Ρ…Ρ€Π°Π½ΠΈΡ‚ структуру ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна ΠΏΡ€ΠΈ сСбС. Когда ΠΏΠΎΡ‚ΠΎΠΊ "
"блокируСтся Π½Π° ΠΊΠ°Π½Π°Π»Π΅ оТидания, ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ свою структуру ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна этому "
"ΠΊΠ°Π½Π°Π»Ρƒ. ΠžΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна, связанныС с ΠΊΠ°Π½Π°Π»ΠΎΠΌ оТидания, хранятся Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:244
msgid ""
"The sleep queue hash table holds sleep queues for wait channels that have at "
"least one blocked thread. Each entry in the hash table is called a "
"sleepqueue chain. The chain contains a linked list of sleep queues and a "
"spin mutex. The spin mutex protects the list of sleep queues as well as the "
"contents of the sleep queue structures on the list. Only one sleep queue is "
"associated with a given wait channel. If multiple threads block on a wait "
"channel than the sleep queues associated with all but the first thread are "
"stored on a list of free sleep queues in the master sleep queue. When a "
"thread is removed from the sleep queue it is given one of the sleep queue "
"structures from the master queue's free list if it is not the only thread "
"asleep on the queue. The last thread is given the master sleep queue when it "
"is resumed. Since threads may be removed from the sleep queue in a different "
"order than they are added, a thread may depart from a sleep queue with a "
"different sleep queue structure than the one it arrived with."
msgstr ""
"Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сна содСрТит ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна для ΠΊΠ°Π½Π°Π»ΠΎΠ² оТидания, Ρƒ "
"ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. КаТдая запись Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ "
"называСтся Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна. Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° содСрТит связанный список ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ "
"сна ΠΈ спин-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. Π‘ΠΏΠΈΠ½-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ список ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сна, Π° Ρ‚Π°ΠΊΠΆΠ΅ "
"содСрТимоС структур ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сна Π² спискС. Π‘ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ оТидания связана "
"Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сна. Если нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅ "
"оТидания, Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна, связанныС со всСми ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ, "
"хранятся Π² спискС свободных ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сна Π² Π³Π»Π°Π²Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна. Когда ΠΏΠΎΡ‚ΠΎΠΊ "
"удаляСтся ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна, ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ· структур ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна ΠΈΠ· "
"свободного списка Π³Π»Π°Π²Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Ссли ΠΎΠ½ Π½Π΅ являСтся СдинствСнным ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ "
"Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. ПослСдний ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π³Π»Π°Π²Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сна ΠΏΡ€ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ. "
"ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒΡΡ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна Π² порядкС, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΎΡ‚ "
"порядка добавлСния, ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сна с Π΄Ρ€ΡƒΠ³ΠΎΠΉ структурой "
"ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна, Ρ‡Π΅ΠΌ Ρ‚Π°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ Π² Π½Π΅Ρ‘ ΠΏΠΎΠΏΠ°Π»."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:246
msgid ""
"The `sleepq_lock` function locks the spin mutex of the sleep queue chain "
"that maps to a specific wait channel. The `sleepq_lookup` function looks in "
"the hash table for the master sleep queue associated with a given wait "
"channel. If no master sleep queue is found, it returns `NULL`. The "
"`sleepq_release` function unlocks the spin mutex associated with a given "
"wait channel."
msgstr ""
"Ѐункция `sleepq_lock` Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ спин-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Ρ†Π΅ΠΏΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна, "
"ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ оТидания. Ѐункция `sleepq_lookup` "
"выполняСт поиск Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна, связанной с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ "
"ΠΊΠ°Π½Π°Π»ΠΎΠΌ оТидания. Если главная ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сна Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°, функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ "
"`NULL`. Ѐункция `sleepq_release` Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ спин-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, связанный с "
"Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ оТидания."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:248
msgid ""
"A thread is added to a sleep queue via the `sleepq_add`. This function "
"accepts the wait channel, a pointer to the mutex that protects the wait "
"channel, a wait message description string, and a mask of flags. The sleep "
"queue chain should be locked via `sleepq_lock` before this function is "
"called. If no mutex protects the wait channel (or it is protected by Giant), "
"then the mutex pointer argument should be `NULL`. The flags argument "
"contains a type field that indicates the kind of sleep queue that the thread "
"is being added to and a flag to indicate if the sleep is interruptible "
"(`SLEEPQ_INTERRUPTIBLE`). Currently there are only two types of sleep "
"queues: traditional sleep queues managed via the `msleep` and `wakeup` "
"functions (`SLEEPQ_MSLEEP`) and condition variable sleep queues "
"(`SLEEPQ_CONDVAR`). The sleep queue type and lock pointer argument are used "
"solely for internal assertion checking. Code that calls `sleepq_add` should "
"explicitly unlock any interlock protecting the wait channel after the "
"associated sleepqueue chain has been locked via `sleepq_lock` and before "
"blocking on the sleep queue via one of the waiting functions."
msgstr ""
"ΠŸΠΎΡ‚ΠΎΠΊ добавляСтся Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ оТидания с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `sleepq_add`. Π­Ρ‚Π° функция "
"ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°Π½Π°Π» оТидания, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠ°Π½Π°Π» оТидания, "
"строку описания сообщСния оТидания ΠΈ маску Ρ„Π»Π°Π³ΠΎΠ². ЦСпь ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания "
"Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `sleepq_lock` ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ этой "
"Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если ΠΊΠ°Π½Π°Π» оТидания Π½Π΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ (ΠΈΠ»ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ "
"Giant), Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ указатСля Π½Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ `NULL`. АргумСнт Ρ„Π»Π°Π³ΠΎΠ² "
"содСрТит ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ°, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Π½Π° Π²ΠΈΠ΄ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ "
"добавляСтся ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈ Ρ„Π»Π°Π³, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, являСтся Π»ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ "
"(`SLEEPQ_INTERRUPTIBLE`). Π’ настоящСС врСмя сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° "
"ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ оТидания: Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, управляСмыС Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `msleep` "
"ΠΈ `wakeup` (`SLEEPQ_MSLEEP`), ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… "
"(`SLEEPQ_CONDVAR`). Π’ΠΈΠΏ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ указатСля Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ "
"ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ. Код, "
"Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ `sleepq_add`, Π΄ΠΎΠ»ΠΆΠ΅Π½ явно Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ "
"ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠ°Π½Π°Π» оТидания, послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ связанная Ρ†Π΅ΠΏΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ "
"оТидания Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° Ρ‡Π΅Ρ€Π΅Π· `sleepq_lock` ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Π² "
"ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ оТидания."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:250
msgid ""
"A timeout for a sleep is set by invoking `sleepq_set_timeout`. The function "
"accepts the wait channel and the timeout time as a relative tick count as "
"its arguments. If a sleep should be interrupted by arriving signals, the "
"`sleepq_catch_signals` function should be called as well. This function "
"accepts the wait channel as its only parameter. If there is already a signal "
"pending for this thread, then `sleepq_catch_signals` will return a signal "
"number; otherwise, it will return 0."
msgstr ""
"Π’Π°ΠΉΠΌΠ°ΡƒΡ‚ для сна устанавливаСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ `sleepq_set_timeout`. Ѐункция "
"ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°Π½Π°Π» оТидания ΠΈ врСмя Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π° Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ количСства "
"Ρ‚ΠΈΠΊΠΎΠ² Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Если сон Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Π²Π°Π½ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠΌΠΈ "
"сигналами, слСдуСт Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `sleepq_catch_signals`. Π­Ρ‚Π° функция "
"ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°Π½Π°Π» оТидания Π² качСствС СдинствСнного ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Если для "
"Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ сигнал, Ρ‚ΠΎ `sleepq_catch_signals` Π²Π΅Ρ€Π½Ρ‘Ρ‚ "
"Π½ΠΎΠΌΠ΅Ρ€ сигнала; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½Π° Π²Π΅Ρ€Π½Ρ‘Ρ‚ 0."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:252
msgid ""
"Once a thread has been added to a sleep queue, it blocks using one of the "
"`sleepq_wait` functions. There are four wait functions depending on whether "
"or not the caller wishes to use a timeout or have the sleep aborted by "
"caught signals or an interrupt from the userland thread scheduler. The "
"`sleepq_wait` function simply waits until the current thread is explicitly "
"resumed by one of the wakeup functions. The `sleepq_timedwait` function "
"waits until either the thread is explicitly resumed or the timeout set by an "
"earlier call to `sleepq_set_timeout` expires. The `sleepq_wait_sig` function "
"waits until either the thread is explicitly resumed or its sleep is aborted. "
"The `sleepq_timedwait_sig` function waits until either the thread is "
"explicitly resumed, the timeout set by an earlier call to "
"`sleepq_set_timeout` expires, or the thread's sleep is aborted. All of the "
"wait functions accept the wait channel as their first parameter. In "
"addition, the `sleepq_timedwait_sig` function accepts a second boolean "
"parameter to indicate if the earlier call to `sleepq_catch_signals` found a "
"pending signal."
msgstr ""
"ПослС добавлСния ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ оТидания ΠΎΠ½ блокируСтся с использованиСм "
"ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ `sleepq_wait`. БущСствуСт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания Π² "
"зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ…ΠΎΡ‡Π΅Ρ‚ Π»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚, "
"ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ сна ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ сигналами ΠΈΠ»ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΎΡ‚ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° "
"ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ пространства. Ѐункция `sleepq_wait` просто "
"ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ явно Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ "
"пробуТдСния. Ѐункция `sleepq_timedwait` ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ явно "
"Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½ ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ истСчёт Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚, установлСнный ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ "
"`sleepq_set_timeout`. Ѐункция `sleepq_wait_sig` ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ "
"явно Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½ ΠΈΠ»ΠΈ Π΅Π³ΠΎ сон Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Π½. Ѐункция `sleepq_timedwait_sig`"
" ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ явно Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½, Π½Π΅ истСчёт Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚, "
"установлСнный ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ `sleepq_set_timeout`, ΠΈΠ»ΠΈ сон ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π΅ "
"Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Π½. ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΊΠ°Π½Π°Π» оТидания Π² качСствС "
"ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, функция `sleepq_timedwait_sig` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ "
"Π²Ρ‚ΠΎΡ€ΠΎΠΉ логичСский ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» Π»ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² "
"`sleepq_catch_signals` ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ сигнал."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:254
msgid ""
"If the thread is explicitly resumed or is aborted by a signal, then a value "
"of zero is returned by the wait function to indicate a successful sleep. If "
"the thread is resumed by either a timeout or an interrupt from the userland "
"thread scheduler then an appropriate errno value is returned instead. Note "
"that since `sleepq_wait` can only return 0 it does not return anything and "
"the caller should assume a successful sleep. Also, if a thread's sleep times "
"out and is aborted simultaneously then `sleepq_timedwait_sig` will return an "
"error indicating that a timeout occurred. If an error value of 0 is returned "
"and either `sleepq_wait_sig` or `sleepq_timedwait_sig` was used to block, "
"then the function `sleepq_calc_signal_retval` should be called to check for "
"any pending signals and calculate an appropriate return value if any are "
"found. The signal number returned by the earlier call to "
"`sleepq_catch_signals` should be passed as the sole argument to "
"`sleepq_calc_signal_retval`."
msgstr ""
"Если ΠΏΠΎΡ‚ΠΎΠΊ явно Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Ρ€Π²Π°Π½ сигналом, функция оТидания "
"Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ноль, указывая Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ сна. Если ΠΏΠΎΡ‚ΠΎΠΊ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ "
"ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρƒ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΡŽ ΠΎΡ‚ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ "
"пространствС, вмСсто этого возвращаСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ errno. "
"ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ `sleepq_wait` ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 0, "
"ΠΎΠ½Π° Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚, ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона Π΄ΠΎΠ»ΠΆΠ½Π° ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ сон ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ. "
"Π’Π°ΠΊΠΆΠ΅, Ссли сон ΠΏΠΎΡ‚ΠΎΠΊΠ° прСрываСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρƒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ "
"ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, `sleepq_timedwait_sig` Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π½Π° срабатываниС "
"Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°. Если Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ошибки 0 ΠΈ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ использовались "
"`sleepq_wait_sig` ΠΈΠ»ΠΈ `sleepq_timedwait_sig`, слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ "
"`sleepq_calc_signal_retval` для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… сигналов ΠΈ вычислСния "
"ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹. НомСр "
"сигнала, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ `sleepq_catch_signals`, Π΄ΠΎΠ»ΠΆΠ΅Π½ "
"Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π² качСствС СдинствСнного Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² "
"`sleepq_calc_signal_retval`."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:256
msgid ""
"Threads asleep on a wait channel are explicitly resumed by the "
"`sleepq_broadcast` and `sleepq_signal` functions. Both functions accept the "
"wait channel from which to resume threads, a priority to raise resumed "
"threads to, and a flags argument to indicate which type of sleep queue is "
"being resumed. The priority argument is treated as a minimum priority. If a "
"thread being resumed already has a higher priority (numerically lower) than "
"the priority argument then its priority is not adjusted. The flags argument "
"is used for internal assertions to ensure that sleep queues are not being "
"treated as the wrong type. For example, the condition variable functions "
"should not resume threads on a traditional sleep queue. The "
"`sleepq_broadcast` function resumes all threads that are blocked on the "
"specified wait channel while `sleepq_signal` only resumes the highest "
"priority thread blocked on the wait channel. The sleep queue chain should "
"first be locked via the `sleepq_lock` function before calling these "
"functions."
msgstr ""
"ΠŸΠΎΡ‚ΠΎΠΊΠΈ, находящиСся Π² состоянии оТидания Π½Π° ΠΊΠ°Π½Π°Π»Π΅ оТидания, явно "
"Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ функциями `sleepq_broadcast` ΠΈ `sleepq_signal`. ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ "
"ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΊΠ°Π½Π°Π» оТидания, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Π½Π° "
"ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„Π»Π°Π³ΠΎΠ², ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ "
"Ρ‚ΠΈΠΏ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ. АргумСнт ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° "
"трактуСтся ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚. Если Ρƒ возобновляСмого ΠΏΠΎΡ‚ΠΎΠΊΠ° ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ "
"Π±ΠΎΠ»Π΅Π΅ высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ (числСнно мСньший), Ρ‡Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅, Π΅Π³ΠΎ "
"ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π΅ измСняСтся. АргумСнт Ρ„Π»Π°Π³ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… "
"ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ "
"Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. НапримСр, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ "
"Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания. Ѐункция "
"`sleepq_broadcast` возобновляСт всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ "
"ΠΊΠ°Π½Π°Π»Π΅ оТидания, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ `sleepq_signal` возобновляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΊ с "
"Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° ΠΊΠ°Π½Π°Π»Π΅ оТидания. ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ "
"этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ "
"Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `sleepq_lock`."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:258
msgid ""
"A sleeping thread may have its sleep interrupted by calling the "
"`sleepq_abort` function. This function must be called with `sched_lock` held "
"and the thread must be queued on a sleep queue. A thread may also be removed "
"from a specific sleep queue via the `sleepq_remove` function. This function "
"accepts both a thread and a wait channel as an argument and only awakens the "
"thread if it is on the sleep queue for the specified wait channel. If the "
"thread is not on a sleep queue or it is on a sleep queue for a different "
"wait channel, then this function does nothing."
msgstr ""
"Бпящий ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Π²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `sleepq_abort`. Π­Ρ‚Π° "
"функция Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ΠΌ `sched_lock`, Π° ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ "
"Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна. ΠŸΠΎΡ‚ΠΎΠΊ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Ρ‘Π½ ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ "
"ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `sleepq_remove`. Π­Ρ‚Π° функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ "
"ΠΏΠΎΡ‚ΠΎΠΊ, Ρ‚Π°ΠΊ ΠΈ ΠΊΠ°Π½Π°Π» оТидания Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ "
"Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΎΠ½ находится Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° "
"оТидания. Если ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ находится Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна ΠΈΠ»ΠΈ находится Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна "
"для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° оТидания, эта функция Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:259
#, no-wrap
msgid "Turnstiles"
msgstr "Π’ΡƒΡ€Π½ΠΈΠΊΠ΅Ρ‚Ρ‹"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:262
msgid "Compare/contrast with sleep queues."
msgstr "Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅/сопоставлСниС с очСрСдями сна."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:264
msgid "Lookup/wait/release. - Describe TDF_TSNOBLOCK race."
msgstr "Поиск/ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅/освобоТдСниС. - ΠžΠΏΠΈΡΠ°Ρ‚ΡŒ состояниС Π³ΠΎΠ½ΠΊΠΈ TDF_TSNOBLOCK."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:266
msgid "Priority propagation."
msgstr "ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠ΅ распространСниС."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:267
#, no-wrap
msgid "Details of the Mutex Implementation"
msgstr "ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:270
msgid ""
"Should we require mutexes to be owned for mtx_destroy() since we can not "
"safely assert that they are unowned by anyone else otherwise?"
msgstr ""
"Π”ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ ΠΌΡ‹ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ владСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ для `mtx_destroy()`, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ "
"ΠΈΠ½Π°Ρ‡Π΅ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ бСзопасно ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Ρ‘?"

#. type: Title ====
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:271
#, no-wrap
msgid "Spin Mutexes"
msgstr "Π’Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:274
msgid "Use a critical section..."
msgstr "ИспользованиС критичСской сСкции..."

#. type: Title ====
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:275
#, no-wrap
msgid "Sleep Mutexes"
msgstr "ΠœΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ сна (Sleep Mutexes)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:278
msgid "Describe the races with contested mutexes"
msgstr "ΠžΠΏΠΈΡˆΠΈΡ‚Π΅ Π³ΠΎΠ½ΠΊΠΈ с оспариваСмыми ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:280
msgid ""
"Why it is safe to read mtx_lock of a contested mutex when holding the "
"turnstile chain lock."
msgstr ""
"ΠŸΠΎΡ‡Π΅ΠΌΡƒ бСзопасно Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ mtx_lock оспариваСмой ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΏΡ€ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠΈ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Ρ‚ΡƒΡ€Π½ΠΈΠΊΠ΅Ρ‚Π°."

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:281
#, no-wrap
msgid "Witness"
msgstr "Witness"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:284
msgid "What does it do"
msgstr "Π§Ρ‚ΠΎ это Π΄Π΅Π»Π°Π΅Ρ‚"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:286
msgid "How does it work"
msgstr "Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚"

#. type: Title ==
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:288
#, no-wrap
msgid "Miscellaneous Topics"
msgstr "Π Π°Π·Π½Ρ‹Π΅ Ρ‚Π΅ΠΌΡ‹"

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:290
#, no-wrap
msgid "Interrupt Source and ICU Abstractions"
msgstr "Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΈ абстракции ICU"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:293
msgid "struct isrc"
msgstr "struct isrc"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:295
msgid "pic drivers"
msgstr "pic Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹"

#. type: Title ===
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:296
#, no-wrap
msgid "Other Random Questions/Topics"
msgstr "Π”Ρ€ΡƒΠ³ΠΈΠ΅ случайныС вопросы/Ρ‚Π΅ΠΌΡ‹"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:299
msgid "Should we pass an interlock into `sema_wait`?"
msgstr "ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π² `sema_wait`?"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:301
msgid "Should we have non-sleepable sx locks?"
msgstr "Π”ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΠΈ ΠΌΡ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ sx Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π±Π΅Π· возмоТности сна?"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:303
msgid "Add some info about proper use of reference counts."
msgstr ""
"Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ использовании счСтчиков ссылок."

#. type: Title ==
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:308
#, no-wrap
msgid "Glossary"
msgstr "Глоссарий"

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:311
#, no-wrap
msgid "atomic"
msgstr "atomic (Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΉ)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:313
msgid ""
"An operation is atomic if all of its effects are visible to other CPUs "
"together when the proper access protocol is followed. In the degenerate case "
"are atomic instructions provided directly by machine architectures. At a "
"higher level, if several members of a structure are protected by a lock, "
"then a set of operations are atomic if they are all performed while holding "
"the lock without releasing the lock in between any of the operations."
msgstr ""
"ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ являСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ, Ссли всС Π΅Ρ‘ эффСкты Π²ΠΈΠ΄Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссорам "
"ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΈ соблюдСнии ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° доступа. Π’ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ "
"случаС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ инструкции ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ нСпосрСдствСнно Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ "
"процСссора. На Π±ΠΎΠ»Π΅Π΅ высоком ΡƒΡ€ΠΎΠ²Π½Π΅, Ссли нСсколько элСмСнтов структуры "
"Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ, Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ являСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ, Ссли всС ΠΎΠ½ΠΈ "
"Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π±Π΅Π· Π΅Ρ‘ освобоТдСния ΠΌΠ΅ΠΆΠ΄Ρƒ Π»ΡŽΠ±Ρ‹ΠΌΠΈ ΠΈΠ· "
"ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:315
msgid "See Also operation."
msgstr "Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅ operation (опСрация)."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:316
#, no-wrap
msgid "block"
msgstr "block (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:318
msgid ""
"A thread is blocked when it is waiting on a lock, resource, or condition. "
"Unfortunately this term is a bit overloaded as a result."
msgstr ""
"ΠŸΠΎΡ‚ΠΎΠΊ блокируСтся, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, рСсурс ΠΈΠ»ΠΈ условиС. К "
"соТалСнию, этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:320
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:357
msgid "See Also sleep."
msgstr "Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅ sleep (ΡΠΏΠ°Ρ‚ΡŒ)."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:321
#, no-wrap
msgid "critical section"
msgstr "critical section (критичСская сСкция)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:323
msgid ""
"A section of code that is not allowed to be preempted. A critical section is "
"entered and exited using the man:critical_enter[9] API."
msgstr ""
"Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вытСснСн. ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ сСкция начинаСтся "
"ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с использованиСм API man:critical_enter[9]."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:324
#, no-wrap
msgid "MD"
msgstr "MD"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:326
msgid "Machine dependent."
msgstr "ΠœΠ°ΡˆΠΈΠ½ΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΡ‹ΠΉ (machine dependent)."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:328
msgid "See Also MI."
msgstr "Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ MI."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:329
#, no-wrap
msgid "memory operation"
msgstr "memory operation (опСрация с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:331
msgid "A memory operation reads and/or writes to a memory location."
msgstr "ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ выполняСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ/ΠΈΠ»ΠΈ запись Π² ячСйку памяти."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:332
#, no-wrap
msgid "MI"
msgstr "MI"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:334
msgid "Machine independent."
msgstr "ΠœΠ°ΡˆΠΈΠ½ΠΎΠ½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡ‹ΠΉ (machine independent)."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:336
msgid "See Also MD."
msgstr "Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅ MD."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:337
#, no-wrap
msgid "operation"
msgstr "operation (опСрация)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:339
msgid "See memory operation."
msgstr "Π‘ΠΌ. memory operation (опСрация с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ)."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:340
#, no-wrap
msgid "primary interrupt context"
msgstr "primary interrupt context (основной контСкст прСрывания)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:342
msgid ""
"Primary interrupt context refers to the code that runs when an interrupt "
"occurs. This code can either run an interrupt handler directly or schedule "
"an asynchronous interrupt thread to execute the interrupt handlers for a "
"given interrupt source."
msgstr ""
"Основной контСкст прСрывания относится ΠΊ ΠΊΠΎΠ΄Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся ΠΏΡ€ΠΈ "
"Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ прСрывания. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈΠ±ΠΎ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ "
"прСрывания, Π»ΠΈΠ±ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ асинхронного ΠΏΠΎΡ‚ΠΎΠΊΠ° прСрывания для "
"ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠ³ΠΎ источника."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:343
#, no-wrap
msgid "realtime kernel thread"
msgstr "realtime kernel thread (ΠΏΠΎΡ‚ΠΎΠΊ ядра Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:345
msgid ""
"A high priority kernel thread. Currently, the only realtime priority kernel "
"threads are interrupt threads."
msgstr ""
"ВысокоприоритСтный ΠΏΠΎΡ‚ΠΎΠΊ ядра. Π’ настоящСС врСмя СдинствСнными ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ядра "
"с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:347
msgid "See Also thread."
msgstr "Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅ thread (ΠΏΠΎΡ‚ΠΎΠΊ)."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:348
#, no-wrap
msgid "sleep"
msgstr "sleep (ΡΠΏΠ°Ρ‚ΡŒ)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:350
msgid ""
"A thread is asleep when it is blocked on a condition variable or a sleep "
"queue via msleep or tsleep."
msgstr ""
"ΠŸΠΎΡ‚ΠΎΠΊ находится Π² состоянии сна, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° условной "
"ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сна Ρ‡Π΅Ρ€Π΅Π· `msleep` ΠΈΠ»ΠΈ `tsleep`."

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:352
msgid "See Also block."
msgstr "Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅ block (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ)."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:353
#, no-wrap
msgid "sleepable lock"
msgstr "sleepable lock (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ сна)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:355
msgid ""
"A sleepable lock is a lock that can be held by a thread which is asleep. "
"Lockmgr locks and sx locks are currently the only sleepable locks in "
"FreeBSD. Eventually, some sx locks such as the allproc and proctree locks "
"may become non-sleepable locks."
msgstr ""
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ сна β€” это Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ "
"ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, находящимся Π² состоянии сна. Π’ настоящСС врСмя Π² FreeBSD "
"СдинствСнными Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ сна ΡΠ²Π»ΡΡŽΡ‚ΡΡ lockmgr ΠΈ sx. Π’ "
"Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ sx-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ allproc ΠΈ proctree, ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‚Π°Ρ‚ΡŒ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ сна."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:358
#, no-wrap
msgid "thread"
msgstr "thread (ΠΏΠΎΡ‚ΠΎΠΊ)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:360
msgid ""
"A kernel thread represented by a struct thread. Threads own locks and hold a "
"single execution context."
msgstr ""
"ΠŸΠΎΡ‚ΠΎΠΊ ядра, прСдставлСнный структурой `struct thread`. ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π²Π»Π°Π΄Π΅ΡŽΡ‚ "
"Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΈ содСрТат СдинствСнный Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ контСкст выполнСния."

#. type: Labeled list
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:361
#, no-wrap
msgid "wait channel"
msgstr "wait channel (канал оТидания)"

#. type: Plain text
#: documentation/content/en/books/arch-handbook/smp/_index.adoc:363
msgid "A kernel virtual address that threads may sleep on."
msgstr ""
"Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс ядра, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания."