Тема 5. Потоки. Стани потоків. Багатопоточність.

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

Процеси

Процесом (задачею) зазвичай називають екземпляр програми що виконується.

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

Будь-який процес може знаходитися у трьох станах:

  • виконання
  • очікування
  • готовності
Під виконанням процесу розуміють активний стан процесу під час якого він споживає процесорний час, а також користується іншими ресурсами системи.
Очікування – пасивний стан процесу при якому процес очікує вивільнення потрібного йому ресурсу або свого кванту часу у процесорі.

Процес у Windows характеризується наступними компонентами:

- Структура даних, що містить всю інформацію про процес, зокрема список відкритих дескрипторів різних системних ресурсів, унікальний ідентифікатор процесу, різну статистичну інформацію і т.д.;
- Адресний простір - діапазон адрес віртуальної пам'яті, яким може користуватися процес;
- Виконувана програма і дані, проектовані на віртуальний адресний простір процесу.

Потоки (нитки)

Процеси інертні. Відповідають же за виконання коду, що міститься в адресному просторі процесу, потоки.

Потік (thread) –мінізадача,яка запускається всередині процесу і використовує псевдопаралельну роботу мікропроцесора.У кожному процесі є мінімум один потік. Цей первинний потік створюється системою автоматично при створенні процесу. Далі цей потік може породити інші потоки, ті в свою чергу нові і т.д. Таким чином, один процес може володіти декількома потоками, і тоді вони одночасно виконують код в адресному просторі процесу.

Для потоку дозволені наступні стани:

  • створення (new);
  • виконання (running);
  • очікування (waiting);
  • готовність (ready);
  • завершення (terminated).

Кожен потік має:

  • унікальний ідентифікатор потоку;
  • вміст набору регістрів процесора, що відображають стан процесора;
  • два стеки, один з яких використовується потоком при виконанні в режимі ядра, а інший - в користувацькому режимі;
  • закриту область пам'яті, звану локальною пам'яттю потоку (thread local storage, TLS) що використовується підсистемами, run-time бібліотеками і DLL.

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

Планування потоків

Щоб всі потоки працювали, операційна система відводить кожному з них певний процесорний час. Тим самим створюється ілюзія одночасного виконання потоків (зрозуміло, для багатопроцесорних комп'ютерів можливий істинний паралелізм). У Windows реалізована система багатозадачності з пріоритетами, в якій завжди виконується потік з найбільшим пріоритетом, який готовий до виконання. Вибраний для виконання потік працює протягом деякого періоду, званого квантом. Квант визначає, скільки часу виконуватиметься потік, доки операційна система не перерве його. Після закінчення кванта операційна система перевіряє, чи готовий до виконання інший потік з таким же (або більшим) рівнем пріоритету. Якщо таких потоків не виявилося, поточному потоку виділяється ще один квант. Проте потік може не повністю використовувати свій квант. Як тільки інший потік з вищим пріоритетом готовий до виконання, поточний потік витісняється, навіть якщо його квант ще не закінчився.

Квант не вимірюється в одиницях часу, а виражається цілим числом. Для кожного потоку зберігається поточне значення його кванта. Коли потоку виділяється квант процесорного часу, це означає, що його квант встановлюється в початкове значення. Воно залежить від операційної системи. Наприклад, для Win2000 Professional початкове значення кванта рівне 6, а для Win2000 Server - 36.

Це значення можна змінити викликавши Control Panel - > System -> Advanced -> Performance options. Значення «Applications» - для Win2000 Professional; «Background Services» - для Win2000 Server. Або в ключі реєстру HKLM\System\CurrentControlset\Control\PriorityControl\ Win32PrioritySeparation.

Будь-коли, коли виникає переривання від таймера, із кванта потоку віднімається 3, і так до тих пір, поки він не досягне нуля. Частота спрацьовування таймера залежить від апаратної платформи. Наприклад, для більшості однопроцесорних x86 систем він складає 10мс, а на більшості багатопроцесорних x86 систем - 15мс.

У будь-якому випадку операційна система повинна визначити, який потік виконувати наступним. Вибравши новий потік, операційна система перемикає контекст. Ця операція полягає в збереженні параметрів виконуваного потоку (регістри процесора, покажчики на стек ядра і призначений для користувача стек, покажчик на адресний простір, в якому виконується потік і ін.), і завантаженню аналогічних параметрів для іншого потоку, після чого починається виконання нового потоку.

Планування в Windows здійснюється на рівні потоків, а не процесів. Це здається зрозумілим, оскільки самі процеси не виконуються, а лише надають ресурси і контекст для виконання потоків. Тому при плануванні потоків, система не звертає уваги на те, якому процесу вони належать. Наприклад, якщо процес А має 10 готових до виконання потоків, а процес Б - два, і всі 12 потоків мають однаковий пріоритет, то кожний з потоків одержить 1/12 процесорного часу.

Пріоритети

У Windows існує 32 рівні пріоритету, від 0 до 31. Вони поділяються на два блоки від 31 – 16 – пріоритети реального часу; від 15 - 1 динамічні рівні; 0 - системний пріоритет, зарезервований для потоку обнулення сторінок (zero-page thread).

При створенні процесу, йому призначається один з шести класів пріоритетів:

  • Real time class (значення 24);
  • High class (значення 13);
  • Above normal class (значення 10),
  • Normal class (значення 8),
  • Below normal class (значення 6),
  • Idle class (значення 4).
У Windows NT/2000/XP пріоритет процесу можна подивитися в Task Manager.Above normal і Below normal з'явилися починаючи з Win2000.
Пріоритет кожного потоку (базовий пріоритет потоку) складається з пріоритету його процесу і відносного пріоритету самого потоку.

Є сім відносних пріоритетів потоків:

  • Normal: такий же як і у процесу;
  • Normal: +1 до пріоритету процесу;
  • Below normal: -1;
  • Highest: +2;
  • Lowest: -2;
  • Time critical: встановлює базовий пріоритет потоку для Real time класу в 31, для решти класів в 15.
  • Idle: встановлює базовий пріоритет потоку для Real time класу в 16, для решти класів в 1.

Прив'язка до процесорів

Якщо операційна система встановлена на комп’ютері, де встановлено більше одного процесора, то по замовчуванню, потік виконується на будь-якому доступному процесорі. Проте в деяких випадках, набір процесорів, на яких потік може працювати, може бути обмежений. Це явище називається прив'язкою до процесорів (processor affinity). Можна змінити прив'язку до процесорів програмно, через Win32-функции планування.