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 "" "ΠΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ ΡΠ΄ΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ."