Паралельне програмування: опис, технологія, завдання і переваги

Паралельне програмування: опис, технологія, завдання і переваги

Ідеї паралельних обчислень і обробки інформації довгий час були приділом фахівців і досить значною проблемою в плані реалізації. Особливого значення і масового інтересу вони набули не так давно.

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


Технології паралельного програмування кардинально змінилися. Початкове застосування комп 'ютерних пристроїв як обчислювачів плавно перейшло у використання їх як обробників інформації. Жорсткі архітектурні рішення поступилися місцем семантиці та гнучкому розподілу програмного функціоналу по "апаратних виконавцях".

Паралельні обчислення: сенс і реалізація

Спочатку основи паралельного програмування закладалися в архітектурі обчислювальних пристроїв. Була запропонована класифікація на основі поняття потоку.

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

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

Така ідея призвела до чотирьох архітектур:

  • SISD - простий потік команд і простий потік даних;
  • MISD - множинний потік команд і простий потік даних;
  • SIMD - простий потік команд і множинний потік даних;
  • MIMD - багатоваріантний потік команд і множинний потік даних.

Ці ідеї існували відносно довго, але не призвели до особливих ефектів. Сьогодні - це історія важкого початку. Але цей початок створив фундамент для сучасних досягнень.


Недолік архітектурної ідеї: відсутність семантики

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

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

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

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

Промислове застосування паралельності

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

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

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

Windows і їй подібні системи закріпили цю ідею і фактично зробили її законодавчою нормою: паралельність і обмін повідомленнями - це одне ціле для всякої багатопроцесорної, багатоядерної, а по суті - для будь-якої інформаційної системи.


Від обчислень до обробки інформації

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

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

Апаратна складова

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

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

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


Сьогодні кількість ядер процесора, кількість процесорів, рівень технології, паралельність і функціональність коду критичні навіть непосвяченому користувачеві.

Математичний апарат

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

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

Процесор комп 'ютера тільки формулює прості команди на відображення інформації або вибірку її з відеопам' яті, інше - турбота процесора відеокарти.

Власне, математичні обчислення вже давно були виділені з основного процесора в математичний співпроцесор. В даний час це теж норма речей.


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

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

Об 'єктно-орієнтоване програмування

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

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

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


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

Кластери і розподілена паралельність

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

Характерна риса інтернет-програмування:

  • невизначеність;
  • множинність;
  • одночасність.

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

Очевидне рішення: розмістити сайт на безлічі серверів або кластерів за територіальною ознакою, і тоді кожен регіон буде обслуговувати конкретний сервер. Але сучасний сайт не тільки надає інформацію, а й використовує її. Наприклад, інтернет-магазин не може торгувати повітрям і, якщо один виріб було придбано в Москві, він повинен зникнути зі складу для споживача у Владивостоці.

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

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

Кластер, як варіант паралельної реалізації

Прийнято вважати, що кластер - це різновид розподіленої паралельної обробки інформації. Це сукупність комп 'ютерів, з' єднаних високошвидкісними лініями зв 'язку.

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

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

"Життя" сучасного об 'єкта

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

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

Поведінка клієнта призводить до запиту на сервер для оновлення частини сторінки. Запит відпрацьовується, створюється маса об 'єктів, сервер відсилає результат назад. Наступний запит... знову маса об 'єктів, знову відсилається результат. Фактично виходить, що при сучасному підході сервер "не пам 'ятає" що, коли і куди він послав. При кожному зверненні він повторює мінімально необхідні дії, створює всі ті ж системи об 'єктів.

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

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