Загальне поняття процесу, розглянуте вище в п. 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 /.