Concurrency and Parallelism
Конкурентность и Параллелизм - это методы повышения производительности и быстродействия программы за счет выполнения нескольких задач одновременно, как внешне, так и фактически.
Конкурентность
Конкурентная обработка означает, что программа выполняет несколько задач одновременно или, по крайней мере, кажется, что оно выполняет их одновременно (concurrently).
Если в компьютере только один центральный процессор, приложение не сможет выполнять более одной задачи одновременно, но внутри приложения может выполняться более одной задачи. Чтобы выполнять более одной задачи одновременно, центральный процессор переключается между задачами в процессе выполнения. Это показано на схеме ниже:
Параллельное выполнение
Параллельное выполнение это когда у компьютера несколько процессоров или ядер и он одновременно выполняет несколько задач. Однако параллельное выполнение - это не то же самое, что конкурентное. Параллельное выполнение показано ниже:
Параллельное конкурентное выполнение
Возможно параллельное конкурентное выполнение, при котором потоки распределяются между несколькими процессорами. Таким образом, потоки, выполняемые на одном процессоре - выполняются конкурентно, а потоки, выполняемые на разных процессорах - параллельно. На схеме ниже показано параллельное конкурентное выполнение:
Параллелизм
Термин параллелизм означает, что программа разбивает свои задачи на более мелкие подзадачи, которые могут выполняться параллельно, например на нескольких процессорах одновременно. Таким образом, параллелизм — это не та же модель выполнения, что и параллельное конкурентное выполнение, даже если на первый взгляд они похожи.
Для достижения настоящего параллелизма в программе должно быть запущено более одного потока, и каждый поток должен работать на отдельном процессоре/ядре процессора/ядре графического процессора видеокарты или аналогичном устройстве.
На диаграмме ниже показана более крупная задача, которая разбита на 4 подзадачи. Эти 4 подзадачи выполняются 4 разными потоками, которые работают на 2 разных процессорах. Это означает, что часть этих подзадач выполняется конкурентно (на одном процессоре), а часть - параллельно (на разных процессорах).
Если бы вместо этого 4 подзадачи выполнялись 4 потоками, работающими на разных процессорах (всего 4 процессора), то выполнение задачи было бы полностью параллельным. Однако не всегда легко разбить задачу на столько же подзадач, сколько доступно процессоров. Часто проще разбить задачу на несколько подзадач, которые естественным образом связаны с основной задачей, а затем позволить планировщику потоков распределить потоки между доступными процессорами.
Сочетание параллелизма и конкурентности
Можно сказать, что конкурентная обработка - это способ, с помощью которого один центральный процессор может выполнять несколько задач одновременно (то есть конкурентно).
Параллелизм, с другой стороны, связан с тем, как программа может распараллеливать выполнение одной задачи - обычно за счёт разделения задачи на подзадачи, которые можно выполнять параллельно.
Эти два стиля выполнения можно комбинировать в рамках одной программы.
Конкурентно, но не Параллельно
Программа может быть конкурентной, но не параллельной. Это значит, что она выполняет несколько задач одновременно (конкурентно), но переключается между ними по мере выполнения каждой из них - до тех пор, пока задачи не будут выполнены. Настоящего параллельного выполнения задач в параллельных потоках/на разных процессорах не происходит.
Параллельно, но не Конкурентно
Программа может быть параллельной, но не конкурентной. Это означает, что она работает только над одной задачей за раз и эта задача разбивается на подзадачи, которые могут выполняться параллельно. Однако каждая задача (+ подзадача) должна быть завершена до того, как следующая задача будет разделена и выполнена параллельно.
Ни Конкурентно, ни Параллельно
Кроме того, программа может быть ни конкурентной, ни параллельной. Это означает, что он выполняет только одну задачу за раз и эта задача никогда не разбивается на подзадачи для параллельного выполнения. Это может относиться к небольшим приложениям командной строки, в которых есть только одна задача, слишком простая для распараллеливания.
Конкурентно и Параллельно
Наконец, программа может быть как конкурентной, так и параллельной в двух отношениях:
Первый вариант - простое конкурентное параллельное выполнение. Это происходит, когда программа запускает несколько потоков, которые затем выполняются на нескольких процессорах.
Второй способ - программа одновременно работает над несколькими задачами, а также разбивает каждую задачу на подзадачи для параллельного выполнения. Однако в этом случае некоторые преимущества конкурентной обработки и параллельности могут быть утрачены, поскольку процессоры в компьютере и так достаточно загружены при использовании только конкурентной или параллельной обработки. Их сочетание может привести лишь к незначительному повышению производительности или даже к её снижению. Прежде чем слепо внедрять параллельную модель, обязательно необходимо проводить анализ и измерения.