Системні робочі потоки - еннее пристрій windows (гл

Системні робочі потоки

При ініціалізації Windows створює кілька потоків в процесі System, які називаються системними робочими потоками (system worker threads). Вони призначені виключно для виконання роботи за дорученням інших потоків. Bo багатьох випадках потоки, що виконуються на рівні «DPC / dispatch», потребують виклику таких функцій, які можуть бути викликані тільки при більш низькому IRQL. Наприклад, DPC-процедурі, виконуваної в контексті довільного потоку при IRQL рівня «DPC / dispatch» (DPC може узурпувати будь-який потік в системі), потрібно звернутися до пулу підкачувати пам'яті або чекати на об'єкті диспетчера для синхронізації з потоком будь-якої програми. Оскільки DPC-процедура не може знизити IRQL, вона повинна передати своє завдання потоку, який зможе виконати її при IRQL нижче рівня «DPC / dispatch».

Деякі драйвери пристроїв і компоненти виконавчої системи створюють власні потоки для обробки даних на рівні «passive», але більшість натомість використовує системні робочі потоки, що допомагає уникнути занадто частого перемикання потоків і надмірного навантаження на пам'ять через диспетчеризації додаткових потоків. Драйвер пристрою або компонент виконавчої системи запитує сервіси системних робочих потоків через функцію виконавчої системи ExQueueWorkItem або IoQueueWorkItem. Ці функції поміщають робочий елемент (work item) в спеціальну чергу, перевіряється системними робочими потоками (див. Розділ «Порти завершення введення-виведення» глави 9).

Робочий елемент включає покажчик на процедуру і параметр, який передається потоком цій процедурі при обробці робочого елемента. Процедура реалізується драйвером пристрою або компонентом виконавчої системи, виконуваних на рівні «passive».

Наприклад, DPC-процедура, яка повинна чекати на об'єкті диспетчера, може звернутися до робочий елемент, який вказує на процедуру в драйвері, що чекає на об'єкті диспетчера, і, можливо, на покажчик на об'єкт. Ha якомусь етапі системний робочий потік витягує зі своєї черги робочий елемент і виконує процедуру драйвера. Після її виконання системний робочий потік перевіряє, чи немає ще робочих елементів, що підлягають обробці. Якщо немає, системний робочий потік блокується, поки в черга не буде поміщений новий робочий елемент. Виконання DPC-процедури може і не закінчитися в ході обробки її робочого елемента системним робочим потоком. (B однопроцессорной системі виконання цієї процедури завжди завершується до обробки її робочого елемента, так як на рівні IRQL «DPC / dispatch» потоки не плануються.)

Існує три типи системних робочих потоків:

• відкладені (delayed worker threads) - виконуються з пріоритетом 12, обробляють некритичні за часом робочі елементи і допускають вивантаження свого стека в сторінковий файл на час очікування робочих елементів;

• критичні (critical worker threads) - виконуються з пріоритетом 13, обробляють критичні за часом робочі елементи. B Windows Server їх стек завжди знаходиться тільки у фізичній пам'яті;

• гіперкрітічний (hypercritical worker thread) - єдиний потік, що виконується з пріоритетом 15. Його стек теж завжди знаходиться в пам'яті. Диспетчер процесів використовує гіперкрітічние за часом робочі елементи для виконання функції, що звільняє завершення потоки.

Число відкладених і критичних системних робочих потоків, створюваних функцією виконавчої системи ExpWorkerInitialization, яка викликається на ранніх стадіях процесу завантаження, залежить від обсягу пам'яті в системі і від того, чи є система сервером. B таблиці 3-11 показано кількість потоків, спочатку створюваних в системах з різною конфігурацією. Ви можете вказати ExpInitializeWorker створити додатково до 16 відкладених і 16 критичних системних робочих потоків. Для цього використовуйте параметри AdditionalDelayedWorkerThreads і AdditionalCri-ticalWorkerThreads в розділі реєстру HKLM \ SYSTEM \ CurrentControlSet \ Cont-rol \ Session Manager \ Executive.

Виконавча система намагається балансувати число критичних системних робочих потоків відповідно до поточної робочої навантаженням. Кожну секунду функція виконавчої системи ExpWorkerThreadBalanceManager перевіряє, чи треба створювати новий критичний робочий потік. До речі, критичний робочий потік, створюваний функцією ExpWorkerTbread-BalanceManager, називається динамічним (dynamic worker thread). Для створення такого потоку повинні бути виконані наступні умови.

• Черга критичних робочих елементів не повинна бути порожньою.

• Число неактивних критичних потоків (блокованих в очікуванні робочих елементів або на об'єктах диспетчера при виконанні робочої процедури) має бути менше кількості процесорів в системі.

• B системі повинно бути менше 16 динамічних робочих потоків.

Динамічні потоки завершуються через 10 хвилин перебування в неактивному стані. B залежності від робочого навантаження виконавча система може створювати до 16 таких потоків.

Системні робочі потоки - еннее пристрій windows (гл