Яка різниця між паралельним програмуванням і паралельним програмуванням?


346

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

Наразі я знайшов таке пояснення: http://www.linux-mag.com/id/7411 - але "паралельність є властивістю програми" проти "паралельне виконання - це властивість машини" для мене недостатньо. - все одно я не можу сказати, що є що.


Відповіді:


310

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

Ось наочний приклад. Нитки на машині без різьби :

        --  --  --
     /              \
>---- --  --  --  -- ---->>

Нитки на різьбовій машині:

     ------
    /      \
>-------------->>

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


34
Паралельне виконання та паралельне програмування - це не одне і те ж. Відповідь Джона Харропа правильна. Але, схоже, саме питання плутає паралельне виконання та паралельне програмування.
Blaisorblade

3
Здатність виконувати нитки паралельно залежить від більш ніж просто машини. Наприклад, OCaml (і Python?) Виконує потоки одночасно, але не паралельно, завдяки глобальному блокуванню сміттєзбірника.
Джон Харроп

1
Відповідно до цього блогу , паралельне програмування - це не підмножина паралельного програмування ; Ви відповідаєте, це не враховує, що ви думаєте про це твердження?
Кевін

1
@Kevin: Я думаю, що "більш загальне" означає суперсет. Я згоден, що це неправильно.
Джон Харроп

1
Ця відповідь хороша для візуалізації різниці між паралельним та паралельним виконанням, але не для оригінального запитання про програмування .
Reorx

396

Одночасне програмуваннящо стосується операцій, які, як видається, перекриваються і в першу чергу стосуються складності, яка виникає через недетермінований потік управління. Кількісні витрати, пов'язані з одночасними програмами, як правило, є як пропускною здатністю, так і затримкою. Одночасні програми часто пов'язані з вводу-виводу, але не завжди, наприклад, одночасні збирачі сміття повністю є процесором. Педагогічний приклад паралельної програми - веб-сканер. Ця програма ініціює запити на веб-сторінки та приймає відповіді одночасно, коли результати завантажень стають доступними, накопичуючи набір вже відвіданих сторінок. Контрольний потік є недетермінованим, оскільки відповіді не обов'язково надходять у одному порядку під час кожного запуску програми. Ця характеристика може зробити дуже важким налагодження одночасних програм.Ерланг , асинхронні робочі процеси F # та бібліотека Akka Scala - це, мабуть, найбільш перспективні підходи до програмування з високою сумісністю.

Багатоядерне програмуванняє особливим випадком паралельного програмування. Паралельне програмування стосується операцій, які перекриваються задля конкретної мети покращення пропускної здатності. Труднощі паралельного програмування усуваються шляхом детермінованості потоку управління. Зазвичай програми створюють набори наборів дочірніх завдань, які виконуються паралельно, а батьківське завдання продовжується лише після того, як кожен підзадач буде завершений. Це робить паралельні програми набагато простішими для налагодження, ніж паралельні програми. Важкою частиною паралельного програмування є оптимізація продуктивності стосовно таких питань, як деталізація та комунікація. Останнє все ще залишається проблемою в контексті багатоядерних осередків, оскільки є значна вартість, пов'язана з переносом даних з одного кеша в інший.Cilk - це, мабуть, найбільш перспективний підхід для високоефективного паралельного програмування на багатоядерних системах, і він був прийнятий як в ниткових будівельних блоках Intel, так і в бібліотеці завдань паралельної програми Microsoft (в .NET 4).


18
"Важка частина паралельного програмування ... наприклад, деталізація та комунікація." Якщо паралельні завдання потребують спілкування, чи це не робить їх одночасними?
Justin M. Keyes

