JavaRush/Java курси/Модуль 1: Python Core/Багатопоточність

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

Відкрита

1.1 Історія виникнення

Людство часто приходить до ідеї створити новий грандіозний проєкт, який затьмарить усі попередні грандіозні проєкти. Піраміда Хеопса в Гізі — найбільша, Бурдж Халіфа в Дубаї — найвища, а Велика Китайська стіна — найдовша.

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

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

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

Як виконати програму в десять разів швидше? Здавалося б, дивне питання — якщо процесор вже працює на максимальній швидкості, то, мабуть, ніяк. Проте я не дарма згадував найкращі уми людства. Вони проаналізували роботу всіх програм і дійшли висновку, що є три великі напрями для росту.

Усунення простоїв

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

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

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

Більше програм

Якщо програми простоюють 80% часу, то це, звісно ж, недобре. З іншого боку, не можна ж переписати всі програми під наші нові підходи. Можливо, цю проблему можна вирішити інакше — можна просто запускати на комп'ютері кілька програм одночасно.

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

Більше процесорів

Одночасне виконання програм — це круто, але що, якщо програм багато, а простоюють вони мало? Немає простоїв — немає ефективного використання. Наприклад, у нас десять програм, які щось обчислюють, або ресурсоємна гра і ще щось разом із нею.

Рішенням цієї проблеми стало додавання в процесор кількох процесорів. Щоб уникнути плутанини, їх стали називати ядрами. Тепер у нас є процесори, у яких кілька ядер (суб-процесорів), на яких паралельно працюють десятки програм.

Цікаво! Кількість ядер у процесорах

На сьогоднішній день серверні процесори можуть мати від 64 до 256 ядер, а в деяких спеціалізованих випадках навіть більше. Наприклад, процесори AMD EPYC 4-го покоління пропонують до 96 ядер, а IBM POWER10 може мати до 240 ядер на чипі. Користувацькі процесори також значно еволюціонували: високопродуктивні настільні CPU, такі як AMD Threadripper, можуть мати до 64 ядер, тоді як більш поширені моделі зазвичай мають від 6 до 16 ядер.

Куди ж далі? Є куди! По-перше, в одну серверну материнську плату можна встановити кілька процесорів, наприклад два або навіть чотири. По-друге, сервери можна об'єднувати в серверні стійки по 10-20 штук. А серверні стійки — в дата-центри, де таких стояк тисячі.

Розподілені системи та мікросервісні архітектури стали поширеною практикою в сучасній розробці програмного забезпечення. Багато великих компаній, такі як Google, Amazon, Netflix, і навіть менші підприємства, використовують розподілені системи для обробки великих обсягів даних, забезпечення високої доступності та масштабованості своїх сервісів. Ці системи дозволяють ефективно використовувати ресурси багатьох серверів, які працюють разом як єдине ціле, що значно підвищує продуктивність і відмовостійкість додатків.

1.2 Переваги

1.3 Правильна назва

До назви «багатопоточність» є претензії. Вона складається з двох слів: «багато» і «потік», ніби натякаючи на те, що всередині програми знаходиться багато «потоків виконання команд», які щось виконують.

Гарна аналогія, але в англійській (оригінальній) літературі для позначення декількох паралельно виконуваних дій використовується термін «нитка» (thread). І, відповідно, багатопоточність там звучить як multi-threading.

Це можна було б вважати дрібним непорозумінням — кому яка справа, як різні терміни перекладаються іншою мовою, якби в програмуванні не стали активно використовувати таку річ, як stream, яку крім як словом «потік» не перекладеш.

Тому зараз в україномовній термінології існує деяка плутанина, яку вирішують двома способами:

  • Thread (нитка) перекладають як «потік виконання [команд]».
  • Stream (потік) перекладають як «потік даних».

З іншого боку, багато програмістів просто почали використовувати англомовні терміни без перекладу:

  • Thread (нитка) вимовляють як «трэд», а multi-threading як «малти-трэдинг».
  • Stream (потік) вимовляють як «стрим».

Thread часто називають ниткою, але термін «багатонитковість» так і не прижився. Тому часто в розмові використовують «нитка» і «багатопоточність» одночасно.

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

Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.