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

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

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

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

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

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

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

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

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

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

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

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

Недоліки:

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

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

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

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

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

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

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

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

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

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