Потоки
Зміст
Потік
Потік – мінізадача,яка запускається всередині процесу і використовує псевдопаралельну роботу мікропроцесора.У кожному процесі є мінімум один потік. Цей первинний потік створюється системою автоматично при створенні процесу. Далі цей потік може породити інші потоки, ті в свою чергу нові і т.д. Таким чином, один процес може володіти декількома потоками, і тоді вони одночасно виконують код в адресному просторі процесу.
Для потоку дозволені наступні стани:
- створення (new);
- виконання (running);
- очікування (waiting);
- готовність (ready);
- завершення (terminated).
Кожен потік має:
- унікальний ідентифікатор потоку;
- вміст набору регістрів процесора, що відображають стан процесора;
- два стеки, один з яких використовується потоком при виконанні в режимі ядра, а інший - в користувацькому режимі;
- закриту область пам'яті, звану локальною пам'яттю потоку (thread local storage, TLS) що використовується підсистемами, run-time бібліотеками і DLL.
Потоки мають усі властивості процесів за одним винятком: виконання потоків може бути припинене при закритті процесу, незалежно від того в якому стані вони знаходились.
Кожному потоку належать наступні ресурси:
- код виконуваної функції;
- набір регістрів процесора;
- стек для роботи програми;
- стек для роботи операційної системи;
- маркер доступу, який містить інформацію для системи безпеки.
Потоки в Win2k
Потоком в Windows називається об'єкт ядра, якому операційна система виділяє процесорний час для виконання програми.
Всі ці ресурси утворюють контекст потоку в Windows. Крім дескриптора кожен потік в Windows також має свій ідентифікатор, який унікальний для потоків, що виконуються в системі. Ідентифікатори потоків використовуються службовими програмами, які дозволяють користувачам системи відстежувати роботу потоків.
В операційних системах Windows розрізняються потоки двох типів:
- системні потоки - виконують різні сервіси операційної системи і запускаються ядром операційної системи;
- користувальницькі потоки - служать для вирішення задач користувача і запускаються додатком.
В сімействі операційних систем Microsoft Win2k (включаючи і сучасну Win7) процеси реалізуються у вигляді об'єктів.
В процесі, що виконується можуть міститись один, або декілька потоків.
Можливості синхронізації вбудовуються в об'єкти-процеси та об'єкти-потоки.
Атрибути процесу в Windows:
- Ідентифікатор процесу - унікальне значення.
- Дескриптор захисту - описує, хто створив об'єкт, хто має право доступу, хто є власником.
- Базовий пріоритет.
- Процесор по замовчуванню.
- Квоти - максимальна кількість сторінкової пам'яті, об'єм пам'яті, процесорний час.
- Час виконання - сумарний час, що витрачається на всі потоки.
- Лічильники вводу-виводу - змінні куди заносяться відомості про операції вводу=виводу.
- Лічильники операцій з віртуальною пам'яттю.
- Порти відладки - канали обміну між процесами.
- статус виходу - причина завершення.
Стани потоків в Windows
- Готовий до виконання. Потік може бути відправлений на виконання.
- Резервний. Потік, що буде запущено наступним на даному процесорі. Може витісняти процес з меншим пріоритетом.
- Виконуємий. Може знаходитися в цьому стані поки не буде повністю виконано, або витіснено.
- Очікуючий. Потік знаходиться в стані чекання, якщо він:
1)заблокований подією; 2)добровільно чекає синхронізації; 3)середовище підсистеми вказує потоку щоб він сам себе призупинив.
- Перехідний. Потік готовий до виконання, але ресурси недоступні.
- Завершуючий. Завершення потоку ініціюється самим потоком, іншим потоком або може віббутися в зв'язку з завершенням батьківського процесу.
Керування потоками у Windows ХР
Для того щоб виконувати код, у рамках процесу обов'язково необхідно створити потік. У системі Windows ХР реалізована модель потоків «у чистому вигляді». Процеси і потоки є різними сутностями в системі, що перебувають у чітко визначеному взаємозв'язку один з одним; для роботи з ними використовують різні системні виклики. У Windows ХР ніколи не використовували модель процесів, подібну до традиційної моделі UNIX. Багатопотоковість Windows ХР базується на схемі 1:1. Кожному потоку користувача відповідає сутність у ядрі, при цьому ядро відповідає за планування потоків.
Висновки
- Потоки є активними ресурсами обчислювальних систем, які реалізують виконання програмного коду. Потоком називають набір послідовно виконуваних команд процесора. Процес є сукупністю одного або декількох потоків і захищеного адресного простору, в якому вони виконуються. Потоки одного процесу можуть разом використовувати спільні дані, для потоків різних процесів без використання спеціальних засобів це неможливо. У традиційних системах кожний процес міг виконувати тільки один потік, виконання програмного коду пов'язували із процесами. Сучасні ОС підтримують концепцію багатопотоковості.
- Використання потоків у застосуванні означає внесення в нього паралелізму — можливості одночасного виконання дій різними фрагментами коду. Паралелізм у програмах відображає асинхронний характер навколишнього світу, його джерелами є виконання коду на декількох процесорах, операції введення-виведення, взаємодія з користувачем, запити застосувань-клієнтів. Багато-потоковість у застосуваннях дає змогу природно реалізувати цей паралелізм і домогтися високої ефективності. З іншого боку, використання багатопотоковості досить складне і вимагає високої кваліфікації розробника.
- Розрізняють потоки користувача, які виконуються в режимі користувача в адресному просторі процесу, і потоки ядра, з якими працює ядро ОС. Взаємовідношення між ними визначають схему реалізації моделі потоків. На практиці найчастіше використовують схему 1:1, коли кожному потоку користувача відповідає один потік ядра, і саме ядро відповідає за керування потоками користувача.
- Потік може перебувати в різних станах (виконання, очікування, готовності тощо). Принципи переходу з одного стану в інший залежать від принципів планування потоків і планування процесорного часу. Перехід процесу зі стану виконання у будь-який інший стан зводиться до перемикання контексту — передачі керування від одного потоку до іншого зі збереженням стану процесора.
- Кожному потоку в системі відповідає його керуючий блок — структура даних, що містить усю необхідну інформацію. Під час створення процесу (зазвичай за допомогою системного виклику fork() створюють його керуючий блок, виділяють пам'ять і запускають основний потік. Створення потоку простіше і виконується швидше, оскільки не потрібно виділяти пам'ять під новий адресний простір.