Яка різниця між паралельністю та паралелізмом?
Приклади цінуються.
Яка різниця між паралельністю та паралелізмом?
Приклади цінуються.
Відповіді:
Паралельність - це коли два чи більше завдань можна починати, виконувати та виконувати за певні періоди часу, що перетинаються. Це не обов'язково означає, що вони обидва будуть працювати в один і той же момент. Наприклад, багатозадачність на одноядерній машині.
Паралелізм - це коли завдання буквально виконуються одночасно, наприклад, на багатоядерному процесорі.
Цитуючи Посібник з багатопотокового програмування Sun :
Паралельність: Умова, яка існує, коли хоча б дві нитки прогресують. Більш узагальнена форма паралелізму, яка може включати врізання часу як форму віртуального паралелізму.
Паралелізм: умова, яка виникає, коли виконуються принаймні дві нитки одночасно.
Плутанина існує тому, що значення словника обох цих слів майже однакові:
І все ж спосіб їх використання в інформатиці та програмуванні зовсім інший. Ось моя інтерпретація:
То що я маю на увазі під вищезазначеними визначеннями?
Я уточнимо реальною світовою аналогією. Скажімо, ви повинні виконати 2 дуже важливих завдання за один день:
Тепер проблема полягає в тому, що завдання-1 вимагає від вас поїхати в надзвичайно бюрократичний урядовий офіс, який змушує вас чекати 4 години в черзі, щоб отримати паспорт. Тим часом завдання-2 вимагає ваш офіс, і це критичне завдання. Обидва повинні бути закінчені в конкретний день.
Зазвичай, ви їдете до паспортного офісу протягом 2 годин, будете чекати в черзі протягом 4 годин, виконати завдання, проїхати дві години назад, поїхати додому, не проспатись ще 5 годин і зробити презентацію.
Але ти розумний. Ви плануєте заздалегідь. Ви носите з собою ноутбук, і, поки чекаєте в черзі, ви починаєте працювати над своєю презентацією. Таким чином, як тільки ви повернетесь додому, вам просто потрібно працювати 1 додаткову годину замість 5.
У цьому випадку обидва завдання ви виконуєте, лише по шматочках. Ви перервали паспортне завдання, поки чекали в рядку і працювали над презентацією. Коли ваш номер зателефонував, ви перервали завдання презентації та перейшли до паспортного завдання. Економія часу була, по суті, можливою завдяки переривці обох завдань.
Паралельність, IMO, можна розуміти як властивість "ізоляції" в ACID . Дві транзакції з базою даних вважаються ізольованими, якщо суб-транзакції можна виконувати кожен і будь-яким переплетеним способом, а кінцевий результат такий же, як якщо б дві завдання виконувались послідовно. Пам'ятайте, що як для паспорта, так і для презентаційних завдань, ви єдиний кат .
Тепер, оскільки ви такий розумний хлопець, ви, очевидно, вищий, і у вас є помічник. Отже, перед тим, як піти, щоб розпочати завдання паспорта, ви телефонуєте йому і говорите йому підготувати перший проект презентації. Ви витрачаєте цілий день і закінчите паспортне завдання, повертаєтесь і бачите свої листи, і ви знайдете проект презентації. Він зробив досить грунтовну роботу, і за допомогою кількох редагувань ще за 2 години ви доопрацюєте її.
Відтоді ваш помічник такий же розумний, як і ви, він міг працювати над цим самостійно , не потребуючи постійно просити роз'яснення. Таким чином, через незалежність завдань вони виконувались одночасно двома різними катами .
Ще зі мною? Добре ...
Пам’ятайте своє паспортне завдання, де вам доведеться чекати в рядку? Оскільки це ваш паспорт, ваш помічник не може чекати в черзі до вас. Таким чином, паспортне завдання має переривчастість (ви можете зупинити його, поки ви чекаєте в рядку, і відновити його пізніше, коли ваш номер буде викликаний), але ніякої незалежності (ваш помічник не може чекати замість вас).
Припустимо, урядовий офіс має перевірку безпеки для входу в приміщення. Тут ви повинні видалити всі електронні пристрої та надіслати їх офіцерам, і вони повернуть ваші пристрої лише після виконання завдання.
У цьому випадку паспортне завдання не є ні незалежним, ні переривним . Навіть якщо ви чекаєте в черзі, ви не можете працювати над чимось іншим, бо не маєте необхідного обладнання.
Так само, скажімо, презентація настільки високо математична за своєю суттю, що вам потрібно 100% концентрація принаймні 5 годин. Ви не можете зробити це, чекаючи черги на паспортне завдання, навіть якщо у вас ноутбук із собою.
У цьому випадку завдання презентації є незалежним (ви або ваш помічник можете поставити за 5 годин цілеспрямовані зусилля), але не переривається .
Тепер скажіть, що крім призначення свого помічника на презентацію, ви також носите з собою ноутбук для виконання паспортного завдання. Поки чекаєте в рядку, ви бачите, що ваш помічник створив перші 10 слайдів у спільній колоді. Ви надсилаєте коментарі до його роботи з деякими виправленнями. Пізніше, коли ви повернетесь додому, замість 2 годин, щоб доопрацювати чернетку, вам знадобиться лише 15 хвилин.
Це стало можливим, оскільки завдання презентації має незалежність (будь-хто з вас це може зробити) та переривчивість (ви можете зупинити її та відновити пізніше). Таким чином, ви одночасно виконували обидва завдання та паралельно виконували завдання презентації.
Скажімо, що крім надто бюрократичної, урядова служба є корумпованою. Таким чином, ви можете показати свою ідентифікацію, ввести її, почати чекати в черзі на те, щоб викликати ваш номер, підкупити охоронця та когось іншого, щоб зайняти вашу позицію в лінії, викрастись, повернутися до того, як ваш номер буде названий, і продовжити очікування себе.
У цьому випадку ви можете виконувати як паспортні, так і презентаційні завдання одночасно та паралельно. Ви можете викрастися, а ваше місце займає ваш помічник. Ви обидва можете працювати над презентацією тощо.
Наведемо приклади сценаріїв, типових для кожного з цих випадків:
Якщо ви бачите, чому Роб Пайк говорить, що сумісність краще, ви повинні зрозуміти, що причина. У вас дійсно довге завдання, в якому є кілька періодів очікування, коли ви чекаєте деяких зовнішніх операцій, таких як читання файлів, завантаження в мережу. У своїй лекції все, що він говорить, - "просто розбийте це довге послідовне завдання, щоб ви могли зробити щось корисне, поки будете чекати". Ось чому він розмовляє про різні організації з різними ховрахами.
Тепер сила Go полягає в тому, щоб зробити цю помилку дійсно простою за допомогою go
ключових слів і каналів. Крім того, існує чудова підтримка під час виконання програми для планування цих програм.
Але по суті, чи паралелізм кращий за паралелізм?
Чи яблука краще, ніж апельсини?
Мені подобається розмова Роб Піка: Паралельність - це не паралелізм (це краще!) (Слайди) (розмова)
Роб зазвичай розмовляє про Go і зазвичай розглядає питання Конкурсу проти Паралелізму у візуальному та інтуїтивно зрозумілому поясненні! Ось короткий підсумок:
Завдання: спалимо купу застарілих мовних посібників! По одному!
Паралельність: Є багато одночасно декомпозицій завдання! Один приклад:
Паралелізм: попередня конфігурація відбувається паралельно, якщо одночасно працюють принаймні 2 ховрахи чи ні.
Щоб додати те, що сказали інші:
Паралельність - це те, що жонглер жонглює багатьма кулями. Незалежно від того, як це здається, жонглер одночасно ловить / кидає по одній кулі за руку. Паралелізм - це декілька жонгльорів, які жонглюють кулями одночасно.
Скажімо, у вас є програма, яка має дві нитки. Програма може працювати двома способами:
Concurrency Concurrency + parallelism
(Single-Core CPU) (Multi-Core CPU)
___ ___ ___
|th1| |th1|th2|
| | | |___|
|___|___ | |___
|th2| |___|th2|
___|___| ___|___|
|th1| |th1|
|___|___ | |___
|th2| | |th2|
В обох випадках ми маємо сумісність із простого факту, що у нас працює більше ніж одна нитка.
Якби ми запустили цю програму на комп'ютері з одним ядром процесора, ОС би перемикалася між двома потоками, дозволяючи одночасно запускати один потік.
Якби ми запустили цю програму на комп’ютері з багатоядерним процесором, ми змогли б запустити два потоки паралельно - поруч у той самий час.
Паралельність: якщо дві або більше проблем вирішуються одним процесором.
Паралельність: Якщо одну проблему вирішують кілька процесорів.
Спробую пояснити цікавим і легким для розуміння прикладом. :)
Припустимо, що організація організовує шаховий турнір, де 10 гравців ( з рівними навичками шахової гри ) будуть кидати виклик професійному шахісту чемпіона . А оскільки шахи - це гра 1: 1, таким чином організаторам доводиться проводити 10 ігор в найкоротші терміни, щоб вони могли закінчити весь захід якнайшвидше.
Сподіваємось, що наступні сценарії легко описують кілька способів проведення цих 10 ігор:
1) СЕРІЙНИЙ - скажемо, що професіонал грає з кожною людиною один за одним, тобто починає і закінчує гру з однією людиною, а потім починає наступну гру з наступною людиною тощо. Іншими словами, вони вирішили проводити ігри послідовно. Отже, якщо на одну гру потрібно 10 хвилин, то на 10 ігор знадобиться 100 хвилин, також припустимо, що перехід від однієї гри до іншої займає 6 секунд, то для 10 ігор це буде 54 секунди (приблизно 1 хв).
тож вся подія приблизно завершиться за 101 хв. ( ПІШИЙ ПІДХІД )
2) СУЧАСНИЙ - сказати, що професіонал грає свою чергу і переходить до наступного гравця, тому всі 10 гравців грають одночасно, але професійний гравець не з двома особами одночасно, він грає свою чергу і переходить до наступної людини. Тепер припустимо, що професійному гравцеві потрібно відіграти свою чергу 6 секунд, а також час переходу професійного гравця з б / у двох гравців - 6 секунд, тому загальний час переходу для повернення до першого гравця становитиме 1 хвилину (10x6 сек). Тому до того часу, коли він повернеться до першої особи, з якою розпочалася подія, минуло 2 хвилини (10xtime_per_turn_by_champion + 10xtransition_time = 2 хвилини)
Якщо припустити, що всі гравці беруть 45 сек, щоб завершити свою чергу, виходячи з 10 хвилин на гру від СЕРІЙНОЇ події, немає. раундів до закінчення гри має становити 600 / (45 + 6) = 11 раундів (приблизно)
Таким чином, вся подія приблизно завершиться за 11xtime_per_turn_by_player _ & _ чемпіон + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20,35 хв (приблизно)
СМ поліпшення від 101 хвилин до 20.35 хв ( найкращий підхід )
3) PARALLEL - дозвольмо сказати, що організатори отримують додаткові кошти, і тому вирішили запросити двох професійних гравців-чемпіонів (обох однаково здатних) і розділили набір тих же 10 гравців (претендентів) на дві групи з 5-ти кожного та призначили їх двом чемпіонам, одному згрупуйте кожен. Зараз подія проходить паралельно в цих двох сетах, тобто щонайменше два гравці (по одному в кожній групі) грають проти двох професійних гравців у відповідній групі.
Однак у групі професійний гравець, який приймає одного гравця одночасно (тобто послідовно), тому без будь-якого підрахунку ви можете легко вивести, що ціла подія приблизно завершиться за 101/2 = 50,5 хвилин, щоб завершити
ДИВІТТЕ ПОЛОЖЕННЯ від 101 хв до 50,5 хв. ( ДОБРИЙ ПІДХІД )
4) СУЧАСНИЙ + ПАРАЛЕЛЬ - У вищеописаному сценарії скажемо, що два гравці-чемпіони будуть грати одночасно (читати другу точку) з 5 гравцями у відповідних групах, тому зараз ігри в різних групах проводяться паралельно, але всередині групи вони працюють одночасно.
Таким чином, ігри в одній групі приблизно завершаться за 11xtime_per_turn_by_player _ & _ чемпіон + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930сек = 15,5хв (приблизно)
Таким чином, вся подія (за участю двох таких паралельних бігових груп) приблизно завершиться за 15,5 хв
ВИДІТЬСЯ РОЗШИРЕННЯ від 101 хв до 15,5 хв ( найкращий підхід )
ПРИМІТКА: у вищеописаному сценарії, якщо ви заміните 10 гравців на 10 подібних робочих місць та двох професійних гравців з двома ядрами процесора, знову ж таки наступне впорядкування залишиться вірним:
СЕРІЙНА> ПАРАЛЕЛЬ> СУЧАСНА> СТВОРЕНА + ПАРАЛЕЛЬНА
(ПРИМІТКА. Цей порядок може змінитися для інших сценаріїв, оскільки це впорядкування сильно залежить від взаємозалежності робочих місць, потреб в комунікаціях, робочих робочих місцях та перехідних накладних робочих потреб)
Простий приклад:
Паралельно: "Дві черги, що отримують доступ до одного банкомата"
Паралельна: "Дві черги та два банкомати"
Уявіть, що ви вивчаєте нову мову програмування, переглядаючи відеоурок. Вам потрібно призупинити відео, застосувати сказане в коді, а потім продовжити перегляд. Це паралельність.
Тепер ти професійний програміст. І вам подобається слухати спокійну музику під час кодування. Ось паралелізм.
Як розповів Ендрю Герран в блозі GoLang
Паралельність - це вирішення справи з багатьма речами одночасно. Паралелізм - це робити багато справ одночасно.
Насолоджуйтесь.
Вони вирішують різні проблеми. Паралельність вирішує проблему з обмеженими ресурсами процесора та безліччю завдань. Отже, ви створюєте потоки або незалежні шляхи виконання за допомогою коду, щоб поділити час на дефіцитний ресурс. До недавнього часу в обговоренні домінувала паралельність через доступність процесора.
Паралелізм вирішує проблему пошуку достатньої кількості завдань та відповідних завдань (тих, які можна правильно розділити) та розподілити їх на багаті ресурси ЦП. Паралелізм завжди був, звичайно, але він виходить на перший план, тому що багатоядерні процесори такі дешеві.
конкретність: безліч потоків виконання з можливістю розподілу ресурсів
Наприклад: два потоки конкурують за порт вводу / виводу.
паралелізм: розділення проблеми на кілька подібних фрагментів.
Наприклад: розбір великого файлу, запустивши два процеси на кожній половині файлу.
Виконання одночасного програмування має 2 типи: непаралельне одночасне програмування та паралельне одночасне програмування (також відоме як паралелізм).
Ключова відмінність полягає в тому, що для людського ока нитки в непаралельній сумісності здаються одночасно запущеними, але насправді вони цього не роблять. У паралельних потоках одночасності потоки швидко перемикаються і по черзі використовують процесор через часове відсікання. У той час як паралелізм є декілька процесорів, тому декілька потоків можуть працювати на різних процесорах одночасно.
Паралелізм - це одночасне виконання процесів на multiple cores per CPU
або multiple CPUs (on a single motherboard)
.
Паралельність - це коли паралелізм досягається single core/CPU
за допомогою використання алгоритмів планування, що ділить час процесора (часовий відрізок). Процеси переплетені .
Одиниці:
- 1 або багато ядер в одному процесорі (майже всі сучасні процесори)
- 1 або багато процесорів на материнській платі (думаю, що сервери старих шкіл)
- 1 додаток - 1 програма (думаю, браузер Chrome)
- 1 програма може мати 1 або багато процесів (думаю, що кожна вкладка браузера Chrome - це процес)
- 1 процес може мати 1 або багато потоків з 1 програми (вкладка Chrome, яка відтворює відео Youtube в 1 потоці, інша нитка породжена для розділу коментарів, інша для інформації про вхід користувачів)
- Таким чином, 1 програма може мати 1 або багато потоків виконання
- 1 процес є
thread(s)+allocated memory resources by OS
(купа, регістри, стек, пам'ять класу)
Паралельність => Коли декілька завдань виконуються у періоди, що перетинаються, із спільними ресурсами (можливо, максимальне використання ресурсів).
Паралельно => коли окреме завдання поділяється на кілька простих незалежних підзадач, які можна виконувати одночасно.
Подумайте про це як обслуговування черг, де сервер може обслуговувати лише перше завдання в черзі.
1 сервер, 1 черга завдань (з 5 робочими місцями) -> немає одночасності, немає паралелізму (до завершення обслуговується лише одна робота, наступна робота в черзі повинна зачекати, поки виконана відремонтована робота і іншого сервера немає обслуговування)
1 сервер, 2 або більше різних черг (з 5 завданнями в черзі) -> сумісність (оскільки сервер обмінює час з усіма 1-ю роботами в черзі, однаково або зважено), все ще немає паралелізму, оскільки в будь-який момент існує одна і єдина робота, яку обслуговують.
2 або більше серверів, одна черга -> паралелізм (2 завдання, виконані в один і той же момент), але немає одночасності (сервер не ділиться часом, 3-е завдання потрібно чекати, поки один із серверів завершиться.)
2 або більше серверів, 2 або більше різних черг -> одночасність і паралельність
Іншими словами, паралельність - це спільний час для завершення роботи, МОЖЕ зайняти той самий час, щоб виконати свою роботу, але принаймні розпочати роботу рано. Важливим є те, що робочі місця можна розрізати на менші робочі місця, що дозволяє переплутати.
Паралелізм досягається за допомогою більшої кількості процесорів, серверів, людей тощо, які працюють паралельно.
Майте на увазі, якщо ресурси поділяються, чистого паралелізму неможливо досягти, але саме там паралелізм мав би найкраще практичне використання, зайнявши іншу роботу, яка не потребує цього ресурсу.
Я хочу запропонувати відповідь, яка трохи конфліктує з деякими популярними відповідями тут. На мою думку, паралельність - це загальний термін, що включає паралелізм. Паралельність застосовується до будь-якої ситуації, коли різні завдання або одиниці роботи перетинаються в часі. Паралелізм стосується конкретніших ситуацій, коли окремі одиниці роботи оцінюються / виконуються в один і той же фізичний час. Паралелізм є прискоренням програмного забезпечення, що прискорює програмне забезпечення, яке може отримати вигоду з безлічі фізичних ресурсів обчислення. Інша основна концепція, яка підпадає під паралельність, - це інтерактивність. Інтерактивністьзастосовується, коли перекриття завдань спостерігається із зовнішнього світу. Раціональний інтеракційний інтерактивність - це створення програмного забезпечення, яке реагує на реальні об'єкти, такі як користувачі, мережеві однорангові, апаратні периферійні пристрої тощо.
Паралельність та інтерактивність майже повністю незалежний вимір паралельності. Для конкретного проекту розробники можуть дбати про будь-яке, і те, і інше. Вони, як правило, плутаються, не в останню чергу, тому що гидота, яка є нитками, дає досить зручний примітив, щоб робити і те, і інше.
Ще трохи детальніше про паралелізм :
Паралелізм існує на дуже малих масштабах (наприклад, паралелізм рівня інструкцій у процесорах), середніх масштабах (наприклад, багатоядерні процесори) та великих масштабах (наприклад, високопродуктивні обчислювальні кластери). Тиск на розробників програмного забезпечення для викриття більшої нитки паралелізму на рівні потоку в останні роки посилився через зростання багатоядерних процесорів. Паралелізм тісно пов'язаний з поняттям залежності . Залежності обмежують ступінь досягнення паралелізму; дві задачі не можна виконувати паралельно, якщо одна залежить від іншої (Ігнорування спекуляцій).
Існує безліч шаблонів і рамок, які програмісти використовують для вираження паралелізму: трубопроводи, пули завдань, сукупні операції над структурами даних ("паралельні масиви").
Ще трохи детальніше про інтерактивність :
Найбільш основний і поширений спосіб інтерактивності - це події (тобто цикл подій та обробники / зворотні виклики). Для простих завдань події чудово підійдуть. Намагаючись виконувати більш складні завдання з подіями, потрапляє у видобуток стека (він же пеклує зворотний дзвінок; він же інверсія управління). Коли ви втомитеся від подій, ви можете спробувати більш екзотичні речі, такі як генератори, підпрограми (aka Async / Await) або кооперативні теми.
Для любові до надійного програмного забезпечення, будь ласка, не використовуйте теми, якщо ви збираєтесь інтерактивність.
Кмітливість
Мені не подобається гасло Роба Пайка "паралельність - це не паралелізм; це краще". Паралельність не є ні кращою, ні гіршою, ніж паралелізм. Паралельність включає інтерактивність, яку не можна порівняти кращим / гіршим способом з паралелізмом. Це як би сказати "керуючий потік краще, ніж дані".
В електроніці послідовний і паралельний являють собою тип статичної топології, що визначає фактичну поведінку ланцюга. Коли немає одночасності, паралелізм визначається .
Для того, щоб описати динамічні явища , пов'язані з часом , ми використовуємо терміни послідовний і одночасний . Наприклад, певний результат може бути отриманий через певну послідовність завдань (наприклад, рецепт). Коли ми з кимось спілкуємось, ми виробляємо послідовність слів. Однак насправді багато інших процесів відбуваються в той самий момент і, таким чином, погоджуються з фактичним результатом певної дії. Якщо багато людей розмовляють одночасно, паралельні переговори можуть заважати нашій послідовності, але результати цього втручання заздалегідь невідомі. Паралельність вводить невизначеність .
Послідовна / паралельна та послідовна / паралельна характеристика є ортогональними. Прикладом цього є цифровий зв’язок. У послідовному адаптері цифрове повідомлення тимчасово (тобто послідовно ) поширюється по одній і тій же лінії зв'язку (наприклад, один провід). У паралельному перехіднику це розділяється також на паралельні лінії зв'язку (наприклад, багато проводів), а потім реконструюється на приймальному кінці.
Давайте зобразимо гру з 9 дітьми. Якщо ми розпорядимось ними як ланцюжком, дамо повідомлення спочатку і отримаємо його в кінці, ми мали б послідовний зв’язок. Більше слів складають повідомлення, що складаються в послідовності єдностей зв’язку.
I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....
Це послідовний процес, відтворений в серійній інфраструктурі .
Тепер давайте зобразити дітей на групи по 3. Ділимо словосполучення на три частини, першу подаємо дитині рядка зліва, другу - дочірній лінії дитини тощо.
I like ice-cream so much. > I like > X > X > X > .... > ....
> ice-cream > X > X > X > ....
> so much > X > X > X > ....
Це послідовний процес, відтворений у паралельній інфраструктурі (хоча частково серіалізований).
В обох випадках, якщо припустити, що між дітьми ідеальне спілкування, результат визначається заздалегідь.
Якщо є інші люди, які спілкуються з першою дитиною одночасно з вами, то у нас будуть одночасні процеси . Ми не знаємо, який процес буде розглянуто інфраструктурою, тому кінцевий результат не визначається заздалегідь.
Паралельність - це узагальнена форма паралелізму. Наприклад, паралельну програму також можна назвати одночасною, але зворотне не відповідає дійсності.
Одночасне виконання можливе на одному процесорі (кілька потоків, якими керує планувальник або пул потоків)
Паралельне виконання можливе не на одному процесорі, а на декількох процесорах. (Один процес на процесор)
Розподілене обчислення також є суміжною темою, і його також можна назвати паралельними обчисленнями, але зворотне не відповідає дійсності, як паралелізм.
Детальніше читайте в цьому дослідницькому документі Концепції паралельного програмування
Мені дуже сподобалося це графічне зображення з іншої відповіді - я думаю, що він відповідає на питання набагато краще, ніж багато з вищезазначених відповідей
Паралелізм проти одночасності Коли дві нитки працюють паралельно, вони працюють одночасно. Наприклад, якщо у нас є дві нитки, A і B, то їх паралельне виконання виглядатиме так:
ЦП 1: ------------------------->
ЦП 2: Б ------------------------->
Коли два потоки працюють одночасно, їх виконання перекривається. Перекриття може статися одним із двох способів: або потоки виконуються одночасно (тобто паралельно, як вище), або їх виконання перемежовуються на процесор так:
ЦП 1: A -----------> B ----------> A -----------> B -------- ->
Отже, для наших цілей паралелізм можна розглядати як особливий випадок одночасності
Джерело: Тут ще одна відповідь
Сподіваюся, що це допомагає.
Я на насправді , як Пол М'ясник відповідь на це питання (він автор сім паралелізм моделей в семи тижнях ):
Хоча вони часто плутаються, паралелізм і одночасність - це різні речі. Паралельність - це аспект проблемної області - ваш код повинен обробляти декілька одночасних (або майже одночасних) подій . Паралелізм, навпаки, є аспектом домену рішення - ви хочете, щоб ваша програма працювала швидше, паралельно обробляючи різні частини проблеми. Деякі підходи застосовні до паралельності, деякі до паралелізму, а інші до обох. Зрозумійте, з чим ви стикаєтесь, і виберіть правильний інструмент для роботи.
Паралельність може включати завдання, які виконуються одночасно чи ні (вони дійсно можуть бути запущені в окремих процесорах / ядрах, але вони також можуть бути запущені "тиками"). Що важливо , що паралелізм завжди відноситься до робити частину однієї великої праці . Тому в основному це частина деяких обчислень. Ви повинні бути розумними щодо того, що ви можете робити одночасно, а що не робити і як синхронізувати.
Паралелізм означає, що ви просто робите деякі речі одночасно. Їм не потрібно бути частиною вирішення однієї проблеми. Наприклад, ваші потоки можуть вирішити одну проблему. Звичайно, також стосується синхронізації, але з іншого погляду.
«Паралелізм», коли є кілька речей , в ході .
«Паралелізм», коли одночасно речі розвиваються одночасно .
Приклади одночасності без паралелізму:
SqlDataReader
s на з'єднанні MARS .Однак зауважте, що різниця між паралельністю та паралелізмом часто є питанням перспективи. Наведені вище приклади є не паралельними з точки зору (спостережуваних ефектів) виконання вашого коду. Але існує паралелізм на рівні навчань навіть у межах одного ядра. Є частини обладнання, які роблять паралельно з процесором, а потім переривають процесор, коли це завершено. Графічний процесор може малюватися на екрані під час виконання віконної процедури чи обробника подій. СУБД може пересувати B-дерева для наступного запиту, поки ви ще отримуєте результати попереднього запиту. Під час виконання вашого веб-переглядача веб-переглядач може робити макет або мережу Promise.resolve()
. І т.д. тощо.
Так що ви йдете. Світ так само безладний, як завжди;)
На мою думку, найпростіший та найелегантніший спосіб розуміння двох. Паралельність дозволяє переплутати виконання і так може дати ілюзію паралелізму. Це означає, що паралельна система може запускати ваше відео на YouTube поряд із написанням документа в Word, наприклад. Базова ОС, будучи одночасною системою, дає можливість цим завданням поєднати їх виконання. Оскільки комп'ютери виконують інструкції так швидко, це створює зовнішній вигляд одночасно робити дві речі.
Паралелізм - це коли такі речі справді йдуть паралельно. У наведеному вище прикладі ви можете виявити, що код обробки відео виконується на одному ядрі, а програма Word працює на іншому. Зауважте, що це означає, що паралельна програма також може бути паралельною! Структурування програми за допомогою потоків і процесів дозволяє програмі використовувати базовий апарат і, можливо, робити це паралельно.
Чому б тоді все не було паралельно? Однією з причин є те, що паралельність є способом структурування програм і є дизайнерським рішенням для полегшення розділення проблем, тоді як паралелізм часто використовується в ім'я ефективності. Інше полягає в тому, що деякі речі принципово не можна повністю зробити паралельно. Прикладом цього може бути додавання двох речей на звороті черги - ви не можете вставити обидва одночасно. Щось повинно пройти перше, а інше за ним, інакше ви зіпсуєте чергу. Хоча ми можемо переплутати таке виконання (і таким чином ми отримаємо одночасну чергу), ви не можете його паралельно.
Сподіваюся, це допомагає!
Одночасне програмування стосується операцій, які, як видається, перекриваються, і в першу чергу стосуються складності, яка виникає через недетермінований потік управління. Кількісні витрати, пов'язані з одночасними програмами, як правило, є як пропускною здатністю, так і затримкою. Одночасні програми часто пов'язані з вводу-виводу, але не завжди, наприклад, одночасні збирачі сміття повністю є на процесорі. Педагогічний приклад паралельної програми - веб-сканер. Ця програма ініціює запити на веб-сторінки та приймає відповіді одночасно, коли результати завантажень стають доступними, накопичуючи набір вже відвіданих сторінок. Контрольний потік є недетермінованим, оскільки відповіді не обов'язково надходять у тому самому порядку щоразу при запуску програми. Ця характеристика може зробити дуже важким налагодження одночасних програм. Деякі програми є принципово одночасними, наприклад веб-сервери повинні одночасно обробляти клієнтські з'єднання. Erlang - це, мабуть, найбільш перспективна мова для майбутнього програмування.
Паралельне програмування стосується операцій, які перекриваються задля конкретної мети покращення пропускної здатності. Труднощі паралельного програмування усуваються шляхом детермінованості потоку управління. Зазвичай програми створюють набори наборів дочірніх завдань, які виконуються паралельно, а батьківське завдання продовжується лише після того, як кожен підзадач буде завершений. Це робить паралельні програми набагато легшими для налагодження. Важкою частиною паралельного програмування є оптимізація продуктивності стосовно таких питань, як деталізація та комунікація. Останнє все ще залишається проблемою в контексті багатоядерних осередків, оскільки є значна вартість, пов’язана з переносом даних з одного кеша в інший. Помноження щільної матриці на матрицю - це педагогічний приклад паралельного програмування, і це можна ефективно вирішити, використовуючи Страасен ' s алгоритм розділення та підкорення та паралельна атака на субпроблеми. Cilk - це, мабуть, найперспективніша мова для високопродуктивного паралельного програмування на комп'ютерах спільної пам'яті (включаючи багатоядерні).
Скопійовано з моєї відповіді: https://stackoverflow.com/a/3982782
Паралелізм: Маючи декілька потоків, виконайте подібні завдання, незалежні одна від одної з точки зору даних та ресурсів, які для цього потрібні. Наприклад: Google-сканер може породжувати тисячі ниток, і кожен потік може виконувати це завдання самостійно.
Паралельність: Паралельність з'являється, коли ви обмінюєтесь даними, спільним ресурсом між потоками. У транзакційній системі це означає, що вам доведеться синхронізувати критичний розділ коду, використовуючи такі методи, як Замки, Семафори тощо.
(Я дуже здивований, таке фундаментальне питання роками не вирішується правильно та акуратно ...)
Коротше кажучи, і паралельність, і паралелізм є властивостями обчислень .
Що стосується різниці, ось пояснення від Роберта Харпера :
Перше, що потрібно зрозуміти - паралелізм не має нічого спільного з одночасністю . Паралельність пов'язана з недетермінованим складом програм (або їх компонентів). Паралелізм стосується асимптотичної ефективності програм з детермінованою поведінкою. Паралельність полягає в тому, щоб керувати некерованими: події надходять з незалежних нам причин, і ми повинні на них відповідати. Користувач клацає мишкою, менеджер вікон повинен відповідати, хоча дисплей вимагає уваги. Такі ситуації по суті недетерміновані, але ми також працюємо проформанедетермінізм у детермінованій обстановці, роблячи вигляд, що компоненти сигналізують про події у довільному порядку, і що ми повинні реагувати на них у міру їх виникнення. Недетермінований склад - це потужна ідея структурування програми. Паралелізм, з іншого боку, стосується залежностей між підрахунками детермінованих обчислень. Результат не викликає сумнівів, але існує багато засобів для його досягнення, деякі ефективніші, ніж інші. Ми хочемо використати ці можливості на нашу користь.
Вони можуть бути різновидами ортогональних властивостей у програмах. Прочитайте цю публікацію в блозі для додаткових ілюстрацій. І цей дещо більше обговорював різницю щодо компонентів у програмуванні , як потоки.
Зауважте, що нитка або багатозадачність - це всі варіанти обчислень, які служать більш конкретним цілям. Вони можуть бути пов'язані з паралелізмом і одночасністю, але не суттєвим чином. Таким чином, навряд чи вони хороші, щоб почати пояснення.
Ще одна родзинка: (фізичний) "час" майже не має нічого спільного з властивостями, що обговорюються тут. Час - це лише спосіб здійснення вимірювання, щоб показати значущість властивостей, але далеко не суть. Подумайте двічі роль "часу" у часовій складності - яка більш-менш схожа, навіть вимірювання в цьому випадку часто більш вагоме.
"Паралельно" одночасно робить щось - що завгодно. Вони можуть бути різними речами або одними і тими ж. Незважаючи на прийняту відповідь, якої бракує, справа не в тому, щоб "виявитися одночасно". Це справді одночасно. Для запуску паралельного коду вам потрібно кілька ядер CPU, або використовуючи спільну пам'ять в одному хості, або розподілену пам'ять на різних хостах. Трубопроводи з 3 різних завдань, які одночасно виконуються одночасно, є прикладом: Рівень задач-2 повинен чекати підрозділів, виконаних рівнем задач-1, а рівень завдання 3 повинен чекати на одиниці роботи, виконані завдання-рівень-2. Інший приклад - сумісність 1-виробника з 1 -м споживачем; або багато виробників і 1 споживач; читачі та письменники; та ін.
"Паралельно" одночасно робить ті самі речі. Це одночасно, але, крім того, це та сама поведінка, що відбувається в один і той же час, і, як правило, за різними даними. Матрична алгебра часто може бути паралельна, тому що у вас одна і та ж операція виконується неодноразово: Наприклад, суми стовпців матриці можуть бути обчислені одночасно, використовуючи ту саму поведінку (суму), але в різних стовпцях. Це загальна стратегія розділити (розділити) стовпці між наявними процесорними ядрами, щоб у вас було близько однакової кількості робіт (кількості стовпців), що обробляється кожним ядром процесора. Ще один спосіб розділити роботу - це сумні завдання, коли працівники, які закінчують свою роботу, повертаються до менеджера, який роздає роботу та отримує більше роботи динамічно, поки все не буде зроблено. Алгоритм оформлення квитків - ще один.
Не просто числовий код можна паралелізувати. Файли занадто часто можна обробляти паралельно. У програмі обробки природних мов для кожного з мільйонів файлів документів вам може знадобитися підрахувати кількість лексем у документі. Це паралельно, тому що ви рахуєте жетони, що є однаковою поведінкою для кожного файлу.
Іншими словами, паралелізм - це коли однакова поведінка виконується одночасно. Одночасно означає одночасно, але не обов'язково однакову поведінку. Паралель - це особливий вид одночасності, коли те саме відбувається одночасно.
Наприклад, терміни включатимуть атомні інструкції, критичні розділи, взаємне виключення, очікування закрутки, семафори, монітори, бар'єри, передачу повідомлень, зменшення карти, серцебиття, дзвінок, алгоритми продажу квитків, потоки, MPI, OpenMP.
Робота Грегорі Ендрюса - це головний підручник з нього: багатопотокове, паралельне та розподілене програмування.
Конкурс простий означає, що виконується кілька завдань (не потрібно паралельно). Наприклад, якщо у нас є 3 завдання, то в будь-який момент часу: більше одного може працювати або всі працювати одночасно.
Паралелізм означає, що вони буквально працюють паралельно. Тож у цьому випадку всі три мають працювати одночасно.
Поняття Пайка "одночасність" - це умисне рішення щодо розробки та реалізації. Дизайн програми, сумісний із сумісними технологіями, може демонструвати поведінковий "паралелізм" або не мати його; це залежить від середовища виконання.
Ви не хочете, щоб паралелізм демонструвався програмою, яка не була розроблена для одночасності. :-) Але в тій мірі, коли це чистий приріст для відповідних факторів (енергоспоживання, продуктивності тощо), ви хочете мати максимально одночасну конструкцію, щоб хост-система могла паралелізувати її виконання, коли це можливо.
Мова програмування Pike's Go ілюструє це вкрай: його функції - це всі потоки, які можуть працювати одночасно правильно, тобто виклик функції завжди створює потік, який буде працювати паралельно абоненту, якщо система на це здатна. Додаток із сотнями чи навіть тисячами ниток - цілком звичайний у його світі. (Я не експерт Go, це лише мій погляд на це.)