При рассмотрении параллельного программирования обычно используются два термина: параллельный и параллельный.
А некоторые языки программирования специально заявляют о поддержке параллельного программирования, например, Java .
Означает ли это, что параллельное и параллельное программирование на самом деле отличаются?
terminology
parallel-computing
concurrency
nish1013
источник
источник
Ответы:
Из «Софомического * введения в параллелизм и параллелизм совместно используемой памяти» Дэна Гроссмана (версия от 16 ноября 2013 г.)
источник
В дополнение к ответу Ниша позвольте мне порекомендовать книгу Саймона Марлоу « Параллельное и параллельное программирование на Хаскеле» или его краткий учебник . Они отвечают на ваш первый вопрос с точки зрения Хаскелла, поэтому они могут лучше подходить для теоретически склонных читателей (Хаскелл - чисто функциональный, ленивый язык программирования, который намного ближе к математике, чем другие языки).
Цитирую оттуда:
Я рекомендую прочитать остальное в руководстве (стр. 4), но позвольте мне процитировать некоторые оставшиеся части этого раздела, так как они связывают обе парадигмы программирования с количественными и качественными характеристиками программ, такими как эффективность, модульность и детерминизм.
источник
Параллельность и параллелизм различаются по проблемам, которые они решают и вызывают, но они не являются независимыми.
совпадение
Выполнение двух задач одновременно означает, что отдельные шаги обеих задач выполняются чередующимся образом. Если вы игнорируете параллелизм, вы можете предположить, что в любой момент времени выполняется только один оператор, но у вас (априори) нет гарантии, какая задача получит выполнить следующий шаг.
Это полезно в некоторых отношениях:
Некоторые из основных проблем:
параллелизм
Выполнение двух задач параллельно означает, что операторы выполняются одновременно . Это в основном полезно для:
Ключевые проблемы включают в себя:
Смотрите также этот вопрос для различения параллельных и распределенных вычислений.
источник
Возможно, слегка идеализированный ответ ...
Параллельность - это свойство написания программы . Если программа написана с использованием таких конструкций, как разветвления / объединения, блокировки, транзакции, атомарные операции сравнения и замены и т. Д., То она выполняется одновременно.
Параллелизм - это свойство того, как выполняется программа . Если программа выполняется более чем на одном вычислительном блоке одновременно, то она выполняется параллельно.
источник
Есть множество ответов на это, но это может сбить с толку. Мне нравится думать об этом таким образом, и, может быть, это помогает ?:
Параллельное программирование - это код, который не заботится о порядке выполнения. Java - плохой язык для параллельного программирования, но есть библиотеки и фреймворки, которые могут помочь. JavaScript является отличным языком для параллельного программирования, и часто бывает трудно, когда вы хотите написать что-то, что не является параллельным (например, если вы хотите установить порядок выполнения). Параллельное программирование отлично подходит для программирования, управляемого событиями (где порядок выполнения определяется слушателями событий, например, кодом, выполняющимся в вашем браузере, который действует, когда вы нажимаете кнопку или вводите текст в поле).
Пример может включать создание сотен HTTP-запросов. В NodeJS самое простое решение - открыть все 100 запросов одновременно с помощью метода обратного вызова, а когда ответы возвращаются, метод выполняется каждый раз. Это параллельное программирование. В Ruby самое простое (наиболее распространенное) решение - открыть запрос и обработать ответ, открыть следующий запрос и обработать ответ, и т. Д. Для многих запросов NodeJS проще выполнить своевременно, хотя вам нужно будьте осторожны, чтобы не перегружать сервер и не увеличивать количество исходящих соединений (это легко сделать по ошибке). Вы можете писать Ruby одновременно, но это не так, как написано большинство кода на Ruby, и это немного мешает это делать.
Параллельное программированиеэто код, который может быть запущен одновременно в нескольких потоках или процессах. Это позволяет оптимизировать производительность, выполняя код на нескольких процессорах (часто включая несколько компьютеров, как вы могли бы с чем-то вроде Akka). Поскольку NodeJS не является многопоточным и параллельное выполнение не требуется, вам не нужно беспокоиться о написании многопоточного кода (и большая часть кода JavaScript, который я видел, не является поточно-ориентированным). В Java, хотя язык не делает параллельное программирование нормальным шаблоном, параллельное программирование очень встроено, и вам часто приходится беспокоиться о безопасности потоков. Если вы пишете веб-сайт на Java, обычно это будет выполняться в контейнере, который выполняет каждый запрос в отдельном потоке в той же памяти,
Некоторые из вышеперечисленных зависит от объема и границ, о которых вы говорите. Я работаю на сайтах. Большая часть кода Java, который я вижу, не является параллельным программированием. Конечно, если вы уменьшаете масштаб достаточно, порядок, в котором поступают запросы клиентов, не важен, но если вы увеличиваете масштаб дальше, порядок выполнения вещей определяется кодом. Но код написан так, что запросы могут выполняться параллельно с большим количеством общих объектов, которые должны быть поточно-ориентированными.
Между тем большая часть кода JavaScript, который я вижу, является параллельной: он написан так, что порядок выполнения не важен на многих уровнях. Но он не написан для поддержки параллельного выполнения в разделяемой памяти. Конечно, вы можете выполнять один и тот же код параллельно между несколькими процессами, но объекты не являются общими, поэтому это не параллельное программирование в каком-либо значимом смысле.
Для дополнительного чтения мне очень нравятся иллюстрации в верхнем ответе на этот вопрос здесь: https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming
источник