Процес (інформатика)

Матеріал з Вікіпедії — вільної енциклопедії.
(Перенаправлено з Процес (програмування))
Перейти до навігації Перейти до пошуку
Процес та його ресурси

Процес — одне з найважливіших понять у архітектурі операційних систем та програмуванні. Процес — об'єкт операційної системи, контейнер системних ресурсів, призначених для підтримки виконання програми. Коли в середовищі операційної системи запускається прикладна програма, система створює спеціальний об’єкт – процес, – який призначений для підтримки її виконання. Хоча може здатися, що програма й процес – поняття схожі, вони фундаментально відрізняються. Програма – це статичний набір команд, а процес – контейнер для ресурсів, які використовуються при виконанні екземпляра програми[1]. Системна реалізація та функції процесу в різних операційних системах дещо відмінні.

Структура процесу у Windows[ред. | ред. код]

На найвищому рівні абстракції процес у Windows містить[2][3]:

  • закритий віртуальний адресний простір – діапазон адрес віртуальної пам'яті, яким може користуватися процес;
  • програму, що виконується – початковий код і спроектовані на віртуальний адресний простір процесу дані;
  • список відкритих дескрипторів (handles) різних системних ресурсів –комунікаційних портів, файлів та інших об'єктів, доступних усім потокам даного процесу;
  • контекст захисту (security context), який називають маркером доступу (access token), – він ідентифікує користувача та групи безпеки й привілеї, зіставлені з процесом;
  • унікальний ідентифікатор процесу;
  • мінімум один потік.

