
170 Глава 3. Процессы
потоков выполнения пользовательского уровня, предоставляющего приложени-
ям операции по созданию и уничтожению потоков выполнения. Кроме того, этот
пакет предоставляет средства синхронизации потоков выполнения, такие как мью-
тексы и условные переменные (см. также раздел 1.4). Важным моментом здесь
является то, что пакет для работы с потоками выполнения реализован целиком
в пространстве пользователя. Другими словами, все операции с потоками выпол-
нения производятся без участия ядра.
Как показано на рисунке, пакет потоков выполнения может совместно ис-
пользоваться несколькими облегченными процессами. Многопоточное приложе-
ние реализуется путем создания потоков выполнения с последующим назна-
чением каждого из них своему облегченному процессу. Назначение потока
выполнения облегченному процессу обычно производится неявно и скрыто от
программиста.
Сочетание потоков выполнения пользовательского уровня и облегченных
процессов работает так, как показано на рисунке. Подключение следующего по-
тока выполняется специальной планирующей процедурой, входящей в пакет пото-
ков.
При создании (путем срютемного вызова) облегченного процесса он получает
собственный стек и указание выполнить планирующую процедуру д.яя поиска
потока, который он должен исполнять. Если создается несколько облегченных
процессов, планирующую процедуру выполняет каждый из них. Таблица потоков
выполнения, предназначенная для отслеживания их текущего набора, использу-
ется облегченными процессами совместно. Защита этой таблицы для предотвра-
щения одновременного доступа к ней реализуется при помощи мьютексов, соз-
даваемых в пространстве пользователя. Иначе говоря, синхронизация между
облегченными процессами не требует поддержки со стороны ядра.
Когда облегченный процесс находит готовый к выполнению поток, он пе-
реключает свой контекст на этот поток. В это время другие облегченные про-
цессы могут искать себе другие готовые к выполнению потоки. Если поток
выполнения требуется заблокировать по значению мьютекса или условной пе-
ременной, он выполняет необходимое администрирование и, в конце концов,
вызывает планирующую процедуру. Если будет обнаружен другой готовый к
выполнению поток, контекст может переключиться на него. Прелесть всего
этого состоит в том, что облегченный процесс, выполняющий поток, не уведом-
ляется о переключении контекста, оно происходит исключительно в простран-
стве пользователя и воспринимается облегченным процессом как обычный код
программы.
Рассмотрим теперь, что происходит, когда поток делает блокирующий сис-
темный вызов. В этом случае выполнение переходит от пользовательского режима
к режиму ядра, продолжая при этом оставаться в контексте текущего облегчен-
ного процесса. В тот момент, когда текущий облегченный процесс можно будет
прервать, операционная система может принять решение переключиться на дру-
гой облегченный процесс, в результате чего контекст переключится обратно
в пользовательский режим. Выбранный облегченный процесс просто продолжит
свою работу с того места, где он ранее был прерван.