Перейти до змісту

Concurrency, Parallelism, asynchronous, synchronous

Concurrency - одночасно декілька задач(розбивати задачі) виконувати переключаючись між ними.

Parallelism - реально ОДНОЧАСНО виконувати дві задачі. Для цього потрібно декілька процесорів чи ядер процессорів.

Синхронне виконання(однопоточне) - виконання задачі за задачею. Після завершення однієї виконуться друга.(БЕЗ РОЗБИВАННЯ).

Синхронне виконання(багатопоточне) - одночасне виконання задач на різних потоках.(без розбивання)

Асинхронне виконання(однопоточне) - виконання задач, розбитих на підзадачі в різному порядку.

Асинхронне виконання(багатопоточне) - те саме, тільки в різних потоках

Concurrency (Конкурентність)

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

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

Паралельне виконання

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

Паралельне конкурентне виконання

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

Паралелізм

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

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

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

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

Комбінації конкурентності та паралелізму

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

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

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

Конкурентне, але не паралельне

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

Паралельне, але не конкурентне

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

Ні конкурентне, ні паралельне

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

Конкурентне і паралельне

Нарешті, застосунок також може бути і конкурентним, і паралельним двома способами:

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

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