Багатонитевість

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

Багатонитевість (англ. multi-threading), або багатопотоковість — властивість операційної системи або застосунку, що полягає в тому, що процес, породжений в операційній системі, може складатися з кількох нитей, що виконуються паралельно, або навіть одночасно на багатопроцесорних системах. При виконанні деяких завдань таке розділення може досягти ефективнішого використання ресурсів комп'ютера. Такі ниті виконання ще називають потоками.

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

Багатонитевість (як доктрину програмування) не слід плутати ані з багатозадачністю, ані з багато-процесорністю, не зважаючи на те, що операційні системи, що реалізовують багатозадачність, як правило реалізують і багатонитевість.

Переваги в багатонитевості такі:

  • Спрощення програми в деяких випадках, за рахунок використання загального адресного простору
  • Менші відносно процесу часові витрати на створення ниті і взаємодію між нитями
  • Підвищення продуктивності процесу за рахунок розпаралелювання процесорних обчислень і операцій вводу/виводу

Типи реалізації нитей[ред.ред. код]

Докладніше: Нить

Нить в просторі користувача[ред.ред. код]

Кожен процес має таблицю нитей, аналогічну таблиці процесів ядра.

Переваги цього типу наступні:

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

Недоліки:

  • відсутність переривання по таймеру усередині одного процесу
  • при використанні блокуючого системного запиту решта всіх нитей блокується
  • відсутній виграш у швидкодії на багато-процесорних системах
  • складність реалізації

Нить в просторі ядра[ред.ред. код]

Разом з таблицею процесів в просторі ядра є таблиця нитей

Змішана реалізація[ред.ред. код]

Ниті працюють в режимі користувача, але при системних викликах перемикаються в режим ядра. Перемикання в режим ядра і назад є ресурсоємною операцією і негативно позначається на продуктивності системи. Тому було введено поняття волокна — полегшеної ниті, що виконується виключно в режимі користувача. В кожної ниті може бути декілька волокон. Подібний тип багатонитевості реалізований в ОС Windows.

Взаємодія нитей[ред.ред. код]

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

  • взаємовиключення (mutex, м'ютекс) — це об'єкт синхронізації, який встановлюється в особливий сигнальний стан, коли не зайнятий якоюсь ниттю. Тільки одна нить володіє цим об'єктом у будь-який момент часу, звідси і назва таких об'єктів (від англійського mutually exclusive access — взаємно виключний доступ) — одночасний доступ до загального ресурсу виключається. Після всіх необхідних дій м'ютекс звільняється ниттю, надаючи іншим нитям доступ до загального ресурсу.
  • Семафори є доступні ресурси, які можуть займатися кількома нитями в один і той же час, поки обсяг ресурсів не спустіє. Тоді додаткові ниті повинні чекати, поки необхідна кількість ресурсів не буде знову доступна. Семафори дуже ефективні, оскільки вони дозволяють одночасний доступ до ресурсів.
  • Події. Події корисні в тих випадках, коли необхідно послати повідомлення ниті, що відбулося певна подія. Наприклад, при асинхронних операціях вводу/виводу з одного пристрою, система встановлює подію в сигнальний стан коли закінчується якась з цих операцій. Одна нить може використовувати кілька різних подій в декількох операціях, що перекриваються, а потім чекати приходу сигналу від будь-якого з них.
  • Критичні секції забезпечують синхронізацію подібно м'ютексам за винятком того, що об'єкти, що представляють критичні секції, доступні в межах одного процесу. Події, м'ютекси і семафори також можна використовувати в однопроцесному застосунку, проте критичні секції забезпечують швидший і ефективніший механізм синхронізації взаємного виключення.

Посилання[ред.ред. код]

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