В чем разница между параллелизмом и параллелизмом?
Примеры приветствуются.
В чем разница между параллелизмом и параллелизмом?
Примеры приветствуются.
Параллельность - это когда две или более задач могут запускаться, выполняться и завершаться в перекрывающиеся периоды времени. Это не обязательно означает, что они оба будут работать одновременно. Например, многозадачность на одноядерной машине.
Параллелизм - это когда задачи выполняются буквально одновременно, например, на многоядерном процессоре.
Цитирование руководства по многопоточному программированию Sun:
Параллельность: условие, которое существует, когда по крайней мере два потока достигают прогресса. Более обобщенная форма параллелизма, которая может включать в себя квантование времени как форму виртуального параллелизма.
Параллельность: условие, которое возникает, когда по крайней мере два потока выполняются одновременно.
Путаница существует, потому что значения обоих слов в словаре почти одинаковы:
Однако то, как они используются в информатике и программировании, совершенно иное. Вот моя интерпретация:
Итак, что я имею в виду под вышеприведенными определениями?
Я поясню с реальной аналогией. Допустим, вы должны выполнить 2 очень важных задачи за один день:
Теперь проблема в том, что задача 1 требует, чтобы вы пошли в чрезвычайно бюрократическое правительственное учреждение, которое заставляет вас ждать 4 часа в очереди, чтобы получить свой паспорт. Между тем, задача-2 требуется вашим офисом, и это критически важная задача. Оба должны быть закончены в определенный день.
Обычно вы едете в паспортный стол на 2 часа, ждете в очереди 4 часа, выполняете задание, возвращаетесь на два часа назад, возвращаетесь домой, еще 5 часов бодрствуете и делаете презентацию.
Но ты умный. Вы планируете заранее. Вы носите с собой ноутбук и, ожидая в очереди, начинаете работать над презентацией. Таким образом, как только вы вернетесь домой, вам просто нужно работать 1 дополнительный час вместо 5.
В этом случае обе задачи выполняются вами по частям. Вы прервали задание на паспорт во время ожидания в очереди и работали над презентацией. Когда вам позвонили, вы прервали презентацию и переключились на паспорт. Экономия времени была по существу возможна благодаря прерыванию обеих задач.
Параллелизм, IMO, можно понимать как свойство "изоляции" в ACID. Две транзакции базы данных считаются изолированными, если субтранзакции могут выполняться любым и любым способом с чередованием, и конечный результат такой же, как если бы две задачи выполнялись последовательно. Помните, что как для паспортных, так и для презентационных задач вы являетесь единственным исполнителем.
Теперь, когда вы такой умный парень, вы, очевидно, выше, и у вас есть помощник. Поэтому, прежде чем уйти, чтобы начать задание на паспорт, позвоните ему и скажите, чтобы он подготовил первый проект презентации. Вы тратите весь свой день и заканчиваете задание на паспорт, возвращаетесь и смотрите свои письма, и вы находите черновик презентации. Он проделал довольно солидную работу и с некоторыми правками еще через 2 часа, вы дорабатываете.
Теперь, поскольку ваш помощник такой же умный, как и вы, он мог работать над ним независимо, без необходимости постоянно запрашивать у вас разъяснения. Таким образом, из-за независимости задач они выполнялись одновременно двумя разными исполнителями.
Все еще со мной? Хорошо...
Помните свое паспортное задание, где вы должны ждать в очереди? Поскольку это ваш паспорт, ваш помощник не может ждать вас в очереди. Таким образом, задание на паспорт имеет возможность прерывания (вы можете остановить его, ожидая в очереди, и возобновить его позже, когда будет набран ваш номер), но не может быть независимым (ваш помощник не может ждать вместо вас).
Предположим, что в правительственном учреждении есть проверка безопасности для входа в помещение. Здесь вы должны удалить все электронные устройства и передать их сотрудникам, и они вернут ваши устройства только после того, как вы выполните свою задачу.
В этом случае задача паспорта не является ни независимой, ни прерываемой. Даже если вы ждете в очереди, вы не можете работать над чем-то другим, потому что у вас нет необходимого оборудования.
Точно так же, скажем, презентация настолько математична по своей природе, что вам требуется 100% концентрация в течение как минимум 5 часов. Вы не можете сделать это, ожидая очереди на паспорт, даже если у вас есть ноутбук.
В этом случае задание на презентацию является независимым (вы или ваш помощник можете приложить 5 часов целенаправленных усилий), но оно не может быть прервано.
Теперь скажем, что помимо назначения помощника на презентацию, вы также носите с собой ноутбук для выполнения паспортного задания. При ожидании в очереди вы видите, что ваш помощник создал первые 10 слайдов в общей колоде. Вы отправляете комментарии к его работе с некоторыми исправлениями. Позже, когда вы вернетесь домой, вместо 2 часов, чтобы доработать проект, вам просто понадобится 15 минут.
Это стало возможным, потому что задача презентации имеет независимость (любой из вас может это сделать) и возможность прерывания (вы можете остановить ее и возобновить позже). Таким образом, вы одновременно выполнили обе задачи и параллельно выполнили задачу представления.
Допустим, что в дополнение к чрезмерной бюрократии правительственный орган коррумпирован. Таким образом, вы можете показать свою идентификацию, ввести ее, начать ждать в очереди для вызова вашего номера, подкупить охранника и кого-то еще, чтобы удержать вашу позицию в линии, улизнуть, вернуться до того, как ваш номер будет вызван, и возобновить ожидание самостоятельно.
В этом случае вы можете выполнять как паспортные, так и презентационные задачи одновременно и параллельно. Вы можете улизнуть, и ваша позиция удерживается вашим помощником. Затем вы оба можете работать над презентацией и т.д.
В вычислительном мире приведены примеры сценариев, типичных для каждого из этих случаев:
Если вы понимаете, почему Роб Пайк говорит, что параллелизм лучше, вы должны понять, что причина в этом. У вас очень длинная задача, в которой есть несколько периодов ожидания, когда вы ожидаете некоторых внешних операций, таких как чтение файла, загрузка по сети. В своей лекции все, что он говорит, это "просто разбейте эту длинную последовательную задачу, чтобы вы могли сделать что-то полезное, пока ждете". Вот почему он говорит о разных организациях с разными сусликами.
Теперь сила Go заключается в том, чтобы сделать этот взлом действительно легким с помощью ключевого слова и каналов go
. Кроме того, имеется отличная базовая поддержка во время выполнения для планирования этих подпрограмм.
Но по сути, параллелизм лучше параллелизма?
Яблоки лучше апельсинов?
Мне нравится разговор Роб Пайка: Concurrency не Parallelism (это лучше!) (слайды) (говорить)
Роб обычно говорит о Go и обычно обращается к вопросу о Concurrency vs Parallelism в визуальном и интуитивном объяснении! Вот краткое резюме:
Задача: Позвольте записать кучу устаревших языковых руководств! По одному за раз!
Concurrency: Существует много одновременных разложений задачи! Один пример:
Parallelism: Предыдущая конфигурация происходит параллельно, если в это время работает не менее 2 сусликов.
Чтобы добавить к тому, что сказали другие:
Concurrency похож на то, что жонглер жонглирует множеством мячей. Независимо от того, как это кажется, жонглер только ловит/бросает один мяч за руку за раз. Parallelism имеет несколько жонглирующих жонглеров одновременно.
Скажем, у вас есть программа, которая имеет два потока. Программа может работать двумя способами:
Concurrency Concurrency + parallelism
(Single-Core CPU) (Multi-Core CPU)
___ ___ ___
|th1| |th1|th2|
| | | |___|
|___|___ | |___
|th2| |___|th2|
___|___| ___|___|
|th1| |th1|
|___|___ | |___
|th2| | |th2|
В обоих случаях мы имеем параллелизм из-за того факта, что у нас запущено более одного потока.
Если бы мы запустили эту программу на компьютере с одним ядром ЦП, ОС переключалась бы между двумя потоками, позволяя запускать один поток за раз.
Если бы мы запустили эту программу на компьютере с многоядерным процессором, мы бы смогли запустить два потока параллельно - бок о бок в одно и то же время.
Concurrency: Если две или более проблемы решаются одним процессором.
Parallelism: Если одна проблема решена несколькими процессорами.
Я попытаюсь объяснить интересным и понятным примером.:)
Предположите, что организация организует шахматный турнир, в котором 10 игроков (с равными навыками игры в шахматы) бросят вызов шахматисту профессионального чемпиона. И так как шахматы - игра 1:1, таким образом, организаторы должны провести 10 игр в эффективном режиме, чтобы они могли закончить все событие как можно быстрее.
Надеюсь, следующие сценарии легко описывают несколько способов проведения этих 10 игр:
1) SERIAL. Позволяет сказать, что профессиональные игры с каждым человеком один за другим начинают и заканчивают игру одним человеком, а затем запускают следующую игру со следующим человеком и так далее. Другими словами, они решили проводить игры последовательно. Так что если одна игра займет 10 минут, то 10 игр пройдут 100 минут, также предположите, что переход от одной игры к другой займет 6 секунд, а затем для 10 игр это будет 54 секунды (около 1 минуты).
поэтому все событие будет приблизительно завершено за 101 минуту (WORST APPROACH)
2) CONCURRENT - скажет, что профессионал играет свою очередь и переходит к следующему игроку, поэтому все 10 игроков играют одновременно, но у профессионального игрока нет двух человек за раз, он играет поворачивается и переходит к следующему человеку. Теперь предположим, что профессиональный игрок занимает 6 секунд, чтобы сыграть свою очередь, а также время перехода профессионального игрока. Два игрока составляют 6 секунд, поэтому общее время перехода для первого игрока будет 1мин (10x6 секунд). Поэтому, к тому времени, когда он вернулся к первому человеку, с кем было запущено событие, прошло 2 миллиона (10xtime_per_turn_by_champion + 10xtransition_time = 2mins)
Предполагая, что все игроки берут 45 секунд, чтобы завершить свой ход, поэтому на основе 10 минут на игру от события SERIAL нет. раундов до окончания игры должно быть 600/(45 + 6) = 11 раундов (приблизительно)
Итак, все событие будет приблизительно завершено в 11xtime_per_turn_by_player_ & _champion + 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) CONCURRENT + PARALLEL. В приведенном выше сценарии давайте скажем, что второй чемпион-игрок будет играть одновременно (прочитайте 2-й пункт) с 5 игроками в своих соответствующих группах, так что теперь игры по группам работают параллельно, но внутри группы они работают одновременно.
Итак, игры в одной группе будут примерно завершены в 11xtime_per_turn_by_player_ & _champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930sec = 15.5mins (приблизительно)
Таким образом, все событие (включающее две такие параллельные группы) будет приблизительно завершено в 15.5mins
СМОТРИТЕ УЛУЧШЕНИЕ от 101 мин до 15,5 мин (ЛУЧШИЙ ПОДХОД)
ПРИМЕЧАНИЕ: в приведенном выше сценарии, если вы замените 10 игроков на 10 похожих заданий и двух профессиональных игроков с двумя ядрами ЦП, тогда следующий порядок останется верным:
SERIAL > PARALLEL > CONCURRENT > CONCURRENT + PARALLEL
(ПРИМЕЧАНИЕ: этот порядок может измениться для других сценариев, так как это упорядочение сильно зависит от взаимозависимости заданий, для связи требуются черно-белые задания и задания накладных расходов на перекладку)
Простой пример:
Параллельно: "Две очереди, обращающиеся к одному банкомату"
Параллель: "Две очереди и две банкоматов"
concurency: несколько потоков выполнения с возможностью совместного использования ресурсов
Пример: два потока, конкурирующих за порт ввода-вывода.
paralelism: разбивая проблему в нескольких похожих кусках.
Пример: разбор большого файла путем запуска двух процессов на каждую половину файла.
Они решают разные проблемы. Concurrency решает проблему нехватки ресурсов ЦП и многих задач. Таким образом, вы создаете потоки или независимые пути выполнения кода, чтобы разделить время на ограниченном ресурсе. До недавнего времени Concurrency доминировал в обсуждении из-за доступности процессора.
Parallelism решает проблему поиска достаточных задач и соответствующих задач (которые могут быть раздельно разделены) и распределяет их по множеству ресурсов ЦП. Parallelism всегда был вокруг, но он выходит на первый план, потому что многоядерные процессоры настолько дешевы.
Выполнение параллельного программирования имеет 2 типа: непараллельное параллельное программирование и параллельное параллельное программирование (также известное как параллелизм).
Ключевое отличие состоит в том, что для человеческого глаза потоки в параллельном параллельном режиме, кажется, работают одновременно, но на самом деле это не так. В непараллельных потоках параллелизма быстро переключаются и по очереди используют процессор через квантование времени. В параллелизме доступно несколько процессоров, поэтому несколько потоков могут работать на разных процессорах одновременно.
Представьте себе, что вы изучаете новый язык программирования, просматривая видеоурок. Вам нужно приостановить видео, применить то, что было сказано в коде, а затем продолжить просмотр. Это concurrency.
Теперь вы профессиональный программист. И вам нравится слушать спокойную музыку во время кодирования. Это Parallelism.
Enjoy.
Параллелизм - это одновременное выполнение процессов на multiple cores per CPU
на одном multiple cores per CPU
или multiple CPUs (on a single motherboard)
.
Параллелизм - это когда параллелизм достигается на single core CPU
с использованием алгоритмов планирования, которые делят время ЦП (временной интервал). Процессы чередуются.
Единицы:
thread(s)+allocated memory resources by OS
(куча, регистры, стек, память классов)Параллельность => Когда несколько задач выполняются в перекрывающиеся периоды времени с общими ресурсами (что потенциально максимизирует использование ресурсов).
Параллельно => когда одна задача делится на несколько простых независимых подзадач, которые могут выполняться одновременно.
Подумайте об этом как о очередях обслуживания, где сервер может обслуживать только одно задание в очереди.
1 сервер, 1 очередь заданий (с 5 заданиями) → no concurrency, no parallelism (Выполняется только одно задание для завершения, следующее задание в очереди должно дождаться завершения служебного задания и нет другого сервера для его обслуживания)
1 сервер, 2 или более разных очередей (с 5 заданиями в очереди) → concurrency (поскольку сервер использует время со всеми 1-м заданием в очередях, одинаково или взвешенно), по-прежнему нет parallelism, поскольку на любом мгновенно, есть одна и только работа, обслуживаемая.
2 или более серверов, одна очередь → parallelism (2 задания выполняются в одно и то же время), но нет concurrency (сервер не использует время, третье задание должно ждать завершения одного из серверов).
2 или более серверов, 2 или более разных очереди → concurrency и parallelism
Другими словами, concurrency использует время для завершения задания, он МОЖЕТ заняться тем же временем, чтобы завершить свою работу, но, по крайней мере, он начнется рано. Важно то, что задания можно нарезать на более мелкие задания, что позволяет перемежать.
Parallelism достигается с использованием только большего количества процессоров, серверов, людей и т.д., которые работают параллельно.
Имейте в виду, что если ресурсы разделены, чистая parallelism не может быть достигнута, но именно здесь concurrency будет иметь наилучшее практическое применение, заняв еще одно задание, которое не нуждается в этом ресурсе.
Я собираюсь предложить ответ, который немного конфликтует с некоторыми из популярных ответов здесь. На мой взгляд, concurrency является общим термином, который включает parallelism. concurrency применяется к любой ситуации, когда отдельные задачи или единицы работы перекрываются во времени. Parallelism применяется более конкретно к ситуациям, когда отдельные единицы работы оцениваются/выполняются в одно и то же физическое время. Разница между Parallelism ускоряет работу программного обеспечения, которое может извлечь выгоду из множества физических вычислительных ресурсов. Другим основным понятием, которое подходит под concurrency, является интерактивность. Интерактивность применяется, когда перекрытие задач можно наблюдать из внешнего мира. Разумеется, интерактивность создает программное обеспечение, которое реагирует на реальные объекты, такие как пользователи, сетевые пэры, периферийные устройства и т.д.
Parallelism, а интерактивность - почти полностью независимый размер concurrency. Для конкретного проекта разработчики могут заботиться либо обоим, либо ни тем, ни другим. Они, как правило, объединяются, не в последнюю очередь потому, что мерзость, которая является нитями, дает разумно удобный примитив, чтобы сделать то и другое.
Немного подробная информация о parallelism:
Parallelism существует в очень малых масштабах (например, уровень инструкций Parallelism в процессорах), средние масштабы (например, многоядерные процессоры) и большие масштабы (например, высокопроизводительные вычислительные кластеры). В последнее время давление на разработчиков программного обеспечения для выявления более высокого уровня Parallelism возросло из-за роста многоядерных процессоров. Parallelism тесно связан с понятием зависимости. Зависимости ограничивают степень достижения Parallelism; две задачи не могут выполняться параллельно, если каждый зависит от другого (игнорирование спекуляции).
Существует множество шаблонов и фреймворков, которые программисты используют для выражения parallelism: конвейеры, пулы задач, агрегированные операции над структурами данных ( "параллельные массивы" ).
Немного подробная информация об интерактивности:
Самый простой и общий способ интерактивности - это события (т.е. цикл событий и обработчики/обратные вызовы). Для простых задач события отличные. Попытка выполнения более сложных задач с событиями попадает в стекирование (a.k.a. callback hell, инверсия управления a.k.a.). Когда вам надоели события, вы можете попробовать более экзотические вещи, такие как генераторы, сопрограммы (a.k.a. Async/Await) или совлокальные потоки.
Для любви к надежному программному обеспечению, пожалуйста, не используйте потоки, если то, что вы собираетесь использовать, - это интерактивность.
Curmudgeonliness
Мне не нравится Rob Pike "concurrency не parallelism, это лучше". concurrency не лучше и не хуже parallelism. concurrency включает в себя интерактивность, которая не может сравниться с лучшими/худшими способами с parallelism. Это как сказать "поток управления лучше данных".
В электронике серийный и параллельный представляют собой тип статической топологии, определяющий фактическое поведение схемы. Когда нет concurrency, parallelism является детерминированным.
Для описания динамических, связанных с временем явлений мы используем термины последовательные и параллельные. Например, определенный результат может быть получен через определенную последовательность задач (например, рецепт). Когда мы говорим с кем-то, мы создаем последовательность слов. Однако на самом деле многие другие процессы происходят в один и тот же момент и, таким образом, согласуются с фактическим результатом определенного действия. Если много людей говорят одновременно, одновременные переговоры могут помешать нашей последовательности, но результаты этого вмешательства заранее не известны. Concurrency вводит неопределенность.
Сериальная/параллельная и последовательная/параллельная характеризация являются ортогональными. Примером этого является цифровое общение. В последовательном адаптере цифровое сообщение временно (то есть последовательно) распределяется по одной и той же линии связи (например, один провод). В параллельном адаптере это также разделяется на параллельные линии связи (например, многие провода), а затем реконструируется на принимающей стороне.
Давайте изобразим игру с 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 > ....
Это последовательный процесс, воспроизводимый в параллельной инфраструктуре (хотя и частично сериализованный, хотя).
В обоих случаях, если существует идеальная связь между детьми, результат определяется заранее.
Если есть другие люди, которые разговаривают с первым ребенком одновременно с вами, тогда у нас будут параллельные процессы. Мы не знаем, какой процесс будет рассмотрен инфраструктурой, поэтому окончательный результат не определяется заранее.
Параллельность - это обобщенная форма параллелизма. Например, параллельную программу также можно назвать параллельной, но обратная неверна.
Одновременное выполнение возможно на одном процессоре (несколько потоков, управляемых планировщиком или пулом потоков)
Параллельное выполнение невозможно на одном процессоре, но на нескольких процессорах. (Один процесс на процессор)
Распределенные вычисления также являются связанной темой, и их также можно назвать параллельными вычислениями, но обратное неверно, как параллелизм.
Подробнее читайте в этой статье " Концепции параллельного программирования".
Мне действительно нравится Paul Butcher ответить на этот вопрос (он автор Seven Concurrency Модели за семь недель):
Хотя они часто путаются, parallelism и Concurrency являются разные вещи. Concurrency - это аспект проблемной области - ваш код должен обрабатывать несколько одновременных (или около одновременных) Мероприятия. Parallelism, напротив, является аспектом решения домен - вы хотите, чтобы ваша программа работала быстрее, обрабатывая различные части проблемы параллельно. Некоторые подходы применимо к concurrency, некоторым - к parallelism, а некоторым - к обоим. Поймите, с кем вы столкнулись, и выберите правильный инструмент для работа.
Мне очень понравилось это графическое представление из другого ответа - я думаю, что оно отвечает на вопрос гораздо лучше, чем многие из приведенных выше ответов.
Параллельность против параллелизма Когда два потока работают параллельно, они оба работают одновременно. Например, если у нас есть два потока, A и B, их параллельное выполнение будет выглядеть так:
CPU 1: A ---------------------→
CPU 2: B ---------------------→
Когда два потока работают одновременно, их выполнение перекрывается. Перекрытие может происходить одним из двух способов: либо потоки выполняются в одно и то же время (т.е. параллельно, как указано выше), либо их исполнения чередуются на процессоре, например так:
CPU 1: A -------→ B ------→ A -------→ B -------- ->
Таким образом, для наших целей параллелизм можно рассматривать как особый случай параллелизма
Источник: еще один ответ здесь
Надеюсь, это поможет.
Concurrency может запускать задачи одновременно или нет (их действительно можно запускать в отдельных процессорах/ядрах, но они также могут выполняться в "тиках" ). Важно то, что concurrency всегда ссылается на выполнение части одной большой задачи. Таким образом, в основном это часть некоторых вычислений. Вы должны быть умны о том, что вы можете делать одновременно, а что нет и как синхронизировать.
Parallelism означает, что вы просто выполняете некоторые действия одновременно. Они не должны быть частью решения одной проблемы. Ваши потоки могут, например, решать одну проблему каждый. Конечно, материал синхронизации также применяется, но с разных точек зрения.
Параллельное программирование относится к операциям, которые кажутся перекрывающимися, и в первую очередь касается сложности, возникающей из-за недетерминированного потока управления. Количественные затраты, связанные с параллельными программами, как правило, являются как пропускной способностью, так и задержкой. Параллельные программы часто связаны с вводом-выводом, но не всегда, например, параллельные сборщики мусора полностью на CPU. Педагогическим примером параллельной программы является веб-сканер. Эта программа инициирует запросы на веб-страницы и принимает ответы одновременно, когда результаты загрузок становятся доступными, накапливая набор страниц, которые уже были посещены. Поток управления является недетерминированным, поскольку ответы не обязательно принимаются в одном и том же порядке при каждом запуске программы. Эта характеристика может сильно затруднить отладку параллельных программ. Некоторые приложения принципиально параллельны, например, веб-серверы должны обрабатывать клиентские соединения одновременно. Erlang, пожалуй, самый многообещающий новый язык для высококонкурентного программирования.
Параллельное программирование касается операций, которые перекрываются для конкретной цели повышения пропускной способности. Сложности параллельного программирования можно избежать, сделав поток управления детерминированным. Как правило, программы порождают наборы дочерних задач, которые выполняются параллельно, а родительская задача продолжается только после завершения каждой подзадачи. Это значительно облегчает отладку параллельных программ. Сложной частью параллельного программирования является оптимизация производительности в отношении таких проблем, как гранулярность и коммуникация. Последнее по-прежнему является проблемой в контексте многоядерных систем, поскольку перенос данных из одного кэша в другой сопряжен со значительными затратами. Плотное матрично-матричное умножение является педагогическим примером параллельного программирования, и его можно эффективно решить с помощью алгоритма Straasen "разделяй и властвуй" и параллельной атаки на подзадачи. Cilk, пожалуй, самый перспективный язык для высокопроизводительного параллельного программирования на компьютерах с общей памятью (включая многоядерные).
Скопировано из моего ответа: fooobar.com/questions/1721/...
"Параллелизм", когда есть несколько вещей в прогрессе.
"Параллелизм" - это когда параллельные вещи развиваются одновременно.
Примеры параллелизма без параллелизма:
SqlDataReader
для подключения MARS. Обратите внимание, однако, что разница между параллелизмом и параллелизмом часто является вопросом перспективы. Приведенные выше примеры не параллельны с точки зрения (наблюдаемых эффектов) выполнения вашего кода. Но существует параллелизм на уровне инструкций даже внутри одного ядра. Существуют аппаратные средства, выполняющие операции параллельно с процессором, а затем прерывающие работу процессора, когда это будет сделано. Графический процессор может рисовать на экране во время выполнения вашей оконной процедуры или обработчика события. СУБД может обходить B-деревья для следующего запроса, пока вы еще получаете результаты предыдущего. Браузер может выполнять компоновку или работу в сети во время выполнения Promise.resolve()
. И т.д. И т.д.
Итак, поехали. Мир как всегда грязен;)
Parallelism: Наличие нескольких потоков выполняет аналогичную задачу, которые независимы друг от друга с точки зрения данных и ресурсов, которые им необходимы для этого. Например: искатель Google может порождать тысячи потоков, и каждый поток может выполнять эту задачу независимо.
Concurrency: Concurrency входит в изображение, когда вы используете общие данные, общий ресурс среди потоков. В транзакционной системе это означает, что вам нужно синхронизировать критический раздел кода, используя некоторые методы, такие как блокировки, семафоры и т.д.
Самый простой и самый элегантный способ понять два, на мой взгляд, это. Параллелизм позволяет чередовать выполнение и, следовательно, может создавать иллюзию параллелизма. Это означает, что параллельная система может, например, запускать ваше видео на Youtube вместе с написанием документа в Word. Базовая ОС, будучи параллельной системой, позволяет этим задачам чередовать их выполнение. Поскольку компьютеры выполняют инструкции так быстро, создается впечатление, что они выполняют две вещи одновременно.
Параллелизм - это когда такие вещи действительно параллельны. В приведенном выше примере вы можете обнаружить, что код обработки видео выполняется на одном ядре, а приложение Word - на другом. Обратите внимание, что это означает, что параллельная программа также может быть параллельной! Структурирование вашего приложения с потоками и процессами позволяет вашей программе эксплуатировать базовое оборудование и потенциально может выполняться параллельно.
Почему бы не сделать все параллельно? Одна из причин заключается в том, что параллелизм - это способ структурирования программ и проектное решение, облегчающее разделение задач, тогда как параллелизм часто используется во имя производительности. Другое - то, что некоторые вещи принципиально не могут быть полностью выполнены параллельно. Примером этого может быть добавление двух вещей в конец очереди - вы не можете вставить оба одновременно. Что-то должно идти первым, а другое позади, иначе вы испортите очередь. Хотя мы можем чередовать такое выполнение (и поэтому мы получаем параллельную очередь), вы не можете иметь его параллельно.
Надеюсь это поможет!
(Я очень удивлен, что такой фундаментальный вопрос не решается правильно и аккуратно в течение многих лет...)
Короче говоря, и параллелизм, и параллелизм являются свойствами вычислений.
Что касается различий, вот объяснение от Роберта Харпера:
Первое, что нужно понять, это то, что параллелизм не имеет ничего общего с параллелизмом. Параллельность связана с недетерминированным составом программ (или их компонентов). Параллелизм связан с асимптотической эффективностью программ с детерминированным поведением. Параллельность - это управление неуправляемым: события происходят по независящим от нас причинам, и мы должны на них реагировать. Пользователь щелкает мышью, оконный менеджер должен ответить, даже если дисплей требует внимания. Такие ситуации по своей природе недетерминированы, но мы также используем формальный недетерминизм в детерминированной обстановке, делая вид, что компоненты сигнализируют о событиях в произвольном порядке, и что мы должны реагировать на них по мере их возникновения. Недетерминированная композиция - это мощная идея структурирования программы. Параллелизм, с другой стороны, все о зависимостях среди подвычислений детерминированного вычисления. Результат не вызывает сомнений, но существует множество способов его достижения, некоторые из которых более эффективны, чем другие. Мы хотим использовать эти возможности в наших интересах.
Они могут быть своего рода ортогональными свойствами в программах. Прочтите этот пост в блоге для дополнительных иллюстраций. И в этом обсуждалось немного больше различий в компонентах программирования, таких как потоки.
Обратите внимание, что многопоточность или многозадачность являются реализацией вычислений, служащих более конкретным целям. Они могут быть связаны с параллелизмом и параллелизмом, но не обязательно. Таким образом, они вряд ли хорошие записи, чтобы начать объяснение.
Еще один важный момент: (физическое) "время" не имеет ничего общего со свойствами, обсуждаемыми здесь. Время - это просто способ осуществления измерения, чтобы показать значимость свойств, но далеко не суть. Подумайте дважды о роли "времени" в сложности времени - которая более или менее похожа, даже измерение часто в этом случае более значимо.
Отлично, позвольте мне взять сценарий, чтобы показать, что я понимаю. предположим, что есть 3 ребенка по имени: A, B, C. A и B talk, C слушайте. Для A и B они параллельны: A: Я A. B: Я Б.
Но для C его мозг должен взять параллельный процесс для прослушивания A и B, это может быть: Я - я, а я.
Concurrency simple означает, что выполняется несколько задач (не обязательно параллельно). Например, если у нас есть 3 задачи, то в любой момент времени: более одного можно запустить или все может работать одновременно.
Parallelism означают, что они буквально работают параллельно. Таким образом, в этом случае все три должны работать одновременно.
Значение щуки "concurrency" является преднамеренным решением о конструкции и реализации. Конкурентоспособная программа может иметь или не демонстрировать поведенческие "parallelism"; это зависит от среды выполнения.
Вы не хотите, чтобы parallelism показывался программой, которая не была предназначена для concurrency.:-) Но в той мере, в какой это чистая прибыль для соответствующих факторов (энергопотребление, производительность и т.д.), Вы хотите максимально параллельный дизайн, чтобы хост-система могла распараллелить его выполнение, когда это возможно.
Язык программирования Pike Go иллюстрирует это в крайнем случае: его функции - все потоки, которые могут работать правильно одновременно, то есть вызов функции всегда создает поток, который будет работать параллельно с вызывающим, если система способна на это. Приложение с сотнями или даже тысячами потоков является совершенно обычным в его мире. (Я не эксперт, я просто беру на себя это.)
Объяснение из этот источник помог мне:
Concurrency связан с тем, как приложение обрабатывает несколько задач работает. Приложение может обрабатывать одну задачу во время (последовательно) или одновременно работать с несколькими задачами (Одновременно).
Parallelism, с другой стороны, связано с тем, как приложение обрабатывает каждую отдельную задачу. Приложение может обрабатывать задачу последовательно от начала до конца или разбить задачу на подзадачи, которые может быть завершена параллельно.
Как вы можете видеть, приложение может быть параллельным, но не параллельным. Это означает, что он обрабатывает одновременно несколько задач, но задачи не разбиваются на подзадачи.
Приложение также может быть параллельным, но не параллельным. Это означает что приложение работает только по одной задаче за раз, и эта задача разбивается на подзадачи, которые могут обрабатываться параллельно.
Кроме того, приложение не может быть ни параллельным, ни параллельным. Это означает, что он работает только по одной задаче за раз, и задача никогда не разбивается на подзадачи для параллельного выполнения.
Наконец, приложение может быть одновременно одновременно и параллельно, в что он одновременно работает с несколькими задачами одновременно, а также разрывает каждая задача сводится к подзадачам для параллельного выполнения. Однако некоторые из преимущества concurrency и parallelism могут быть потеряны в этом сценарии, поскольку процессоры на компьютере уже достаточно разумно заняты либо с помощью concurrency или parallelism. Сочетание этого может привести к только небольшое увеличение производительности или даже потеря производительности.