- •Моделі процесів і потоків
- •Складові елементи процесів і потоків
- •2. Багатопотоковість та її реалізація
- •Поняття паралелізму
- •Види паралелізму.
- •Переваги і недоліки багато потоковості
- •Способи реалізації моделі потоків
- •2.2.1 Стани процесів і потоків
- •Опис процесів і потоків
- •Керуючі блоки процесів і потоків
- •Образи процесу і потоку
- •2.5. Перемикання контексту й обробка переривань
- •2.5.1. Організація перемикання контексту
- •2.5.2. Обробка переривань.
- •2.6. Створення і завершення процесів і потоків
- •2.6.1. Створення процесів Базові принципи створення процесів
- •Ієрархія процесів
- •2.6.3. Керування адресним простором під час створення процесів
- •Особливості завершення процесів
- •Синхронне й асинхронне виконання процесів
- •2.6.6. Створення і завершення потоків Особливості створення потоків.
- •2.9. Керування процесами у Windows хр
- •2.9.1Складові елементи процесу
- •Структури даних процесу
- •3.9.3. Створення процесів
- •3.9.4. Завершення процесів
- •Процеси і ресурси. Таблиця об'єктів процесу
- •3.9.6. Програмний інтерфейс керування процесами Win32 арі
- •Керування потоками у Windows хр
- •3.10.1. Складові елементи потоку
- •Структури даних потоку
- •Створення потоків
- •3.10.4. Особливості програмного інтерфейсу потоків
Структури даних потоку
Відображення потоків у системі, як і відображення процесів, засноване на об'єктній моделі Windows ХР. Для виконавчої системи Windows ХР кожен потік відображається об'єктом-потоком виконавчої системи (executive thread object), який також називають керуючим блоком потоку (executive thread block, ETHREAD). Для ядра системи потік відображається об'єктом-потоком ядра (kernel thread object), який також називають блоком потоку ядра (thread kernel block, KTHREAD).
У режимі користувача доступним є блок оточення потоку (thread environment block, ТЕВ), який перебуває в адресному просторі процесу, що створив потік.
Неважко помітити, що кожній структурі даних потоку відповідає структура даних процесу (блоки EPROCESS, KPROCESS і РЕВ).
Керуючий блок потоку містить базову інформацію про потік, зокрема:
блок потоку ядра;
ідентифікатор процесу, до якого належить потік, і покажчик на керуючий блок цього процесу (EPROCESS);
стартову адресу потоку, з якої почнеться виконання його коду;
інформацію для підсистеми безпеки.
Блок потоку ядра, у свою чергу, містить інформацію, необхідну ядру для організації планування і синхронізації потоків, зокрема:
покажчик на стек ядра;
інформацію для планувальника;
інформацію, необхідну для синхронізації цього потоку;
покажчик на блок оточення потоку.
Блок оточення потоку містить інформацію про потік, доступну для застосувань режиму користувача. До неї належать:
ідентифікатор потоку;
покажчик на стек режиму користувача;
покажчик на блок оточення процесу, до якого належить потік;
покажчик на локальну пам'ять потоку.
Створення потоків
Основним засобом створення потоків у Windows ХР є функція CreateThread() Win32 АРІ. Назвемо етапи виконання цієї функції.
В адресному просторі процесу створюють стек режиму користувача для потоку.
Ініціалізують апаратний контекст потоку (у процесор завантажують дані, що визначають його стан). Цей крок залежить від архітектури процесора.
Створюють об'єкт-потік виконавчої системи у призупиненому стані, для чого в режимі ядра:
а) створюють та ініціалізують структури даних потоку (блоки ETHREAD, KTHREAD, ТЕВ);
б) задають стартову адресу потоку (використовуючи передану як параметр адресу процедури потоку);
в) задають інформацію для підсистеми безпеки та ідентифікатор потоку;
г) виділяють місце під стек потоку ядра.
Підсистемі Win32 повідомляють про створення нового потоку.
Дескриптор та ідентифікатор потоку повертають у процес, що ініціював створення потоку (викликав CreateThreadO).
Починають виконання потоку (виконують перехід за стартовою адресою).
3.10.4. Особливості програмного інтерфейсу потоків
Програмний інтерфейс керування потоками у Windows ХР є частиною Win32 АРІ. Такий інтерфейс ще називають інтерфейсом потоків Win32. Розглянемо особливості його використання.
Створення потоків у Win32 АРІ
У Win32 АРІ, як зазначалося раніше, для створення потоку призначена функція CreateThread(), а для його завершення - EndThread().
На практиці, однак, пару CreateThread( )/EndThread() є сенс використати лише тоді, коли з коду, що виконує потік, не викликаються функції стандартної бібліотеки мови С (такі, як printf О або strcmpO).
Річ у тому, що функції стандартної бібліотеки С у Win32 АРІ не пристосовані до використання за умов багатопотоковості, і для того щоб підготувати потік до роботи за таких умов, необхідно під час його створення і завершення виконувати деякі додаткові дії. Ці дії враховані у спеціальних бібліотечних функціях роботи з потоками, описаних у заголовному файлі process. h. Це функція _begi nthreadex() для створення потоку й _endthreadex() — для завершення потоку.
Після створення потоку може виникнути потреба змінити його характеристики. Якщо це необхідно зробити у функції потоку, варто знати, як отримати доступ до його дескриптора.
Висновки
Процеси і потоки є активними ресурсами обчислювальних систем, які реалізують виконання програмного коду. Потоком називають набір послідовно виконуваних команд процесора. Процес є сукупністю одного або декількох потоків і захищеного адресного простору, в якому вони виконуються. Потоки одного процесу можуть разом використовувати спільні дані, для потоків різних процесів без використання спеціальних засобів це неможливо. У традиційних системах кожний процес міг виконувати тільки один потік, виконання програмного коду пов'язували із процесами. Сучасні ОС підтримують концепцію багатопотоковості.
Використання потоків у застосуванні означає внесення в нього паралелізму -можливості одночасного виконання дій різними фрагментами коду. Паралелізм у програмах відображає асинхронний характер навколишнього світу, його джерелами є виконання коду на декількох процесорах, операції введення-виведення, взаємодія з користувачем, запити застосувань-клієнтів. Багато-потоковість у застосуваннях дає змогу природно реалізувати цей паралелізм і домогтися високої ефективності. З іншого боку, використання багатопотоковості досить складне і вимагає високої кваліфікації розробника.
Розрізняють потоки користувача, які виконуються в режимі користувача в адресному просторі процесу, і потоки ядра, з якими працює ядро ОС. Взаємовідношення між ними визначають схему реалізації моделі потоків. На практиці найчастіше використовують схему 1:1, коли кожному потоку користувача відповідає один потік ядра, і саме ядро відповідає за керування потоками користувача.
Потік може перебувати в різних станах (виконання, очікування, готовності тощо). Принципи переходу з одного стану в інший залежать від принципів планування потоків і планування процесорного часу. Перехід процесу зі стану виконання у будь-який інший стан зводиться до перемикання контексту — передачі керування від одного потоку до іншого зі збереженням стану процесора.
Кожному процесу і потоку в системі відповідає його керуючий блок - структура даних, що містить усю необхідну інформацію. Під час створення процесу (зазвичай за допомогою системного виклику fork ( ) створюють його керуючий блок, виділяють пам'ять і запускають основний потік. Створення потоку простіше і виконується швидше, оскільки не потрібно виділяти пам'ять під новий адресний простір.
