<<
>>

Пулы потоков и планирование в пользовательском режиме

Пул потоков Win32 является надстройкой над моделью потоков Windows, предоставляющей более удачную абстракцию для определенного типа программ. Создание потока обходится слишком дорого, если обращаться к нему при каждом требовании программы выполнить небольшую задачу в параллель с другими задачами, чтобы использовать преимущества нескольких процессоров.
Задачи могут быть сгруппированы в более крупные задачи, но это сократит объем используемого в программе параллелизма. Альтернативным подходом для программы будет выделение ограниченного количества потоков и поддержка очереди задач, требующих выполнения. Как только поток завершит выполнение задачи, он берет из очереди следующую задачу. Эта модель отделяет вопросы управления ресурсами (сколько процессоров доступно и сколько потоков должно быть создано) от модели программирования (что собой представляет задача и как задачи синхронизируются). В Windows это решение оформлено в пул потоков Win32, набор API-функций для автоматического управления динамическим пулом потоков и в отправление ему задач.

Пулы потоков не являются идеальным решением, поскольку при блокировании потока на каком-нибудь ресурсе в середине задачи он не может переключиться на другую задачу. Таким образом, пул потоков неминуемо будет создавать больше потоков, чем имеется процессоров, чтобы при блокировке одних потоков могли быть спланированы другие, готовые к выполнению потоки. Пул потоков интегрирован со многими обычными механизмами синхронизации, такими как ожидание завершения ввода-вывода или блокирование до тех пор, пока не поступит сигнал от события ядра. Синхронизация может использоваться в качестве инициатора для ведения очереди задач, чтобы потокам не назначалась задача до того, как она будет готова к запуску.

В реализации пула потоков используется тот же самый механизм очередей, который предоставляется для синхронизации с завершением ввода-вывода, вместе с фабрикой потоков режима ядра, которая по мере необходимости добавляет потоки процессу, обеспечивая занятость доступных процессоров.

Небольшие задачи бывают во многих приложениях, но особенно часто они попадаются в тех приложениях, которые предоставляют службы в клиент-серверной модели вычислений, где один за другим слудуют запросы, отправляемые клиентом серверу. Использование пула потоков для таких сценариев повышает эффективность системы за счет сокращения издержек на создание потоков и перемещения принятия решений по управлению потоками в пуле за пределы приложения в операционную систему.

Программисты видят, как один 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. Основные концепции, используемые для управления процессором и ресурсами

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Пулы потоков и планирование в пользовательском режиме:

  1. коян: Восходящий узел - включение в общий поток; Нисходящий узел - исключение из общего потока.
  2. Планирование телепередач
  3. Планирование, а не планы
  4. 11. КРИМИНАЛИСТИЧЕСКИЕ ВЕРСИИ И ПЛАНИРОВАНИЕ РАССЛЕДОВАНИЯ
  5. § 2. ПЛАНИРОВАНИЕ И СОДЕРЖАНИЕ НАБЛЮДЕНИЯ
  6. Альбатрос (восхождение на поток)
  7. ТЕОРИЯ ПОТОКА СОЗНАНИЯ
  8. 10.2. Планирование и организация следственных действий
  9. 3.9. ПОТОК СОЗНАНИЯ
  10. ПОТОК СОЗНАНИЯ
  11. 2.2.1. Поток образов
  12. 5.4. Планирование упражнений