Процеси і нитки - студопедія
Загальне поняття процесу, розглянуте вище в п. 4.2.1, для ОС Windows як би розпадається на два поняття: власне процесу і нитки (thread; в деяких книгах використовується термін потік). При цьому нитка є одиницею роботи, вона бере участь в конкуренції за процесорний час, змінює свій стан і пріоритет, як було описано вище для процесу. Що ж стосується процесу в Windows, то він може складатися з декількох ниток, які використовують спільну пам'ять, відкриті файли і інші ресурси, що належать процесу. У двох словах: процес - володіє (пам'яттю, файлами), нитки - працюють, при цьому спільно використовуючи ресурси свого процесу. Правда, нитка теж чимось володіє: вікнами, чергою повідомлень, стеком.
Процес створюється при запуску програми (EXE-файлу). Одночасно створюється одна нитка процесу (повинен же хтось працювати!). Створення процесу виконується за допомогою API-функції CreateProcess. Основними параметрами при виклику цієї функції є наступні.
· Файл запускається програми.
· Командний рядок, що передається процесу при запуску.
· Атрибути захисту для створюваних процесу і нитки. І процес, і нитка є об'єктами ядра Windows і в цій якості можуть бути захищені від несанкціонованого доступу (наприклад, від спроб інших процесів втрутитися в роботу даного процесу).
· Різні прапори, уточнюючі режим створення процесу. Серед них слід відзначити клас пріоритету процесу, прапор отладочного режиму (при цьому система буде повідомляти процес-батько про дії породженого процесу), а також прапор створення призупиненого процесу, який не почне працювати, поки не буде викликана функція відновлення роботи.
· Блок середовища процесу.
· Поточний каталог процесу.
· Параметри першого вікна, яке буде відкрито при запуску процесу.
Якщо процес успішно створений, функція CreateProcess повертає нульове значення.
Після створення процесу його єдина нитка починає виконувати програму процесу, працюючи паралельно з нитками інших запущених процесів. Якщо логіка роботи програми передбачає паралельне виконання будь-яких дій в рамках одного процесу, то можуть бути створені додаткові нитки. Для цього використовується функція CreateThread. Її основні параметри такі:
· Атрибути захисту для створюваної нитки;
· Розмір стека нитки;
· Параметр-покажчик, що дозволяє передати нитки при запуску деяке значення як аргумент;
· Прапор створення нитки в загальмованому стані;
· Покажчик на змінну, в якій функція повинна повернути ідентифікатор створеної нитки.
Значенням функції CreateThread є хендл створеної нитки або NULL, якщо створити нитку не вдалося.
Прекрасним прикладом багатонитковою програми є Microsoft Word. У той час як основна нитка обробляє введення з клавіатури, окрема нитка може динамічно розраховувати розбиття тексту на сторінки, ще одна нитка може в цей же час виконувати друк документа або його збереження.
Для завершення роботи нитки використовується виклик функції ExitThread. Для завершення роботи всього процесу будь-яка з його ниток може викликати функцію ExitProcess. Єдиним параметром кожної з цих функцій є код завершення нитки або процесу.
Завершення процесу призводить до звільнення всіх ресурсів, якими володів процес: пам'яті, відкритих файлів і т.п.
При завершенні процесу завершуються всі його нитки. І навпаки, при завершенні останньої нитки процесу завершується і сам процес.
Чи не занадто широко відомо, що нитка не є найдрібнішої одиницею організації обчислень. Насправді Windows дозволяє створити всередині нитки кілька волокон (fiber), які в звичайній термінології можуть бути описані як співпрограми або як завдання з невитискаючої диспетчеризацией, що працюють в рамках однієї і тієї ж задачі з витісняє диспетчеризацией. Перемикання волокон виконується тільки явно, за допомогою функції SwitchToFiber. Про використання співпрограми см. / Помилка! Джерело посилання не знайдено. /.
Завданням планувальника є вибір чергової нитки для виконання. Планувальник викликається в трьох випадках:
· Якщо закінчується квант часу, виділений поточної нитки;
· Якщо поточна нитка викликала блокує функцію (наприклад, WaitForMultipleObjects або ReadFile) і перейшла в стан очікування;
· Якщо нитка з більш високим пріоритетом прокинулася від очікування або була тільки що запущена.
Для вибору нитки використовується алгоритм пріоритетною черзі. Для кожного рівня пріоритету система веде чергу активних ниток (тобто ниток, які перебувають у стані готовності). Для виконання вибирається чергова нитка з непорожній черги з найвищим пріоритетом.
Черги активних ниток поповнюються за рахунок ниток, що прокинулися після стану очікування і ниток, витіснених планувальником. Як правило, нитка поміщається в кінець черги. Виняток робиться для нитки, витісненої до закінчення її кванта часу більш пріоритетною ниткою. Така «скривджена» нитка ставиться в голову черги.
Значення кванта часу для серверних установок Windows одно зазвичай 120 мс, для робочих станцій - 20 мс.
Як ви думаєте, чому для серверів квант часу більше?
Всі рівні пріоритету ниток пронумеровані від 0 (найнижчий пріоритет) до 31 (найвищий). Рівні від 16 до 31 називаються пріоритетами реального часу. вони призначені для виконання критичних за часом системних операцій. Тільки сама система або користувач з правами адміністратора можуть використовувати пріоритети з цієї групи. Рівні від 0 до 15 називаються динамічними пріоритетами.
У Windows використовується двоступенева схема призначення пріоритетів. При створенні процесу йому призначається (а згодом може бути змінений самою програмою або користувачем) один з чотирьох класів пріоритету. з кожним з яких пов'язано базове значення пріоритету:
· Realtime (базовий пріоритет 24) - вищий клас пріоритету, допустимий тільки для системних процесів, які займають процесор на дуже короткий час;
· High (базовий пріоритет 13) - клас високопріоритетних процесів;
· Normal (базовий пріоритет 8) - звичайний клас пріоритету, до якого належить більшість що запускаються прикладних процесів;
· Idle (базовий пріоритет 4) - нижчий (буквально - «холостий» або «простоює») клас пріоритету, характерний для екранних заставок, моніторів продуктивності та інших програм, які не повинні заважати жити більш важливим програмам.
Власне пріоритет пов'язується не з процесом, а з кожної його ниткою. Пріоритет нитки визначається базовим пріоритетом процесу, до якого додається відносний пріоритет нитки - величина від -2 до +2. Відносний пріоритет призначається нитки при її створенні і може при необхідності змінюватися. Є також можливість призначити нитки критичний пріоритет (31 для процесів реального часу, 15 для інших) або холостий пріоритет (16 для процесів реального часу, 0 для інших).
Для ниток процесів реального часу пріоритети є статичними в тому сенсі, що система не намагається їх змінювати на свій розсуд. Передбачається, що для цієї групи процесів співвідношення пріоритетів має бути саме таким, як задумав програміст.
Для процесів трьох нижчих класів їх пріоритети не випадково називаються динамічними. Планувальник може змінювати пріоритети, а заодно і кванти часу для ниток в ході їх виконання, щоб досягти більш справедливого розподілу процесорного часу. Правила зміни динамічних пріоритетів наступні.
· Коли заблокована нитка дочекалася потрібного їй події, до пріоритету нитки додається величина, що залежить від причини очікування. Ця надбавка може досягати 6 одиниць (але пріоритет не повинен перевищити 15), якщо нитка розблокована внаслідок натискання клавіші або кнопки миші. Таким способом система прагне зменшити час реакції на дії користувача. Всякий раз, коли нитка повністю використовує свій квант часу, надбавка зменшується на 1, поки пріоритет нитки не повернеться до свого заданого значення.
· Якщо нитка володіє вікном переднього плану (тобто тим, з яким працює користувач), то заради зменшення часу реакції планувальник може збільшити квант часу для цієї нитки з 20 мс до 40 або 60 мс, в залежності від налаштувань системи.
· Якщо планувальник виявляє, що деяка нитка перебуває в черзі понад 3 с, то він підвищує її пріоритет аж до 15 і подвоює її квант. Але ця благодійність разова: коли Попелюшка-нить витратить збільшений квант або заблокується, її пріоритет і квант повертаються до колишніх значень. Сенс акції зрозумілий: система намагається забезпечити хоч якесь просування навіть для фонових ниток.