Процеси і нитки

Загальне поняття процесу, розглянуте вище в п. 4.2.1, для ОС Windows як би розпадається на два поняття: власне процесу та нитки (thread; в деяких книгах використовується термін потік). При цьому нитка є одиницею роботи, вона бере участь в конкуренції за процесорний час, змінює свій стан і пріоритет, як було описано вище для процесу. Що ж стосується процесу в Windows, то він може складатися з декількох ниток, які використовують спільну пам'ять відкриті файли та інші ресурси, що належать процесові. У двох словах: процес - володіє (пам'яттю, файлами), нитки - працюють, при цьому спільно використовуючи ресурси свого процесу. Правда, нитка теж дечим володіє: вікнами, чергою повідомлень, стеком.

Процес створюється при запуску програми (EXE-файлу). Одночасно створюється одна нитка процесу (повинен же хтось працювати!). Створення процесу виконується за допомогою API-функції CreateProcess. Основними параметрами при виклику цієї функції є наступні.

· Ім'я файлу запускається програми.

· Командний рядок, передана процесу при запуску.

· Атрибути захисту для створюваних процесу і нитки. І процес, і нитка є об'єктами ядра Windows і в цій якості можуть бути захищені від несанкціонованого доступу (наприклад, від спроб інших процесів втрутитися в роботу даного процесу).

· Різні прапори, уточнюючі режим створення процесу. Серед них слід відзначити клас пріоритету процесу, прапор отладочного режиму (при цьому система буде повідомляти процес-батько про дії породженого процесу), а також прапор створення припиненого процесу, який не почне працювати, поки не буде викликана функція відновлення роботи.

· Блок середовища процесу.

· Поточний каталог процесу.

· Параметри першого вікна, яке буде відкрито при запуску процесу.

· Адреса блоку інформації, через який функція повертає батьківському процесові чотири числа: ідентифікатор створеного процесу, ідентифікатор нитки, хендл процесу і хендл нитки.

Якщо процес успішно створений, функція CreateProcess повертає ненульове значення.

Клас пріоритету процесу використовується при визначенні пріоритетів його ниток. Докладніше про це в п. 4.5.3.

Хендл об'єкта ядра Windows (в даному випадку процесу або нитки) дозволяє виконувати різні операції з цим об'єктом. Докладніше про хендл та ідентифікаторах див. п. 4.5.4.

Після створення процесу його єдина нитка починає виконувати програму процесу, працюючи паралельно з нитками інших запущених процесів. Якщо логіка роботи програми передбачає паралельне виконання яких-небудь дій в рамках одного процесу, то можуть бути створені додаткові нитки. Для цього використовується функція CreateThread. Її основні параметри наступні:

· Атрибути захисту для створюваної нитки;

· Розмір стека нитки;

· Стартовий адресу нитки (зазвичай нитка зв'язується з виконанням однієї з функцій, описаних у програмі процесу, при цьому в якості стартового адреси вказується ім'я функції);

· Параметр-покажчик, що дозволяє передати нитки при запуску деяке значення в якості аргументу;

· Прапор створення нитки в припиненому стані;

· Покажчик на змінну, в якій функція повинна повернути ідентифікатор створеної нитки.

Значенням функції CreateThread є хендл створеної нитки або NULL, якщо створити нитку не вдалося.

Прекрасним прикладом багатонитковою програми є Microsoft Word. У той час як основна нитка обробляє введення з клавіатури, окрема нитку може динамічно розраховувати розбиття тексту на сторінки, ще одна нитка може в цей же час виконувати друк документа або його збереження.

 

Для завершення роботи нитки використовується виклик функції ExitThread. Для завершення роботи всього процесу будь-яка з його ниток може викликати функцію ExitProcess. Єдиним параметром кожної з цих функцій є код завершення нитки або процесу.

Завершення процесу призводить до звільнення всіх ресурсів, якими володів процес: пам'яті, відкритих файлів і т.п.

При завершенні процесу завершуються всі його нитки. І навпаки, при завершенні останньої нитки процесу завершується і сам процес.

Не надто широко відомо, що нитка не є самою дрібною одиницею організації обчислень. Насправді Windows дозволяє створити усередині нитки кілька волокон (fiber), які в звичайній термінології можуть бути описані як співпрограми або як завдання з невитесняющей диспетчеризацією, що працюють в рамках однієї і тієї ж задачі з витісняючої диспетчеризацією. Перемикання волокон виконується тільки явно, за допомогою функції SwitchToFiber. Про використання співпрограми см. / 15 /.