Розділені ресурси, конфлікти, проблема спільного доступу - 1

— Привіт, Аміго! Хочу тобі розповісти про спільне використання ресурсів. Різними нитками, ясна річ.

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

Розбиття програми на незалежні (слабопов'язані) частини дуже вигідне.

Уяви, що твоя програма всередині розбита на 100 ниток. Але в тебе всього двоядерний процесор. Це означає, що на кожному ядрі виповнюється в середньому 50 ниток.

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

Це одна з причин домінування Java у секторі Enterprise-розробки. Якщо компанія має складну програму для внутрішніх потреб, яку пишуть 20 розробників, то купити ще один сервер набагато дешевше, ніж прискорити програму в 2 рази.

— Так от виявляється в чому річ.

— Але! Щоразу, коли розробник вирішує використовувати ще одну нитку, він вирішує одну проблему, а створює дві. Занадто багато ниток не збільшать продуктивність програми до нескінченності.

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

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

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

— Так, я пам'ятаю, це робиться за допомогою ключового слова synchronized.

— Так, саме.

— А якщо нитки пишуть до різних файлів?

— Формально – це різні об'єкти, але жорсткий диск один.

— Тобто. реально щось розпаралелити можна лише всередині процесора?

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

— І що ж робити? Як дізнатися – робити багато ниток чи ні?

— Це визначається безпосередньо архітектурою програми. Будь-який проект має його «архітектор», який знає всі «ресурси», які використовуються в програмі, знає їх обмеження, і наскільки вони добре/погано паралеляться.

— А якщо я не знаю?

— Тут є два варіанти:

а) попрацювати під керівництвом такого фахівця

б) набити шишок самому

— Я – робот, у мене не буває шишок – тільки вм'ятини.

— Ну, значить, набити вм'ятин.

— Зрозуміло дякую. Ти прояснила деякі питання, про які я вже почав ламати голову.