Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_Лаб3_new.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
175.62 Кб
Скачать

Лабораторна робота № 3.

Тема: Управління потоками та процесами у Windows.

Мета: Ознайомитись з основними АРІ-функціями для управління потоками та процесами.

Теоретичні відомості.

Основні функції WinAPI, котрі використовуються для роботи з процесами та потоками:

  1. CreateProcess – створення процесу.

  2. TerminateProcess – завершення процесу.

  3. CreateThread – створення потоку.

  4. WaitForSingleObject – очікування завершення роботи потоку.

Cтворення процесу здійснюється за допомогою функції CreateProcess:

BOOL CreateProcess(

LPCTSTR lpApplicationName, // ​​ім'я виконуваного модуля

LPTSTR lpCommandLine, // ​​параметри командного рядка

LPSECURITY_ATTRIBUTES lpProcessAttr, // захист процесу

LPSECURITY_ATTRIBUTES lpThreadAttr, // захист основного потоку процесу

BOOL bInheritHandles, // ​​чи наслідуються властивості батьківського процесу

DWORD dwCreationFlags, // параметри процесу

LPVOID lpEnvironment, // ​​параметри середовища

LPCTSTR lpCurrentDirectory, // ​​поточний диск або каталог

LPSTARTUPINFO lpStartupInfo, // ​​початкові параметри процесу

LPPROCESS_INFORMATION lpProcessInformation // інформація про процес

);

В результаті успішного виконання функція поверне TRUE. У разі невдачі - FALSE.

Параметри:

pApplicationName – шлях до програми, яку потрібно запустити.

lpCommandLine - тут передаються параметри командного рядка (за потребою, якщо запускається консольна програма). Якщо не використовується, то пишемо NULL.

lpProcessAttributes - атрибути захисту для програми. Якщо вказати NULL то система зробить це за замовчуванням.

lpThreadAttributes - атрибути захисту для першого потоку програми. Якщо вказати NULL то система зробить це за замовчуванням.

bInheritHandles – параметр, який вказує, чи успадковується дескриптор батьківського процесу. TRUE – успадковується, FALSE – ні.

dwCreationFlags – задає параметри створення процесу і пріоритет процесу. Основні значення:

CREATE_NEW_CONSOLE

новий процес відкривається у новому консольному вікні.

HIGH_PRIORITY_CLASS

процес є критичним для системи

IDLE_PRIORITY_CLASS

процес працює у фоновому режимі

NORMAL_PRIORITY_CLASS

стандартний пріоритет

REALTIME_PRIORITY_CLASS

найвищий пріоритет (пріоритет реального часу)

lpEnvironment - вказує на параметри середовища. Якщо NULL, то буде використано параметри батьківського процесу.

lpCurrentDirectory - визначає поточний диск і каталог. Якщо NULL то буде використаний диск і каталог батьківського процесу.

lpStartupInfo - використовується для налаштування властивостей процесу, наприклад розташування вікон і заголовок.

Структура повинна бути правильно ініціалізована:

STARTUPINFO sti ; // структура

ZeroMemory(&sti, sizeof(STARTUPINFO));//обнулити всі поля структури

sti.cb = sizeof ( STARTUPINFO ); // визначити розмір структури

lpProcessInformation - структура PROCESS_INFORMATION з інформацією про процес. Буде заповнена операційною системою Windows.

Один процес може завершити другий процес за допомогою виклику функції TerminateProcess, яка має наступний прототип:

BOOL TerminateProcess (

HANDLE hProcess, //дескриптор процесу

UINT uExitCode // код завершення процесу

);

Якщо функція TerminateProcess виконалася успішно, то вона повертає значення дорівнює TRUE. В іншому випадку повертається значення одно FALSE.

Функція TerminateProcess завершує роботу процесу, але не звільняє всі ресурси, що належать цьому процесу. Тому ця функція повинна викликатися тільки в аварійних ситуаціях при зависанні процесу.

Потік створюється функцією CreateThread, яка має наступний прототип:

HANDLE CreateThread (

LPSECURITY_ATTRIBUTES lpThreadAttributes, // ​​атрибути захисту

DWORD dwStackSize, // ​​розмір стека потоку в байтах

LPTHREAD_START_ROUTINE lpStartAddress, // адреса виконуваної функції

LPVOID lpParameter, // адреса параметра

DWORD dwCreationFlags, // ​​прапори створення потоку

LPDWORD lpThreadId // ідентифікатор потоку

);

При успішному завершенні функція CreateThread повертає дескриптор створеного потоку і його ідентифікатор, який є унікальним для всієї системи. У випадку невдачі ця функція повертає значення NULL.

Призначення параметрів функції CreateThread:

lpThreadAttributes - встановлює атрибути захисту створюваного потоку. Встановлюємо значення цього параметра в NULL. Це означає, що атрибути захисту потоку збігаються з атрибутами захисту батьківського процесу.

dwStackSize - визначає розмір стека, який виділяється потоку при запуску. Якщо цей параметр дорівнює нулю, то потоку виділяється стек, розмір якого дорівнює за замовчуванням 1 Мб. Це найменший розмір стека, який може бути виділений потоку. Якщо величина параметра dwStackSize менше значення, заданого за замовчуванням, то все одно потоку виділяється стек розмірів в 1Мб. Операційна система Windows округлює розмір стека до однієї сторінки пам'яті, що звичайно дорівнює 4 Кб.

lpStartAddress – вказує на виконувану потоком функцію. Ця функція повинна мати наступний прототип:

DWORD WINAPI ThreadProc ( LPVOID lpParameters );

Параметр lpParameter є єдиним параметром, який передається функції потоку.

dwCreationFlags - визначає, в якому стані буде створений потік. Якщо значення цього параметра дорівнює 0, то функція потоку починає виконуватися відразу після створення потоку. Якщо ж значення цього параметра встановлено CREATE_SUSPENDED, то потік створюється в підвішеному стані. Надалі цей потік можна запустити викликом функції ResumeThread.

lpThreadId - є вихідним параметром, тобто його значення встановлює Windows. Цей параметр повинен вказувати на змінну, в яку Windows помістить ідентифікатор потоку, який унікальний для всієї системи і може надалі використовуватися для посилань на потік.

Для очікування завершення роботи потоку використовується функція:

DWORD WaitForSingleObject(

HANDLE hHandle, // дескриптор потоку

DWORD dwMilliseconds // інтервал очікування в мілісекундах

);

Ця функція очікує завершення потоку встановлену кількість мілісекунд, коли час закінчиться – основна програма буде виконуватись далі. Якщо другий параметр встановити рівним INFINITE, то чекаємо, поки потік не завершиться самостійно.

Наведемо приклад програми, яка використовує функцію CreateThread для створення потоку, і продемонструємо спосіб передачі параметрів до виконуваної потоком функції.

Постановка задачі:

Використовуючи АРІ-функції реалізувати наступні задачі для роботи з процесами та потоками:

1. Робота з процесами:

  1. Запустити програму notepad з високим пріоритетом.

  2. Завершити виконання програми через 10 секунд.

2. Робота з потоками:

1) Написати програму для одночасного опрацювання масиву двома потоками. Перший потік знаходитиме максимальний елемент масиву, другий - середнє арифметичне елементів масиву.