Пулы потоков и планирование в пользовательском режиме
Пулы потоков не являются идеальным решением, поскольку при блокировании потока на каком-нибудь ресурсе в середине задачи он не может переключиться на другую задачу. Таким образом, пул потоков неминуемо будет создавать больше потоков, чем имеется процессоров, чтобы при блокировке одних потоков могли быть спланированы другие, готовые к выполнению потоки. Пул потоков интегрирован со многими обычными механизмами синхронизации, такими как ожидание завершения ввода-вывода или блокирование до тех пор, пока не поступит сигнал от события ядра. Синхронизация может использоваться в качестве инициатора для ведения очереди задач, чтобы потокам не назначалась задача до того, как она будет готова к запуску.
В реализации пула потоков используется тот же самый механизм очередей, который предоставляется для синхронизации с завершением ввода-вывода, вместе с фабрикой потоков режима ядра, которая по мере необходимости добавляет потоки процессу, обеспечивая занятость доступных процессоров.
Небольшие задачи бывают во многих приложениях, но особенно часто они попадаются в тех приложениях, которые предоставляют службы в клиент-серверной модели вычислений, где один за другим слудуют запросы, отправляемые клиентом серверу. Использование пула потоков для таких сценариев повышает эффективность системы за счет сокращения издержек на создание потоков и перемещения принятия решений по управлению потоками в пуле за пределы приложения в операционную систему.Программисты видят, как один Windows-поток фактически представляет собой два потока: запускаемый в режиме ядра и запускаемый в пользовательском режиме. Точно такая же модель имеется и в UNIX. Каждому из этих потоков выделяются его собственный стек и его собственная память для хранения его регистров, когда он не выполняется. Два потока оказываются одним потоком, потому что они не работают в одно и то же время. Поток пользовательского режима работает в качестве расширения потока режима ядра, запускаемого, только когда поток ядра переключается на него, возвращаясь из режима ядра в пользовательский режим. Когда поток пользовательского режима хочет выполнить системный вызов, столкнувшись с ошибкой отсутствия страницы или вытеснением, система входит в режим ядра и переключается обратно на соответствующий поток ядра. Обычно невозможно переключаться между потоками в пользовательском режиме без предварительного переключения на соответствующий поток режима ядра, переключения на новый поток режима ядра, а затем переключения на его поток пользовательского режима.
Большую часть времени разница между потоками пользовательского режима и режима ядра не заметна программисту. Но в Windows 7 Microsoft добавила средство под названием UMS (User-Mode Scheduling — планирование в пользовательском режиме), которое выставляет разницу напоказ. Планировщик UMS похож на те средства, которые используются в других операционных системах, например на scheduler activations (планировщик активаций). Он может использоваться для переключения между потоками пользовательского режима без предварительного входа в ядро, предоставляя преимущества волокон, но с намного лучшей интеграцией в Win32, поскольку здесь используются настоящие потоки Win32.
В реализации UMS имеются три основных элемента:
1. Переключение в пользовательском режиме: планировщик пользовательского режима может быть написан для переключения между пользовательскими потоками без входа в ядро. Когда пользовательский поток входит в режим ядра, UMS найдет соответствующий поток ядра и немедленно на него переключится.
2. Возобновление работы планировщика в пользовательском режиме: когда выполнение потока ядра блокируется в ожидании доступности ресурса, UMS переключается на специальный пользовательский поток и выполняет код планировщика в пользовательском режиме, чтобы другой пользовательский поток мог быть спланирован для запуска на текущем процессоре. Это позволяет текущему процессу продолжить использование текущего процессора по полной программе и не вставать в очередь за другими процессами, когда один из его потоков блокируется.
3. Завершение системного вызова: после того как заблокированный поток ядра наконец-то завершит свое выполнение, уведомление с результатами системного вызова будет поставлено в очередь планировшика в пользовательском режиме и он сможет переключиться на соответствующий пользовательский поток, когда будет принимать очередное решение о планировании.
UMS не включает планировщик в пользовательском режиме в качестве составной части Windows. UMS применяется в качестве низкоуровневого механизма для использования библиотеками времени выполнения, приложениями языка программирования и сервера для реализации легких потоковых моделей, не конфликтующих с планированием потоков в режиме ядра. Эти библиотеки времени выполнения обычно реализуют планировщик в пользовательском режиме, который в большей степени подходит к их среде.
Краткая сводка по данным абстракциям приведена в табл. 11.11.
Таблица 11.11. Основные концепции, используемые для управления процессором и ресурсами
Еще по теме Пулы потоков и планирование в пользовательском режиме:
- коян: Восходящий узел - включение в общий поток; Нисходящий узел - исключение из общего потока.
- Планирование телепередач
- Планирование, а не планы
- 11. КРИМИНАЛИСТИЧЕСКИЕ ВЕРСИИ И ПЛАНИРОВАНИЕ РАССЛЕДОВАНИЯ
- § 2. ПЛАНИРОВАНИЕ И СОДЕРЖАНИЕ НАБЛЮДЕНИЯ
- Альбатрос (восхождение на поток)
- ТЕОРИЯ ПОТОКА СОЗНАНИЯ
- 10.2. Планирование и организация следственных действий
- 3.9. ПОТОК СОЗНАНИЯ
- ПОТОК СОЗНАНИЯ
- 2.2.1. Поток образов
- 5.4. Планирование упражнений