13
"Якщо паралельні завдання потребують спілкування, чи це не робить їх одночасними?". Ух, чудове запитання! Не обов’язково, ні. Суперкомп'ютери часто програмуються за допомогою масових паралельних операцій з подальшим глобальним перерозподілом даних та більшою масою паралелізму. Таким чином, існує паралелізм і комунікація, але про це не можна говорити. У цьому контексті я думав більше про багатоядерний паралелізм, коли спілкування означає складність кешу, наприклад, комунікацію, необхідну для когерентності кешу. Хоча це паралельно, це також безпосередньо не видно.
Джон Харроп

43
@BoppityBop Тільки тому, що я можу сказати на кресленні те, що він сказав у романі, не робить мою відповідь менш правильною. Просто простіше читати тим, хто насправді не знає відповіді. Я думаю, це сенс прийти сюди. Ви можете написати книгу мовою, якою користується ця публікація, але це для більшості читачів буде абсолютно неприємним, оскільки ви, мабуть, не гуглили це питання, якщо вже знаєте половину того, що написав Джон.
Tor Valamo

18
Картина була дуже корисною для мене, хтось досить новий у цій темі, і опис від @JonHarrop був мені корисний, хтось, хто цінує правильну, навіть якщо технічну, мову. Обидві відповіді сприяли моєму більш повному розумінню. Ми всі перемагаємо! (хоча я дуже вдячний за різницю між паралельним виконанням та паралельним програмуванням)
Sammaron

3
"Ерланг - це, мабуть, найбільш перспективна майбутня мова ...". Цікавий вибір слів, оскільки Ерлангу виповнилося ~ 30 років, його відкрили в 1998 році.
steinar

151

https://joearms.github.io/publisher/2013-04-05-concurrent-and-parallel-programming.html

Паралельно = Дві черги та одна кавоварка.

Паралельно = Дві черги та дві кавомашини.


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

Паралельний код вимагає двох або більше процесорів (або "кавоварок"). Таким чином, ця відповідь по суті неправильна.
Джеффрі Андерсон

6
@GeoffreyAnderson Ні, це не так. Наприклад, потоки та процеси виконуються одночасно на одній основній машині.
Джон Харроп

@FrankHB - Погляньте на stackoverflow.com/a/57223044/1406510 та перегляньте посилання на джерело - на сайті Oracle - Тож це не може бути помилковим, але наше розуміння може бути. Тож час переосмислити. Я змінив свій погляд, прочитавши це.
nanosoft

@GeoffreyAnderson - перегляньте stackoverflow.com/a/57223044/1406510. Він містить посилання від Oracle і чітко вказує, що є що. Тож потрібно з цим узгодитись.
nanosoft

40

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

У паралельних обчисленнях два обчислення просуваються незалежно один від одного. Друге обчислення не повинно чекати, поки перше закінчиться, щоб просунутися. Однак не зазначено механізму, як це досягти. При одноядерному налаштуванні потрібне призупинення та чергування між потоками (їх також називають попередньою багатопотоковістю).

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

Зображення зі статті: "Паралель проти паралельного в Node.js"

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



21

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

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


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

14

Я знайшов цей вміст у якомусь блозі. Думав, що це корисно і актуально.

Паралельність і паралелізм НЕ одне і те ж. Дві задачі T1 і T2 є паралельними, якщо порядок, у якому обидва завдання виконуються вчасно, не визначений,

T1 може бути виконаний і закінчений перед T2, T2 може бути виконаний і закінчений до того, як T1, T1 і T2 можуть бути виконані одночасно в один і той же екземпляр часу (паралелізм), T1 і T2 можуть бути виконані альтернативно, ... Якщо два одночасних потоки заплановані операційною системою на одному одноядерному процесорі, що не є SMT, не CMP, ви можете отримати паралельність, але не паралелізм. Паралелізм можливий у багатоядерних, багатопроцесорних або розподілених системах.

Паралельність часто називають властивістю програми і є поняттям більш загальним, ніж паралелізм.

Джерело: https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming


9

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

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

