В чем разница между параллелизмом и параллелизмом?
Примеры приветствуются.
В чем разница между параллелизмом и параллелизмом?
Примеры приветствуются.
Ответы:
Параллельность - это когда две или более задач могут запускаться, выполняться и завершаться в перекрывающиеся периоды времени. Это не обязательно означает, что они оба будут работать одновременно. Например, многозадачность на одноядерной машине.
Параллелизм - это когда задачи выполняются буквально одновременно, например, на многоядерном процессоре.
Цитирование многопоточного руководства 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 минуты ( WORST APPROACH )
2) КОНКУРЕНТ - допустим, что профессионал играет свою очередь и переходит к следующему игроку, поэтому все 10 игроков играют одновременно, но у профессионального игрока нет двух игроков одновременно, он играет свою очередь и переходит к следующему игроку. Теперь предположим, что профессиональному игроку требуется 6 секунд, чтобы сыграть свой ход, а также время перехода профессионального игрока в ч / б двух игроков составляет 6 секунд, поэтому общее время перехода к первому игроку будет 1 минута (10x6 секунд). Следовательно, к тому времени, когда он возвращается к первому человеку, с которым было начато событие, прошло 2 минуты (10xtime_per_turn_by_champion + 10xtransition_time = 2 минуты)
Предполагая, что всем игрокам нужно 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) ПАРАЛЛЕЛЬ - скажем, организаторы получают дополнительные средства и поэтому решили пригласить двух профессиональных игроков-чемпионов (оба одинаково способные) и разделили набор из одинаковых 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 = 930сек = 15,5 минут (приблизительно)
Таким образом, все мероприятие (с участием двух таких параллельно работающих групп) будет примерно завершено за 15,5 минут
ПОСМОТРЕТЬ УЛУЧШЕНИЕ от 101 до 15,5 минут ( ЛУЧШИЙ ПОДХОД )
ПРИМЕЧАНИЕ: в приведенном выше сценарии, если вы замените 10 игроков с 10 одинаковыми рабочими местами и двух профессиональных игроков с двумя ядрами ЦП, то снова будет выполняться следующий порядок:
SERIAL> PARALLEL> CONCURRENT> CONCURRENT + PARALLEL
(ПРИМЕЧАНИЕ: этот порядок может измениться для других сценариев, так как этот порядок сильно зависит от взаимозависимости заданий, потребностей в связи с ч / б и накладных расходов на переходные работы ч / б)
Простой пример:
Одновременно: «Две очереди обращаются к одному банкомату»
Параллель есть: «Две очереди и два банкомата»
Представьте, что вы изучаете новый язык программирования, посмотрев видеоурок. Вам нужно приостановить видео, применить то, что было сказано в коде, а затем продолжить просмотр. Это параллелизм.
Теперь вы профессиональный программист. И вам нравится слушать спокойную музыку во время кодирования. Это параллелизм.
Как сказал Эндрю Герранд в блоге GoLang
Параллелизм - это работа со многими вещами одновременно. Параллелизм заключается в том, чтобы делать много вещей одновременно.
Наслаждаться.
Они решают разные проблемы. Параллелизм решает проблему дефицита ресурсов ЦП и множества задач. Таким образом, вы создаете потоки или независимые пути выполнения через код, чтобы разделить время на ограниченном ресурсе. До недавнего времени параллелизм доминировал в обсуждении из-за доступности ЦП.
Параллелизм решает проблему нахождения достаточного количества задач и соответствующих задач (которые можно правильно разделить) и распределения их по обильным ресурсам ЦП. Параллелизм, конечно, всегда был вокруг, но он выходит на первый план, потому что многоядерные процессоры очень дешевы.
Concurency: несколько потоков выполнения с возможностью совместного использования ресурсов
Пример: два потока, конкурирующие за порт ввода / вывода.
паралелизм: разбиение задачи на несколько похожих кусков.
Пример: парсинг большого файла путем запуска двух процессов в каждой половине файла.
Выполнение параллельного программирования имеет 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 сервер, 1 очередь заданий (с 5 заданиями) -> нет параллелизма, нет параллелизма (до завершения обслуживается только одно задание, следующее задание в очереди должно ждать, пока не будет выполнено обслуживаемое задание, и нет другого сервера для обслуживай это)
1 сервер, 2 или более разных очередей (по 5 заданий в очереди) -> параллелизм (поскольку сервер делит время со всеми первыми заданиями в очередях, одинаково или взвешенно), параллелизма по-прежнему нет, поскольку в любой момент времени существует один и только работа обслуживается.
2 или более серверов, одна Очередь -> параллелизм (2 задания выполняются в одно и то же время), но нет параллелизма (сервер не разделяет время, третье задание должно ждать, пока один из серверов не завершится.)
2 или более серверов, 2 или более разных очередей -> параллелизм и параллелизм
Другими словами, параллелизм - это разделение времени на выполнение задания, оно МОЖЕТ занимать то же время, чтобы завершить задание, но, по крайней мере, оно начинается рано. Важно то, что рабочие места могут быть разделены на более мелкие рабочие места, что позволяет чередовать.
Параллелизм достигается с помощью большего количества процессоров, серверов, людей и т. Д., Которые работают параллельно.
Имейте в виду, что при совместном использовании ресурсов невозможно достичь чистого параллелизма, но именно в этом случае параллелизм будет иметь наилучшее практическое применение, если он займется другой работой, которая не нуждается в этом ресурсе.
Я собираюсь предложить ответ, который немного конфликтует с некоторыми из популярных ответов здесь. На мой взгляд, параллелизм - это общий термин, включающий параллелизм. Параллелизм применяется к любой ситуации, когда различные задачи или единицы работы перекрываются во времени. Параллелизм применяется более конкретно к ситуациям, когда отдельные единицы работы оцениваются / выполняются в одно и то же физическое время. Причиной параллелизма является ускорение работы программного обеспечения, которое может извлечь выгоду из нескольких физических вычислительных ресурсов. Другой основной концепцией, которая подходит под параллелизм, является интерактивность. интерактивность применяется, когда перекрытие задач наблюдается из внешнего мира. Смысл интерактивности заключается в создании программного обеспечения, которое реагирует на реальные объекты, такие как пользователи, сетевые коллеги, аппаратные периферийные устройства и т. Д.
Параллелизм и интерактивность являются почти полностью независимым измерением параллелизма. Для конкретного проекта разработчики могут заботиться о том или другом, или обо всех. Они имеют тенденцию смешиваться, не в последнюю очередь потому, что мерзость, которая представляет собой нити, дает достаточно удобный примитив для выполнения того и другого.
Немного подробнее о параллелизме :
Параллелизм существует в очень малых масштабах (например, параллелизм на уровне команд в процессорах), средних масштабах (например, многоядерные процессоры) и больших масштабах (например, высокопроизводительные вычислительные кластеры). В последние годы усилилось давление на разработчиков программного обеспечения с целью раскрытия большего параллелизма на уровне потоков из-за роста многоядерных процессоров. Параллелизм тесно связан с понятием зависимости . Зависимости ограничивают степень, в которой может быть достигнут параллелизм; две задачи не могут выполняться параллельно, если одна зависит от другой (игнорирование спекуляций).
Существует множество шаблонов и структур, которые программисты используют для выражения параллелизма: конвейеры, пулы задач, агрегатные операции над структурами данных («параллельные массивы»).
Немного подробнее о интерактивности :
Наиболее простой и распространенный способ интерактивности - это события (т. Е. Цикл обработки событий и обработчики / обратные вызовы). Для простых задач отлично подходят события. Попытка выполнить более сложные задачи с событиями приводит к разрыву стека (иначе, как обратный вызов, иначе инверсия управления). Когда вы устали от событий, вы можете попробовать более экзотические вещи, такие как генераторы, сопрограммы (иначе Async / Await) или совместные потоки.
Из-за любви к надежному программному обеспечению, пожалуйста, не используйте темы, если вы ищете интерактивность.
Curmudgeonliness
Мне не нравится лозунг Роба Пайка "параллелизм; это лучше". Параллелизм не лучше и не хуже параллелизма. Параллельность включает в себя интерактивность, которую нельзя сравнивать лучше / хуже с параллелизмом. Это все равно что сказать «поток управления лучше, чем данные».
В электронике последовательные и параллельные представляют собой тип статической топологии, определяющей фактическое поведение схемы. Когда нет параллелизма, параллелизм является детерминированным .
Для описания динамических явлений , связанных со временем , мы используем термины последовательный и параллельный . Например, определенный результат может быть получен с помощью определенной последовательности задач (например, рецепт). Когда мы говорим с кем-то, мы производим последовательность слов. Однако в действительности многие другие процессы происходят в один и тот же момент и, таким образом, совпадают с фактическим результатом определенного действия. Если много людей разговаривают одновременно, параллельные разговоры могут помешать нашей последовательности, но результаты этого вмешательства заранее неизвестны. Параллельность вводит неопределенность .
Последовательная / параллельная и последовательная / параллельная характеристика являются ортогональными. Примером этого является цифровая связь. В последовательном адаптере цифровое сообщение временно (т.е. последовательно ) распределяется по той же линии связи (например, по одному проводу). В параллельном адаптере это делится также на параллельные линии связи (например, на множество проводов), а затем реконструируется на приемном конце.
Давайте представим игру с 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, их параллельное выполнение будет выглядеть так:
CPU 1: A ------------------------->
CPU 2: B ------------------------->
Когда два потока работают одновременно, их выполнение перекрывается. Перекрытие может происходить одним из двух способов: либо потоки выполняются в одно и то же время (то есть параллельно, как указано выше), либо их исполнения чередуются на процессоре, например так:
CPU 1: A -----------> B ----------> A -----------> B -------- ->
Таким образом, для наших целей параллелизм можно рассматривать как особый случай параллелизма
Источник: еще один ответ здесь
Надеюсь, это поможет.
Мне очень нравится ответ Пола Мясника на этот вопрос (он автор « Семи моделей параллелизма за семь недель» ):
Хотя они часто путаются, параллелизм и параллелизм - разные вещи. Параллельность является аспектом проблемной области - ваш код должен обрабатывать несколько одновременных (или почти одновременных) событий . Параллелизм, напротив, является аспектом области решения - вы хотите, чтобы ваша программа работала быстрее, параллельно обрабатывая различные части проблемы. Некоторые подходы применимы к параллелизму, некоторые к параллелизму, а некоторые к обоим. Поймите, с чем вы столкнулись, и выберите правильный инструмент для работы.
Параллельность может включать в себя задачи, выполняемые одновременно или нет (они действительно могут выполняться в отдельных процессорах / ядрах, но они также могут выполняться в «тиках»). Что важно , что параллелизм всегда относится к делать часть одной большого труда . Так что в основном это часть некоторых вычислений. Вы должны быть умны в том, что вы можете делать одновременно, а что нет, и как синхронизировать.
Параллелизм означает, что вы просто делаете некоторые вещи одновременно. Они не должны быть частью решения одной проблемы. Ваши темы могут, например, решить одну проблему каждый. Конечно, синхронизация также применима, но с другой точки зрения.
«Параллелизм», когда есть несколько вещей , в ходе .
«Параллелизм» - это когда параллельные вещи развиваются одновременно .
Примеры параллелизма без параллелизма:
SqlDataReader
с на соединении MARS .Обратите внимание, однако, что разница между параллелизмом и параллелизмом часто является вопросом перспективы. Приведенные выше примеры не параллельны с точки зрения (наблюдаемых эффектов) выполнения вашего кода. Но существует параллелизм на уровне инструкций даже внутри одного ядра. Существуют аппаратные средства, выполняющие операции параллельно с процессором, а затем прерывающие работу процессора, когда это будет сделано. Графический процессор может рисовать на экране во время выполнения вашей оконной процедуры или обработчика события. СУБД может обходить B-деревья для следующего запроса, пока вы еще получаете результаты предыдущего. Браузер может делать макет или работу в сети, пока вы Promise.resolve()
выполняете. И т. Д. И т. Д.
Итак, поехали. Мир как всегда грязный;)
Самый простой и самый элегантный способ понять два, на мой взгляд, это. Параллелизм позволяет чередовать выполнение и, следовательно, может создавать иллюзию параллелизма. Это означает, что параллельная система может, например, запускать ваше видео на Youtube вместе с написанием документа в Word. Базовая ОС, будучи параллельной системой, позволяет этим задачам чередовать их выполнение. Поскольку компьютеры выполняют инструкции так быстро, создается впечатление, что они выполняют две вещи одновременно.
Параллелизм , когда такие вещи действительно находятся параллельно. В приведенном выше примере вы можете обнаружить, что код обработки видео выполняется на одном ядре, а приложение Word - на другом. Обратите внимание, что это означает, что параллельная программа также может быть параллельной! Структурирование вашего приложения с потоками и процессами позволяет вашей программе эксплуатировать базовое оборудование и потенциально может выполняться параллельно.
Почему бы не сделать все параллельно? Одна из причин заключается в том, что параллелизм - это способ структурирования программ и проектное решение, облегчающее разделение задач, тогда как параллелизм часто используется во имя производительности. Другое - то, что некоторые вещи принципиально не могут быть полностью выполнены параллельно. Примером этого может быть добавление двух вещей в конец очереди - вы не можете вставить оба одновременно. Что-то должно идти первым, а другое позади, иначе вы испортите очередь. Хотя мы можем чередовать такое выполнение (и таким образом мы получаем параллельную очередь), вы не можете иметь его параллельно.
Надеюсь это поможет!
Параллельное программирование относится к операциям, которые кажутся перекрывающимися, и в первую очередь касается сложности, возникающей из-за недетерминированного потока управления. Количественные затраты, связанные с параллельными программами, обычно являются как пропускной способностью, так и задержкой. Параллельные программы часто связаны с вводом-выводом, но не всегда, например, параллельные сборщики мусора полностью загружены на процессор. Педагогическим примером параллельной программы является веб-сканер. Эта программа инициирует запросы на веб-страницы и принимает ответы одновременно, когда результаты загрузок становятся доступными, накапливая набор страниц, которые уже были посещены. Поток управления является недетерминированным, поскольку ответы не обязательно принимаются в одном и том же порядке при каждом запуске программы. Эта характеристика может сильно затруднить отладку параллельных программ. Некоторые приложения принципиально параллельны, например, веб-серверы должны одновременно обрабатывать клиентские соединения. Erlang, пожалуй, самый многообещающий новый язык для высококонкурентного программирования.
Параллельное программирование касается операций, которые перекрываются для конкретной цели повышения пропускной способности. Трудности параллельного программирования можно избежать, сделав поток управления детерминированным. Как правило, программы порождают наборы дочерних задач, которые выполняются параллельно, а родительская задача продолжается только после завершения каждой подзадачи. Это значительно облегчает отладку параллельных программ. Сложной частью параллельного программирования является оптимизация производительности по таким вопросам, как гранулярность и коммуникация. Последнее по-прежнему является проблемой в контексте многоядерных процессоров, поскольку перенос данных из одного кэша в другой сопряжен со значительными затратами. Плотное матрично-матричное умножение является педагогическим примером параллельного программирования, и его можно эффективно решить с помощью Straasen ' s алгоритм «разделяй и властвуй» и параллельная атака на подзадачи. Cilk, пожалуй, самый перспективный язык для высокопроизводительного параллельного программирования на компьютерах с общей памятью (включая многоядерные).
Скопировано из моего ответа: https://stackoverflow.com/a/3982782
Параллелизм: наличие нескольких потоков выполняет аналогичные задачи, которые не зависят друг от друга с точки зрения данных и ресурсов, которые им требуются для этого. Например: сканер Google может создавать тысячи потоков, и каждый поток может выполнять свою задачу независимо.
Параллелизм: параллелизм проявляется, когда вы делитесь данными, разделяете ресурсы между потоками. В транзакционной системе это означает, что вы должны синхронизировать критическую часть кода, используя некоторые методы, такие как блокировки, семафоры и т. Д.
(Я очень удивлен, что такой фундаментальный вопрос не решается правильно и аккуратно в течение многих лет ...)
Короче говоря, и параллелизм, и параллелизм являются свойствами вычислений .
Как различие, вот объяснение от Роберта Харпера :
Первое, что нужно понять, это то, что параллелизм не имеет ничего общего с параллелизмом . Параллелизм связан с недетерминированным составом программ (или их компонентов). Параллелизм связан с асимптотической эффективностью программ с детерминированным поведением. Параллельность - это управление неуправляемым: события происходят по независящим от нас причинам, и мы должны на них реагировать. Пользователь щелкает мышью, оконный менеджер должен ответить, даже если дисплей требует внимания. Такие ситуации по своей природе недетерминированы, но мы также используем форматынедетерминизм в детерминированной обстановке, делая вид, что компоненты сигнализируют о событиях в произвольном порядке, и что мы должны реагировать на них по мере их возникновения. Недетерминированная композиция - это мощная идея структурирования программы. Параллелизм, с другой стороны, все о зависимостях среди подвычислений детерминированного вычисления. Результат не вызывает сомнений, но существует множество способов его достижения, некоторые из которых более эффективны, чем другие. Мы хотим использовать эти возможности в наших интересах.
Они могут быть своего рода ортогональными свойствами в программах. Прочитайте этот блог для дополнительных иллюстраций. И в этом обсуждалось немного больше различий в компонентах программирования , таких как потоки.
Обратите внимание, что многопоточность или многозадачность - все это реализации вычислений, служащие более конкретным целям. Они могут быть связаны с параллелизмом и параллелизмом, но не обязательно. Таким образом, они вряд ли хорошие записи, чтобы начать объяснение.
Еще один важный момент: (физическое) «время» не имеет ничего общего со свойствами, обсуждаемыми здесь. Время - это просто способ осуществления измерения, чтобы показать значимость свойств, но далеко не суть. Подумайте дважды о роли «времени» во временной сложности - которая более или менее похожа, даже измерение часто более значимо в этом случае.
«Параллельно» - это делать что угодно - одновременно - одновременно. Это могут быть разные вещи или одно и то же. Несмотря на принятый ответ, которого нет, речь идет не о том, чтобы «показаться одновременно». Это действительно в то же время. Вам нужно несколько ядер ЦП, использующих совместно используемую память на одном хосте или распределенную память на разных хостах, для запуска параллельного кода. В качестве примера можно привести конвейеры из 3-х различных задач, которые одновременно выполняются одновременно: Задача-уровень 2 должна ожидать выполнения единиц, завершенных задачей уровня-1, а задача-уровень-3 должна ожидать выполнения единиц работы, завершенных задача уровня-2. Другой пример - параллелизм 1-производителя с 1-потребителем; или много производителей и 1 потребитель; читатели и писатели; и другие.
«Параллель» делает одно и то же одновременно. Это одновременно, но, кроме того, это то же самое поведение, происходящее в одно и то же время, и чаще всего это происходит с разными данными. Матричную алгебру часто можно распараллелить, потому что одна и та же операция выполняется многократно: например, суммы столбцов матрицы могут быть вычислены одновременно с использованием одного и того же поведения (суммы), но для разных столбцов. Распространенной стратегией является разделение (разделение) столбцов между доступными ядрами процессора, чтобы у вас было примерно одинаковое количество работы (число столбцов), обрабатываемое каждым ядром процессора. Другой способ разделить работу - это мешок с заданиями, когда работники, которые заканчивают свою работу, возвращаются к менеджеру, который раздает работу и динамически получает больше работы, пока все не будет сделано. Алгоритм продажи билетов другой.
Не только числовой код может быть распараллелен. Файлы слишком часто могут обрабатываться параллельно. В приложении обработки естественного языка для каждого из миллионов файлов документов может потребоваться подсчитать количество токенов в документе. Это параллельно, потому что вы подсчитываете токены, что является одинаковым поведением для каждого файла.
Другими словами, параллелизм - это когда одно и то же поведение выполняется одновременно. Одновременно означает в то же время, но не обязательно то же самое поведение. Параллель - это особый вид параллелизма, когда одно и то же происходит одновременно.
Термины, например, будут включать атомарные инструкции, критические секции, взаимное исключение, ожидание вращения, семафоры, мониторы, барьеры, передачу сообщений, сокращение карты, сердцебиение, звонок, алгоритмы создания билетов, потоки, MPI, OpenMP.
Работа Грегори Эндрюса является главным учебником по ней: многопоточное, параллельное и распределенное программирование.
Отлично, позвольте мне взять сценарий, чтобы показать, что я понимаю. предположим, что есть 3 ребенка по имени: A, B, C. A и B говорят, C слушают. Для А и Б они параллельны: А: Я А. Б: Я Б.
Но для C его мозг должен принять параллельный процесс, чтобы прослушать A и B, это может быть: я - IA, я - B.
Простой параллелизм означает, что выполняется более одной задачи (не обязательно параллельно). Например, в предположении, что у нас есть 3 задачи в любой момент времени: может быть запущено более одной или все могут выполняться одновременно.
Параллелизм означает, что они буквально работают параллельно. Таким образом, в этом случае все три должны работать одновременно.
Понятие «параллелизма» Пайка - это намеренное решение при разработке и реализации. Дизайн программы с одновременной поддержкой может демонстрировать или не демонстрировать поведенческий «параллелизм»; это зависит от среды выполнения.
Вы не хотите, чтобы параллелизм демонстрировался программой, не предназначенной для параллелизма. :-) Но в той мере, в какой это чистый выигрыш для соответствующих факторов (энергопотребление, производительность и т. Д.), Вы хотите максимально параллельную конструкцию, чтобы хост-система могла распараллеливать свое выполнение, когда это возможно.
Язык программирования Pike's Go иллюстрирует это в крайнем случае: все его функции - это потоки, которые могут работать правильно одновременно, то есть вызов функции всегда создает поток, который будет работать параллельно с вызывающей стороной, если система способна на это. Приложение с сотнями или даже тысячами потоков является совершенно обычным явлением в его мире. (Я не эксперт по Go, это только мое мнение.)