— Привіт, Аміго! Хочу тобі розповісти про спільне використання ресурсів. Різними нитками, ясна річ.
Я весь час говорю про проблеми при роботі кількох ниток і про те, як їх вирішувати. Не означає, що використання ниток – це погано. Нитки – це дуже сильний інструмент. Фактично вони дозволяють збільшити швидкість і навіть надійність роботи твоєї програми. Чим складніша програма – тим більше в ній ниток та різних самостійних частин.
Розбиття програми на незалежні (слабопов'язані) частини дуже вигідне.
Уяви, що твоя програма всередині розбита на 100 ниток. Але в тебе всього двоядерний процесор. Це означає, що на кожному ядрі виповнюється в середньому 50 ниток.
Якщо ж тобі потрібно наростити потужність програми, ти просто купуєш двопроцесорний сервер та пару крутих процесорів для нього. В результаті у нього сумарно може бути до 32 ядер, і продуктивність твоєї програми може зрости в 2-20 разів. Залежно від того, наскільки справді незалежних частин її розбито.
Це одна з причин домінування Java у секторі Enterprise-розробки. Якщо компанія має складну програму для внутрішніх потреб, яку пишуть 20 розробників, то купити ще один сервер набагато дешевше, ніж прискорити програму в 2 рази.
— Так от виявляється в чому річ.
— Але! Щоразу, коли розробник вирішує використовувати ще одну нитку, він вирішує одну проблему, а створює дві. Занадто багато ниток не збільшать продуктивність програми до нескінченності.
По-перше, у будь-якій програмі є робота, яку неможливо розбити на частини та виконувати паралельно у різних нитках. По-друге, всі нитки виконуються на тому самому процесорі. Що більше ниток, то повільніше працює кожна з них.
І, найголовніше – нитки часто використовують одні й ті ж об'єкти (їх зазвичай називають ресурсами, що розділяються).
Наприклад, нитка хоче зберегти у файл інформацію про зроблену роботу. Якщо таких ниток кілька, і вони хочуть записати інформацію в один файл – вони заважатимуть один одному. Щоб у файлі був мішанини, кожна нитка користується унікальним доступом до файлу – тобто. доки файлом користується одна нитка, інші чекають.
— Так, я пам'ятаю, це робиться за допомогою ключового слова synchronized.
— Так, саме.
— А якщо нитки пишуть до різних файлів?
— Формально – це різні об'єкти, але жорсткий диск один.
— Тобто. реально щось розпаралелити можна лише всередині процесора?
— Формально – Так, як тільки твоїй нитці треба щось ще крім даних, які вона має, це щось уже може бути зайняте іншою ниткою і доведеться чекати.
— І що ж робити? Як дізнатися – робити багато ниток чи ні?
— Це визначається безпосередньо архітектурою програми. Будь-який проект має його «архітектор», який знає всі «ресурси», які використовуються в програмі, знає їх обмеження, і наскільки вони добре/погано паралеляться.
— А якщо я не знаю?
— Тут є два варіанти:
а) попрацювати під керівництвом такого фахівця
б) набити шишок самому
— Я – робот, у мене не буває шишок – тільки вм'ятини.
— Ну, значить, набити вм'ятин.
— Зрозуміло дякую. Ти прояснила деякі питання, про які я вже почав ламати голову.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