Те, що вони намагаються обговорити, це той факт, що колись у більшості комп'ютерів був лише один процесор. Коли ви виконували кілька процесів (або потоків) на цьому єдиному процесорі, CPU реально виконував лише одну інструкцію з одного з цих потоків одночасно. Поява паралельності було ілюзією - перемикання процесора між виконанням інструкцій з різних потоків досить швидко, що для людського сприйняття (до якого що-небудь менше 100 мс або так виглядає миттєво) виглядало так, ніби він робить багато справ одночасно.

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

Тепер проблема: такого чистого розмежування майже ніколи не існувало. Дизайнери комп’ютерів насправді досить розумні, тому вони давно помітили, що (наприклад), коли вам потрібно прочитати деякі дані з пристрою вводу / виводу, такого як диск, потрібно багато часу (з точки зору циклу процесора), щоб закінчити. Замість того, щоб залишати процесор у режимі очікування, поки це сталося, вони з'ясували різні способи дозволити одному процесу / потоку зробити запит вводу / виводу, і дозволити коду з якогось іншого процесу / потоку виконуватись на процесорі, поки запит вводу / виводу завершений.

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

Це лише верхівка айсберга. Десятиліття тому комп'ютери також почали забезпечувати інший рівень паралелізму. Знову ж таки, будучи досить розумними людьми, дизайнери комп’ютерів помітили, що у багатьох випадках вони мали інструкції, які не впливали один на одного, тому було можливо виконати більше однієї інструкції з одного потоку одночасно. Одним із ранніх прикладів, які стали досить відомими, були дані Control Control 6600. Це був (з досить широким відривом) найшвидший комп'ютер на землі, коли він був представлений у 1964 році - і значна частина тієї ж базової архітектури залишається у використанні і сьогодні. Він відслідковував ресурси, що використовуються кожною інструкцією, і мав набір одиниць виконання, які виконували інструкції, як тільки ресурси, від яких вони залежали, стали доступними, дуже схожі на дизайн останніх процесорів Intel / AMD.

Але (як говорили рекламні ролики) чекати - це ще не все. Є ще один елемент дизайну, який додасть ще більше плутанини. Дано досить багато різних імен (наприклад, "Hyperthreading", "SMT", "CMP"), але всі вони посилаються на одну і ту ж основну ідею: процесор, який може виконувати кілька потоків одночасно, використовуючи комбінацію деяких ресурсів, є незалежними для кожного потоку та деякими ресурсами, які спільно використовуються між потоками. У типовому випадку це поєднується з паралелізмом рівня інструкцій, описаним вище. Для цього у нас є два (або більше) наборів архітектурних регістрів. Тоді у нас є набір одиниць виконання, які можуть виконувати інструкції, як тільки потрібні ресурси стануть доступними.

Тоді, звичайно, ми потрапляємо до сучасних систем з декількома ядрами. Тут все очевидно, правда? У нас є N (десь від 2 до 256 або більше, на даний момент) окремих ядер, які можуть виконувати вказівки одночасно, тому у нас є чіткий випадок реального паралелізму - виконання інструкцій в одному процесі / потоці не ' t впливати на виконання інструкцій в іншому.

