Багатопоточність

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

Такіпотокиназивають такожпотоками виконання(від англ. Thread of execution); іноді називають «нитками» (літеральний переклад англ. thread) або неформально «тредами».

Зміст

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

До переваг багатопотокової реалізації тієї чи іншої системи перед багатозадачною можна віднести наступне:

До переваг багатопотокової реалізації тієї чи іншої системи перед однопотоковою можна віднести наступне:

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

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

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

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

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

Переклад англійського терміна thread як «потік» у контексті, пов'язаному з програмуванням, суперечить його перекладу «нитка» у загальномовному контексті, а також створює колізії з терміном Data stream.

Однак термін «потік» пов'язаний з перекладами іноземної технічної літератури, виконаними в1970-х роках видавництвом «Мир». Нині в «академічних колах» (тобто у підручниках, методичних посібниках, курсах вишів, дисертаціях та ін.) він вважається еталонним. Терміни ж «нитка», «тред» тощо вважаються технічними жаргонізмами.