Найважливішою складовою частиною процесу є потік. Процес як системний об'єкт призначений для "обслуговування" потоків. Сам по собі процес не виконує ніяких дій, для цього призначений потік. Крім закритого адресного простору й одного або кількох потоків, у кожного процесу є ідентифікатор захисту і список відкритих дескрипторів об'єктів (файли, розділи загальної пам'яті), або синхронізуючих об'єктів – м’ютексів, подій і семафорів. Кожен процес має контекст захисту, який зберігається в об'єкті – маркері доступу. Маркер доступу містить ідентифікацію захисту й визначає повноваження даного процесу. Дескриптори віртуальних адрес (virtual address descriptors, VAD) – це структури даних, які використовуються диспетчером пам'яті для обліку віртуальних адрес, задіяних процесом.

Загальні характеристики[ред. | ред. код]

Кожному процесу мають бути виділені певні системні ресурси, зокрема:

Кожен процес має «батька» (батьківський процес). Він також може мати (але не обов'язково) «нащадків» (дочірні процеси). В сукупності вони формують дерево процесів.

Керування процесами здійснює ядро операційної системи.

Пріоритет процесу[ред. | ред. код]

Процес має певний пріоритет, який впливає на кількість процесорного часу, який виділятиметься його потокам. У Windows кожен процес має один із таких класів пріоритету:

  • IDLE_PRIORITY_CLASS,
  • BELOW_NORMAL_PRIORITY_CLASS,
  • NORMAL_PRIORITY_CLASS,
  • ABOVE_NORMAL_PRIORITY_CLASS,
  • HIGH_PRIORITY_CLASS,
  • REALTIME_PRIORITY_CLASS.

За замовчуванням клас пріоритету процесу набуває значення NORMAL_PRIORITY_CLASS. При створенні процесу функцією CreateProcess можна задавати клас пріоритету. Для зміни класу пріоритету існуючого процесу використовується функція API SetPriorityClass, для визначення пріоритету існуючого процесу – функція GetPriorityClass. Процеси, якими керує система, можуть використовувати найнижчий IDLE_PRIORITY_CLASS, що запобігатиме конфлікту таких процесів із процесами вищого пріоритету. Якщо виконується потік процесу з класом HIGH_PRIORITY_CLASS, інші потоки в системі не отримуватимуть процесорного часу. Якщо кілька потоків одночасно мають такий пріоритет, вони втрачають свою ефективність. Клас найвищого пріоритету використовується для потоків, які повинні відповідати на найважливіші події. Якщо прикладна програма виконує завдання, яке потребує цього класу пріоритету, слід використовувати функцію SetPriorityClass для тимчасового підвищення класу пріоритету і відразу після виконання завдання відновлювати звичайний пріоритет. Інший спосіб для вирішення подібного завдання – створити процес високого пріоритету, всі потоки якого будуть блокованими більшість часу і тимчасово розблоковуватимуться при виникненні певної події. Клас пріоритету REALTIME_PRIORITY_CLASS припиняє виконання системних потоків, які керують вводом від миші, клавіатури та фоновим записом на диск, що може призвести до втрати даних або нефункціональності всієї системи. Цей клас може використовуватися для програм, які повинні працювати безпосередньо з апаратним забезпеченням або які виконують швидкі, обмежені в часі завдання.

Інформація, що зберігається у структурах даних процесу[ред. | ред. код]

Процес містить таку інформацію (список не повний):

  • командний рядок запуску виконуваного процесом застосунку;
  • інформація про відведений процесу адресний простір, включно зі стеком;
  • посилання на поточний робочий каталог і кореневий каталог процесу (останній служить для обмеження доступу процесу до файлової структури);
  • таблиця відкритих процесом файлів;
  • так зване оточення процесу, тобто перелік заданих для даного процесу змінних з їх поточними значеннями;
  • атрибути, що визначають права і привілеї процесу
  • таблиця обробників сигналів;
  • вказівка на батьківський процес;
  • призначена для користувача маска або маска доступу — вказівка на те, які права треба видалити при створенні нового файлу або каталогу із стандартного набору прав, присвоєних файлу (каталогу).
  • перелік потоків процесу (якщо операційна система підтримує багатопотоковість)

Робочий цикл процесу[ред. | ред. код]

Під час запуску процесу проходять такі стадії:

  • користувач з допомогою вказує програму, яку потрібно виконати
  • операційна система створює адресний простір для процесу і структури, які описують новий процес
  • заповнюються структури, які описують новий процес
  • з файлу, який містить виконавчий файл, в адресний простір процесу копіюються код і дані
  • встановлюється стан процесу «готовий до виконання»
  • новий процес додається до черги процесів, які очікують на процесор
  • керування повертається оболонці користувача

Створення процесу у Windows[ред. | ред. код]

Базовою функцією API для створення процесу є CreateProcess. Її заголовок за допомогою мови програмування Delphi описується так[3]:

function CreateProcess(
 lpApplicationName: PChar,   // ім'я виконавчого модуля
 lpCommandLine: PChar,       // рядок параметрів
 lpProcessAttributes: TSecurityAttributes, // структура процесу
                                           // SECURITY_ATTRIBUTES
 lpThreadAttributes: TSecurityAttributes,  // структура потоку
                                           // SECURITY_ATTRIBUTES
 bInheritHandles: LongBool,  // прапорець спадкування поточного процесу
 dwCreationFlags: Longword,  // прапорці способів створення процесу
 lpEnvironment: Pointer,     // вказівник на блок параметрів оточення
 lpCurrentDirectory: PChar,  // поточний диск і каталог
 lpStartupInfo:TStartupInfo, // структура STARTUPINFO 
 lpProcessInformation: TProcessInformation //структура PROCESS_INFORMATION 
): LongBool;
Головні етапи створення процесу

Основні етапи створення процесу функцією CreateProcess такі:

  1. Відкривається файл образу (ЕХЕ), що буде виконуватися в процесі.
  2. Створюється об'єкт "процес" виконавчої системи.
  3. Створюється первинний потік (стек, контекст і об'єкт "потік" виконавчої системи).
  4. Підсистема Windows повідомляється про створення нового процесу й потоку.
  5. Починається виконання первинного потоку (якщо не зазначено прапорець CREATE_SUSPENDED- створити "завислим").
  6. У контексті нового процесу й потоку ініціалізується адресний простір (наприклад, завантажуються необхідні DLL) і починається виконання програми.

Після створення процесу з ним співставляється унікальний глобальний системний ідентифікатор- ProcessID.

Приклад створення процесу[ред. | ред. код]

Мовою Delphi фрагмент коду, призначений для створення процесу, можна подати так[3]:

var SI : TStartupInfo;
    PI : TProcessInformation; 
 ...............................................
 FillChar(SI, Sizeof(SI), #0);
 SI.cb := SizeOf(SI);
 SI.dwX := 50;
 SI.dwY := 50;
 SI.dwFlags := STARTF_USEPOSITION;
 if not CreateProcess('APINewProcess.exe', nil, nil, nil, false,
   NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
     MessageBox(Wnd, 'Не вийшло створити процес.', , 
       MB_OK or MB_ICONERROR);
 .... Після закінчення роботи з процесом .......
 CloseHandle(PI.hThread);
 CloseHandle(PI.hProcess);

Доступ до процесу[ред. | ред. код]

Якщо необхідно працювати із зовнішнім процесом, потрібно спочатку відкрити дескриптор об’єкта процесу за допомогою функції OpenProcess. Ця функція за відомим ідентифікатором процесу повертає його дескриптор, який може використовуватися для маніпуляцій над процесом.

Завершення роботи процесу[ред. | ред. код]

  • Процес виконує останню інструкцію програми — повертає операційній системі код завершення. Якщо процес завершився нормально повертається значення 0, інакше повертається значення коду помилки.
  • операційна система встановлює стан процесу «завершений» і починає звільнення ресурсів, які були виділені процесу під час його виконання
  • операційна система по черзі завершує усі дочірні процеси даного
  • операційна система звільняє адресний простір процесу
  • операційна система усуває процес з черги готових процесів

Відслідковування процесів у Windows[ред. | ред. код]

Найвідоміша утиліта для аналізу активності процесів у Windows – системний Task Manager (диспетчер завдань). У ядрі Windows немає такого поняття, як завдання, тому Task Manager насправді є інструментом для керування процесами. Диспетчер завдань Windows відображає список активних процесів. Його можна запустити різними способами:

  1. Натиснувши комбінацію клавіш Ctrl+Shift+Esc;
  2. Клацнувши на панелі завдань правою кнопкою миші й вибравши команду Task Manager (диспетчер завдань);
  3. Натиснувши клавіші Ctrl+Alt+Del. Для перегляду списку процесів після запуску диспетчера завдань слід відкрити вкладку Processes (процеси). У цьому вікні процеси ідентифікуються за іменем образу, екземплярами якого вони є.

Якщо вкладка Processes вікна диспетчера завдань показує список процесів, то вміст вкладки Applications (застосунки) відображає список видимих вікон верхнього рівня всіх об'єктів "робочий стіл" інтерактивного об'єкта WindowStation. (За замовчуванням існують два об'єкти "робочий стіл", але можна створити додаткові робочі столи через Windows-функцію CreateDesktop). Стовпчик Status (стан) дає уявлення про те, чи перебуває потік-власник вікна в стані очікування повідомлення. Стан "Running" ("виконується") означає, що потік очікує вводу, a "Not Responding" ("не відповідає") – що не очікує (тобто зайнятий, або чекає завершення операції вводу-виводу, або звільнення якогось синхронізуючого об'єкта)[3].

Завдання[ред. | ред. код]

Windows надає розширення для моделі процесів – завдання (jobs). Вони призначені в основному для того, щоб групами процесів можна було оперувати й керувати як єдиним цілим. Об'єкт-завдання дозволяє встановлювати певні атрибути й накладати обмеження на процес або процеси, зіставлені із завданням. У цьому об'єкті також зберігається інформація про всі процеси, які були зіставлені з завданням, але вже завершені.

Джерела[ред. | ред. код]

  1. Рихтер Дж. Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows/ Дж.Рихтер ; пер. с англ. – 4-е изд. – СПб. : Питер; М.: Издательско-торговый дом "Русская редакция", 2001.
  2. Руссинович М. Внутреннее устройство Microsoft Windows : Windows Server 2003, Windows XP и Windows 2000. Мастер-класс / М.Руссинович, Д.Соломон ; пер. с англ. – 4-е изд. – М : Издательско-торговый дом "Русская редакция" ; СПб : Питер, 2005.
  3. а б в г Коноваленко І.В., Федорів П.С. Системне програмування у Windows з прикладами на Delphi, Т:ТНТУ.- 2012 [Архівовано 8 грудня 2012 у Wayback Machine.].

Див. також[ред. | ред. код]