Ну, начебто. Навіть у нас є деякі незалежні ресурси (регістри, одиниці виконання, принаймні один рівень кешу) та деякі спільні ресурси (як правило, принаймні найнижчий рівень кешу, і, безумовно, контролери пам'яті та пропускна здатність пам’яті).

Підсумовуючи: прості сценарії люблять контрастувати між спільними ресурсами та незалежними ресурсами практично ніколи не трапляються в реальному житті. З усіма спільними ресурсами ми закінчуємо щось подібне до MS-DOS, де ми можемо запускати лише одну програму за один раз, і нам потрібно припинити запуск однієї, перш ніж ми можемо запустити іншу. Маючи повністю незалежні ресурси, у нас є N комп’ютерів, що працюють під управлінням MS-DOS (навіть без мережі для їх підключення), не маючи можливості взагалі нічого ділити між ними (адже якщо ми навіть зможемо поділитися файлом, ну це спільний ресурс, порушення основної передумови ні про що не поділяється).

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

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

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


6
  • Concurrent programmingв загальному сенсі позначати середовища, в яких задані нами завдання можуть виникати в будь-якому порядку. Одне завдання може виникати до або після іншого, і деякі або всі завдання можна виконувати одночасно.

  • Parallel programmingполягає в конкретному посиланні на одночасне виконання одночасних завдань на різних процесорах. Таким чином, все паралельне програмування є одночасним, але не все паралельне програмування є паралельним.

Джерело: Програмування PThreads - стандарт POSIX для кращої багатопроцесорної роботи, Buttlar, Farrell, Nichols


5

У програмуванні одночасність - це склад незалежно виконуваних процесів, тоді як паралелізм - це одночасне виконання (можливо, пов'язаних) обчислень.
- Ендрю Герранд -

І

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

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

Щоб зрозуміти різницю, я настійно рекомендую переглянути це відео Роб Пайк (один із творців Golang). Паралельність - це не паралелізм


Тут не працює посилання vimeo - це посилання youtube.com/watch?v=cN_DpYBzKso
Shivprasad Koirala

5

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

Однак одночасне програмування складається з коду, який виконується різними процесами / потоками, які поділяють змінні і таке інше, тому при одночасному програмуванні ми повинні встановити якесь правило, щоб вирішити, який процес / потік виконується спочатку, ми хочемо цього, щоб ми могли бути впевнені там буде послідовність і що ми можемо з упевненістю знати, що буде. Якщо немає контролю і всі потоки обчислюють одночасно і зберігають речі на одних і тих же змінних, то як би ми знали, чого очікувати в підсумку? Можливо, потік швидший за інший, можливо, одна з ниток навіть зупинилася в середині її виконання, а інша продовжила інше обчислення з пошкодженою (ще не повністю обчисленою) змінною, можливості нескінченні. У таких ситуаціях ми зазвичай використовуємо паралельне програмування замість паралельного.


5

Класичне планування завдань може бути послідовним , паралельним або паралельним .

  • Послідовний : завдання повинні виконуватись одне за іншим у відомому хитромудрий порядку, інакше воно не спрацює. Досить просто.

  • Паралельно : завдання потрібно виконувати одночасно або це не спрацює.

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

    Спробуйте уникнути цього, інакше у нас буде час сліз.

  • Паралельно : нам все одно. Ми, однак, недбалі: ми проаналізували це, і це не має значення; Тому ми можемо виконати будь-яке завдання, використовуючи будь-який доступний об'єкт у будь-який час. Щасливі дні.

Часто доступне планування змінюється на відомих подіях, які ми називаємо зміною стану.

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

Вдало проектування систем стосується таких питань:

  • дієслово - що ти робиш (операція чи алгоритм)
  • іменник - для чого ви це робите (дані чи інтерфейс)
  • коли - ініціація, розклад, зміни стану
  • як - послідовний, паралельний, паралельний
  • де - як тільки ви дізнаєтесь, коли щось відбувається, ви можете сказати, де вони можуть статися, а не раніше.
  • чому - це спосіб це зробити? Чи є інші шляхи, і що важливіше, кращий спосіб? Що станеться, якщо цього не зробити?

Удачі.


8
Я бачу шапки скрізь
Бруно Пентеадо

10
Ця відповідь є складнішою, ніж теми паралельності та паралелізму разом.
Kai Sellgren

3

Я зрозумів, що різниця:

1) Паралельно - працює в тандемі з використанням спільних ресурсів 2) Паралельно - працює поруч, використовуючи різні ресурси

Таким чином, ви можете мати дві речі, що відбуваються одночасно, незалежно одна від одної, навіть якщо вони збираються разом у точках (2) або дві речі, що спираються на однакові резерви протягом усіх операцій, що виконуються (1).


3

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

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

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

Джерело : Вступ до паралельного програмування, Пітер Пачеко


1

Джерело паралельності та паралелізму

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

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

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

Наприклад, у множенні матриці, що має однакову кількість потоків та процесорів, кожен потік (і кожен процесор) обчислює рядок результату.


Це джерело лише показує особливий випадок реалізації - спеціалізовану форму багатопотокової роботи. Так, він навіть не охоплює всю історію багатопотокової роботи, наприклад, модель різьблення різьби користувачів M: N та роль планування потоків. Нитка - це лише спеціалізований спосіб реалізації в сенсі архітектури системи (ОС, VM, процесор з включеним HT тощо) та / або інтерфейс програмування. Існує більше, як паралелізм на рівні інструкцій у впровадженні сучасного процесора, який не має інтерфейсу програмування і не має нічого спільного з потоками.
FrankHB

@FrankHB: Буду вдячний, якщо ви можете поділитися будь-якими автентичними посиланнями щодо вашого вмісту. Я дуже хотів би вивчити, чи є в ньому більше. Моє сучасне розуміння є досить спрощеним - запуск багатопотокового додатка для заданої архітектури ОС із заданим механізмом планування потоків це паралельне чи паралельне питання? Навіть якщо ви надали простір користувачів M: N - як ви зрозумієте, чи RUN паралельний чи паралельний?
nanosoft

Я написав відповідь, щоб обговорити проблеми в різних абстракціях.
FrankHB

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

0

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

Основна абстракція робиться в інформатиці, де і паралельність, і паралелізм приписуються властивостям програм . Тут програми формалізовані описи обчислень. Такі програми не повинні містити будь-яку конкретну мову або кодування, що залежить від реалізації. Існування API / ABI / ISA / OS не має значення для такого рівня абстракції. Безумовно, для виконання конкретних робіт з програмування потрібні більш детальні знання (як модель різьблення), але дух основної абстракції не змінюється.

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

Для загального розрізнення дивіться відповідну відповідь на основний погляд на паралелізм проти паралелізму. (Є також деякі посилання, що містять деякі додаткові джерела.)

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

Мова програмування може розкривати призначені властивості за допомогою вбудованих семантичних правил. У більшості випадків такі правила визначають оцінку конкретних мовних структур (наприклад, виразів), що робить обчислення ефективно одночасними або паралельними. (Більш конкретно, обчислювальні ефекти, що мають на увазі оцінювання, можуть чудово відображати ці властивості.) Однак паралельна / паралельна семантика мови по суті є складною і не потрібна практичним роботам (для реалізації ефективних паралельних / паралельних алгоритмів як рішення реалістичних задач ). Отже, більшість традиційних мов застосовують більш консервативний і простіший підхід: припускаючи семантику оцінювання повністю послідовну і послідовну, а потім надаючи додаткові примітиви, щоб дозволити деякимз обчислень одночасних і паралельних. Ці примітиви можуть бути ключовими словами або процедурними конструкціями ("функціями"), що підтримуються мовою. Вони реалізуються на основі взаємодії з розміщеними середовищами (ОС або апаратним інтерфейсом «голий метал»), як правило, непрозорі (не можуть бути отримані з використанням мови переносним способом) до мови. Таким чином, у цьому конкретному виді абстракцій високого рівня, які спостерігаються програмістами, нічого не відбувається паралельно, окрім цих "магічних" примітивів та програм, що покладаються на ці примітиви; тоді програмісти можуть користуватися менш сприйнятливим до помилок досвідом програмування, коли властивості паралелізму / паралелізму не так зацікавлені.

Хоча примітиви абстрагують комплекс у найбільш абстракціях високого рівня, реалізація все ще має додаткову складність, не піддану мовній особливості. Отже, потрібні деякі абстракції середнього рівня. Один типовий приклад - різьба . Threading дозволяє виконувати один або декілька потоків виконання (або просто нитки ; іноді його також називають процесом , який не обов'язково є концепцією завдання, запланованого в ОС), підтримуваної мовною реалізацією (час виконання). Нитки, як правило, попередньо плануються за часом виконання, тому нитка не повинна нічого знати про інші потоки. Таким чином, нитки природні для здійснення паралелізму до тих пір, поки вони нічого не ділять ( критичні ресурси)): просто розкладіть обчислення в різних потоках, як тільки основна реалізація дозволить перекривати ресурси обчислень під час виконання, вона працює. Нитки також підлягають одночасному доступу до спільних ресурсів: просто доступ до ресурсів у будь-якому порядку відповідає мінімальним обмеженням, необхідним алгоритмом, і реалізація врешті визначає, коли отримати доступ. У таких випадках можуть знадобитися деякі операції синхронізації. Деякі мови трактують нитки та операції синхронізації як частини абстракції високого рівня та виставляють їх як примітиви, в той час як деякі інші мови натомість заохочують лише порівняно більше примітивів високого рівня (наприклад, ф'ючерси / обіцянки ).

Під рівнем мовних потоків відбувається багатозадачність базового середовища хостингу (як правило, ОС). Переважна багатозадачність на рівні ОС використовується для реалізації (попереджувальної) багатопотоковості. У деяких середовищах, таких як Windows NT, основні блоки планування (завдання) також є "потоками". Для розмежування їх із реалізацією в потоці користувачів ниток, згаданих вище, вони називаються потоками ядра, де "ядро" означає ядро ​​ОС (однак, строго кажучи, це не зовсім вірно для Windows NT; "справжнє" ядро ​​- це NT виконавчий) . Потоки ядра не завжди відображаються в потоках простору користувачів 1: 1, хоча відображення 1: 1 часто зменшує більшу частину накладних витрат. Оскільки нитки ядра мають велику вагу (із залученням системних дзвінків) для створення / знищення / спілкування,зелені нитки в просторі користувачів для подолання накладних проблем ціною відображення накладних витрат. Вибір відображення залежно від парадигми програмування, очікуваної в абстракції високого рівня. Наприклад, коли величезна кількість потоків простору користувачів очікується одночасно виконувати (як, наприклад, Erlang ), 1: 1 відображення ніколи не представляється можливим.

В основі багатозадачності ОС лежить багатозадачність на рівні ISA, що надається логічним ядром процесора. Зазвичай це самий низькорівневий публічний інтерфейс для програмістів. Під цим рівнем може існувати ЗПТ . Це форма багатопотокової багаторівневої обробки, реалізована апаратним шляхом, але, можливо, все ще дещо програмована - хоча вона, як правило, доступна лише виробником процесора. Зауважте, що апаратний дизайн, очевидно, відображає паралелізм, але існує також паралельний механізм планування для ефективного використання внутрішніх апаратних ресурсів.

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


0

Просто поділіться прикладом, який допомагає виділити відмінність:

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

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

Як ще хтось зазначав, кожна паралельна програма є одночасною (повинна бути насправді), але не навпаки.


0

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

Візьмемо приклад, скажімо, домашні справи: прибирання посуду, вивезення сміття, скошування газону тощо, також у нас є 3 людини (нитки) A, B, C, щоб їх робити

Паралельно: три особи починають різні завдання самостійно, тобто

A --> cleaning dishes
B --> taking out trash 
C --> mowing the lawn 

Тут порядок виконання завдань неінтермінований і відповіді залежать від обсягу роботи

Паралельно: Тут, якщо ми хочемо покращити пропускну здатність, ми можемо призначити кілька людей для однієї задачі, наприклад, для чищення посуду ми призначаємо двох людей, миття посуду та B миття посуду, що може покращити пропускну здатність.

чистка посуду:

A --> soaping the dishes
B --> washing the dishes

так далі

Сподіваюсь, це дає ідею! тепер переходимо до технічних умов, які пояснені в інших відповідях;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.