В чем разница между параллельным программированием и параллельным программированием?

В чем разница между параллельным программированием и параллельным программированием? Я спросил Google, но не нашел ничего, что помогло бы мне понять эту разницу. Не могли бы вы привести пример для обоих?

На данный момент я нашел это объяснение: http://www.linux-mag.com/id/7411 - но "параллелизм - это свойство программы", а параллельное выполнение - это свойство машины ", мне не достаточно - до сих пор не могу сказать, что к чему.

22 ответа

Решение

Если ваша программа использует потоки (параллельное программирование), она не обязательно будет выполняться как таковая (параллельное выполнение), поскольку она зависит от того, может ли машина обрабатывать несколько потоков.

Вот наглядный пример. Резьба на станке без резьбы:

        --  --  --
     /              \
>---- --  --  --  -- ---->>

Резьбы на резьбовом станке:

     ------
    /      \
>-------------->>

Черточки представляют выполненный код. Как вы можете видеть, они оба разделяются и выполняются по отдельности, но многопоточная машина может выполнять несколько отдельных частей одновременно.

Параллельное программирование относится к операциям, которые кажутся перекрывающимися, и в первую очередь касается сложности, возникающей из-за недетерминированного потока управления. Количественные затраты, связанные с параллельными программами, как правило, являются как пропускной способностью, так и задержкой. Параллельные программы часто связаны с вводом-выводом, но не всегда, например, параллельные сборщики мусора полностью на CPU. Педагогическим примером параллельной программы является веб-сканер. Эта программа инициирует запросы на веб-страницы и принимает ответы одновременно, когда результаты загрузок становятся доступными, накапливая набор страниц, которые уже были посещены. Поток управления является недетерминированным, поскольку ответы не обязательно принимаются в одном и том же порядке при каждом запуске программы. Эта характеристика может сильно затруднить отладку параллельных программ. Некоторые приложения принципиально параллельны, например, веб-серверы должны обрабатывать клиентские соединения одновременно. Erlang, пожалуй, самый многообещающий новый язык для высококонкурентного программирования.

Параллельное программирование касается операций, которые перекрываются для конкретной цели повышения пропускной способности. Сложности параллельного программирования можно избежать, сделав поток управления детерминированным. Как правило, программы порождают наборы дочерних задач, которые выполняются параллельно, а родительская задача продолжается только после завершения каждой подзадачи. Это значительно облегчает отладку параллельных программ. Сложной частью параллельного программирования является оптимизация производительности в отношении таких проблем, как гранулярность и коммуникация. Последнее по-прежнему является проблемой в контексте многоядерных систем, поскольку перенос данных из одного кэша в другой сопряжен со значительными затратами. Плотное матрично-матричное умножение является педагогическим примером параллельного программирования, и его можно эффективно решить с помощью алгоритма "разделяй и властвуй" Стразена и параллельно атакуя подзадачи. Cilk, пожалуй, самый перспективный язык для высокопроизводительного параллельного программирования на компьютерах с общей памятью (включая многоядерные).

https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html

Одновременно = две очереди и одна кофемашина.

Параллельно = две очереди и две кофемашины.

Интерпретация исходного вопроса как параллельное / параллельное вычисление вместо программирования.

При одновременном вычислении два вычисления продвигаются независимо друг от друга. Второе вычисление не должно ждать, пока первое не закончится, чтобы продвинуться. Однако не указывается механизм, как это достигается. В одноядерной установке требуется приостановка и чередование потоков (также называемое преимущественной многопоточностью).

При параллельном вычислении оба вычисления продвигаются одновременно - это буквально одновременно. Это невозможно с одним процессором и требует многоядерной настройки.

приостановить и по очереди против параллельные вычисления

По словам: "Параллельный против Параллельного в Node.js".

На виде из процессора, это можно описать с помощью этой картинки

На виде из процессора, это можно описать с помощью этой картинки

На виде из процессора, это можно описать с помощью этой картинки

Я полагаю, что параллельное программирование относится к многопоточному программированию, которое позволяет вашей программе работать в нескольких потоках, не прибегая к деталям оборудования.

Параллельное программирование относится к конкретной разработке ваших программных алгоритмов, чтобы использовать преимущества доступного параллельного выполнения. Например, вы можете параллельно выполнять две ветви некоторых алгоритмов, ожидая, что он достигнет результата быстрее (в среднем), чем если бы вы сначала проверили первую, а затем вторую ветку.

Я нашел это содержание в каком-то блоге. Мысль это полезно и актуально.

Параллелизм и параллелизм НЕ одно и то же. Две задачи T1 и T2 являются одновременными, если порядок, в котором эти две задачи выполняются во времени, не предопределен,

T1 может быть выполнен и завершен до того, как T2, T2 может быть выполнен и завершен до того, как T1, T1 и T2 могут быть выполнены одновременно в один и тот же момент времени (параллелизм), T1 и T2 могут быть выполнены поочередно, ... Если два параллельных потока запланированы ОС для работы на одном одноядерном процессоре без SMT без CMP, вы можете получить параллелизм, но не параллелизм. Параллелизм возможен в многоядерных, многопроцессорных или распределенных системах.

Параллельность часто упоминается как свойство программы и является более общей концепцией, чем параллелизм.

Источник: https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming

Это две фразы, которые описывают одно и то же с (очень немного) разных точек зрения. Параллельное программирование описывает ситуацию с точки зрения аппаратного обеспечения - как минимум два процессора (возможно, в одном физическом пакете) работают над проблемой параллельно. Параллельное программирование описывает вещи больше с точки зрения программного обеспечения - два или более действия могут происходить в одно и то же время (одновременно).

Проблема здесь в том, что люди пытаются использовать две фразы, чтобы провести четкое различие, когда ни одна из них на самом деле не существует. Реальность такова, что разделительная линия, которую они пытаются провести, была нечеткой и нечеткой на протяжении десятилетий, а со временем становилась все более нечеткой.

Они пытаются обсудить тот факт, что когда-то на большинстве компьютеров был только один процессор. Когда вы выполняли несколько процессов (или потоков) на одном и том же ЦП, ЦП действительно выполнял только одну инструкцию из одного из этих потоков за раз. Появление параллелизма было иллюзией - процессор переключался между выполнением инструкций из разных потоков достаточно быстро, чтобы для человеческого восприятия (для которого менее 100 мсек или около того выглядит мгновенно) казалось, что он делал много вещей одновременно.

Очевидная противоположность этому - это компьютер с несколькими ЦП или ЦП с несколькими ядрами, поэтому машина выполняет инструкции из нескольких потоков и / или процессов одновременно; выполнение кода не может / не имеет никакого влияния на выполнение кода в другом.

Теперь проблема: такого четкого различия почти никогда не было. Компьютерные дизайнеры на самом деле довольно умны, поэтому они давно заметили, что (например), когда вам нужно было прочитать некоторые данные с устройства ввода-вывода, например с диска, потребовалось много времени (с точки зрения циклов ЦП), чтобы Конец. Вместо того, чтобы оставить процессор бездействующим, когда это произошло, они нашли различные способы позволить одному процессу / потоку сделать запрос ввода-вывода и позволить коду из какого-то другого процесса / потока выполняться на процессоре, пока запрос ввода-вывода завершен.

Итак, задолго до того, как многоядерные процессоры стали нормой, у нас были параллельные операции из нескольких потоков.

Это только верхушка айсберга. Десятилетия назад компьютеры начали обеспечивать еще один уровень параллелизма. Опять же, будучи достаточно умными людьми, компьютерные дизайнеры заметили, что во многих случаях у них были инструкции, которые не влияли друг на друга, поэтому можно было выполнять более одной инструкции из одного потока одновременно. Одним из первых примеров, который стал довольно известным, были Control Data 6600. Это был (с довольно большим отрывом) самый быстрый компьютер в мире, когда он был представлен в 1964 году - и большая часть той же базовой архитектуры остается в использовании сегодня. Он отслеживал ресурсы, используемые каждой инструкцией, и имел набор исполнительных блоков, которые выполняли инструкции, как только стали доступны ресурсы, от которых они зависели, что очень схоже с конструкцией самых последних процессоров Intel/AMD.

Но (как говорили в рекламе) ждать - это еще не все. Есть еще один элемент дизайна, чтобы добавить еще больше путаницы. Ему было дано довольно много разных имен (например, "Hyperthreading", "SMT", "CMP"), но все они ссылаются на одну и ту же основную идею: процессор, который может выполнять несколько потоков одновременно, используя комбинацию некоторых ресурсов, которые являются независимыми для каждого потока и некоторых ресурсов, которые совместно используются потоками. В типичном случае это сочетается с описанным выше параллелизмом на уровне команд. Для этого у нас есть два (или более) набора архитектурных регистров. Затем у нас есть набор исполнительных блоков, которые могут выполнять инструкции, как только становятся доступными необходимые ресурсы. Они часто хорошо сочетаются, потому что инструкции из отдельных потоков практически никогда не зависят от одних и тех же ресурсов.

Тогда, конечно, мы перейдем к современным системам с несколькими ядрами. Здесь все очевидно, верно? У нас есть N (где-то между 2 и 256 или около того, на данный момент) отдельных ядер, которые могут выполнять все команды одновременно, поэтому у нас есть четкий случай реального параллелизма - выполнение инструкций в одном процессе / потоке не ' не влияет на выполнение инструкций в другом.

Ну вроде как. Даже здесь у нас есть некоторые независимые ресурсы (регистры, исполнительные блоки, по крайней мере, один уровень кеша) и некоторые общие ресурсы (обычно, по крайней мере, самый низкий уровень кеша, и определенно контроллеры памяти и пропускная способность для памяти).

Подводя итог: простые сценарии, которым люди любят противопоставлять общие ресурсы и независимые ресурсы, практически никогда не происходят в реальной жизни. Располагая всеми ресурсами, мы получаем что-то вроде MS-DOS, где мы можем запускать только одну программу за раз, и мы должны прекратить запускать одну, прежде чем вообще сможем запустить другую. Имея полностью независимые ресурсы, у нас есть N компьютеров, работающих под управлением MS-DOS (даже без сети для их подключения), и у них нет возможности вообще что-либо делить между ними (потому что, если мы даже можем поделиться файлом, то это общий ресурс, нарушение основной предпосылки, что ничто не передается).

Каждый интересный случай включает в себя некоторую комбинацию независимых ресурсов и общих ресурсов. Каждый достаточно современный компьютер (и многие другие, которые совсем не являются современными) обладает, по крайней мере, некоторой способностью выполнять, по крайней мере, несколько независимых операций одновременно, и почти что-либо более сложное, чем MS-DOS, воспользовалось этим, чтобы, по крайней мере, в некоторой степени.

Хорошего, четкого разделения между "параллельным" и "параллельным", которое люди любят рисовать, просто не существует, и почти никогда не существует. То, что люди любят классифицировать как "параллельные", обычно все еще включает, по крайней мере, один, а часто и более разные типы параллельного выполнения. То, что им нравится классифицировать как "параллельные", часто включает в себя совместное использование ресурсов и (например) одного процесса, блокирующего выполнение другого, при использовании ресурса, который совместно используется этими двумя.

Люди, пытающиеся провести четкое различие между "параллельным" и "параллельным", живут в фантазии компьютеров, которых на самом деле никогда не существовало.

  • Concurrent programming в общем смысле означает среду, в которой определяемые нами задачи могут выполняться в любом порядке. Одна задача может возникать до или после другой, и некоторые или все задачи могут выполняться одновременно.

  • Parallel programming Это конкретно относится к одновременному выполнению параллельных задач на разных процессорах. Таким образом, все параллельное программирование является параллельным, но не все параллельное программирование является параллельным.

Источник: PThreads Programming - стандарт POSIX для лучшей многопроцессорной обработки, Бутлар, Фаррелл, Николс

1. Определения:

Классическое планирование задач может быть SERIAL, PARALLEL или же CONCURRENT

SERIAL: Анализ показывает, что задачи ДОЛЖНЫ БЫТЬ выполнены одна за другой в известном порядке последовательности, ИЛИ это не будет работать.

Т.е.: достаточно легко, мы можем жить с этим

PARALLEL: Анализ показывает, что задачи ДОЛЖНЫ БЫТЬ выполнены одновременно ИЛИ это не будет работать.

  • Любой сбой любой из задач - функционально или по времени - приведет к полному отказу системы.
  • Все задачи должны иметь общее надежное чувство времени.

То есть: старайтесь избегать этого, иначе у нас будут чаевые.

CONCURRENT. Анализ показывает, что нам НЕ НУЖНО. Мы не небрежны, мы проанализировали это, и это не имеет значения; Поэтому мы можем выполнить любую задачу, используя любое доступное средство в любое время.

Т.е.: СЧАСТЛИВЫЕ ДНИ


Часто планирование доступных изменений на известных событиях, которые я назвал изменением состояния.


2. Это не { Software | Программирование} Особенность, но подход системного проектирования:

Люди часто думают, что речь идет о программном обеспечении, но на самом деле это концепция проектирования систем, которая предшествует компьютерам

Программные системы были немного медленными в освоении, очень немногие языки программного обеспечения даже пытаются решить проблему.

Вы можете попробовать поискать язык ТРАНСПУТЕР occam если вы заинтересованы в хорошей попытке.

(occam имеет много принципиально новых (если не первоклассных) функций, в т.ч. явная языковая поддержка PAR а также SER Конструкторы исполнения частей кода, от которых в основном страдают другие языки, в грядущую эру массовых параллельных массивов процессоров, доступных в последние годы, заново изобретают колесо, которое InMOS Transputers использовал более 35 лет назад (!!!))


3. Что хороший дизайн систем заботится, чтобы покрыть:

Вкратце, проектирование систем направлено на следующее:

ГЛАГОЛ - Что ты делаешь. (операция или алгоритм)

НОУН - Для чего ты это делаешь. (Данные или интерфейс)

КОГДА - Инициирование, расписание, изменения состояния, SERIAL, PARALLEL, CONCURRENT

ГДЕ - Как только вы знаете, когда что-то происходит, вы можете сказать, где они могут произойти, а не раньше.

ПОЧЕМУ - это способ сделать это? Есть ли другие способы? Есть ли лучший способ?

... и последнее, но не менее важное... ЧТО ПРОИСХОДИТ, ЕСЛИ ВЫ ЭТО НЕ ДЕЛАЕТЕ?


4. Визуальные примеры подходов PARALLEL и SERIAL:

Недавние параллельные архитектуры, доступные в 2014 году в действии для массивов 16-, 64-, 1024-параллельных RISC uP-s

Четверть века назад - часть настоящей параллельной истории с демонстрационным видео с процессором Inmos Transputer с начала 1990-х годов

Удачи

Параллельное программирование происходит, когда код выполняется одновременно, и каждое выполнение не зависит от другого. Поэтому обычно нет озабоченности общими переменными, потому что это вряд ли произойдет.

Однако параллельное программирование состоит в том, что код выполняется разными процессами / потоками, которые совместно используют переменные и тому подобное, поэтому при параллельном программировании мы должны установить какое-то правило, чтобы решить, какой процесс / поток выполняется первым, мы хотим, чтобы мы были уверены, что будет быть последовательным и что мы можем с уверенностью знать, что произойдет. Если нет управления, и все потоки вычисляются в одно и то же время и хранят данные в одних и тех же переменных, как мы узнаем, чего ожидать в итоге? Возможно, поток работает быстрее, чем другой, может быть, один из потоков даже остановился в середине своего выполнения, а другой продолжил другое вычисление с поврежденной (еще не полностью вычисленной) переменной, возможности безграничны. Именно в таких ситуациях мы обычно используем параллельное программирование вместо параллельного.

В программировании параллелизм - это композиция независимо выполняющихся процессов, а параллелизм - одновременное выполнение (возможно, связанных) вычислений.
- Эндрю Герранд -

А также

Параллельность - это композиция независимо выполняемых вычислений. Параллелизм - это способ структурирования программного обеспечения, особенно как способ написания чистого кода, который хорошо взаимодействует с реальным миром. Это не параллелизм.

Параллелизм не параллелизм, хотя он допускает параллелизм. Если у вас только один процессор, ваша программа все еще может быть параллельной, но не может быть параллельной. С другой стороны, хорошо написанная параллельная программа может эффективно работать параллельно на многопроцессорной системе. Это свойство может быть важным...
- Роб Пайк -

Чтобы понять разницу, я настоятельно рекомендую посмотреть видео Роба Пайка (одного из создателей Голанга). Параллелизм - это не параллелизм

Параллелизм обеспечивает способ структурирования решения для решения проблемы, которая может (но не обязательно) быть распараллеливаемой. Параллелизм — это структура , параллелизм — это выполнение .

Хотя нет полного согласия относительно различия между терминами, параллельными и параллельными, многие авторы делают следующие различия:

  • В параллельных вычислениях программа - это программа, в которой в любой момент может выполняться несколько задач.
  • В параллельных вычислениях программа - это программа, в которой несколько задач тесно взаимодействуют для решения проблемы.

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

Источник: Введение в параллельное программирование, Питер Пачеко

Я понял разницу так:

1) Параллельный - работает в тандеме с использованием общих ресурсов 2) Параллельный - работает бок о бок с использованием разных ресурсов

Таким образом, вы можете иметь две вещи, происходящие одновременно, независимо друг от друга, даже если они объединяются в точках (2), или две вещи, использующие одни и те же резервы в ходе выполняемых операций (1).

Источник параллелизма и параллелизма

В многопоточном процессе на одном процессоре процессор может переключать ресурсы выполнения между потоками, что приводит к одновременному выполнению.

В одном и том же многопоточном процессе в многопроцессорной среде с общей памятью каждый поток в процессе может одновременно выполняться на отдельном процессоре, что приводит к параллельному выполнению.

Когда у процесса меньше или столько потоков, сколько имеется процессоров, система поддержки потоков в сочетании с операционной средой гарантирует, что каждый поток будет работать на своем процессоре.

Например, в матричном умножении с одинаковым количеством потоков и процессоров каждый поток (и каждый процессор) вычисляет строку результата.

Я постараюсь объяснить это в своем собственном стиле, возможно, это не будет в компьютерных терминах, но это дает вам общее представление.

Давайте возьмем пример, скажем, домашние дела: мытье посуды, вывоз мусора, стрижку газона и т. Д., Также у нас есть 3 человека (потоки) A, B, C, чтобы выполнять их

Параллельно: три человека запускают разные задачи независимо, т. Е.

A --> cleaning dishes
B --> taking out trash 
C --> mowing the lawn 

Здесь порядок задач не определен, а ответы зависят от объема работы.

Параллельно: здесь, если мы хотим повысить производительность, мы можем назначить несколько человек для одной задачи, например, мыть посуду мы назначаем двух человек: A мыть посуду и B мыть посуду, что может улучшить производительность.

мытье посуды:

A --> soaping the dishes
B --> washing the dishes

скоро

Надеюсь, это даст представление! теперь переходим к техническим терминам, которые объясняются в других ответах;)

Просто поделюсь примером, который поможет выделить различие:

Параллельное программирование. Допустим, вы хотите реализовать алгоритм сортировки слиянием. Каждый раз, когда вы разделяете проблему на две подзадачи, у вас может быть два потока, которые их решают. Однако, чтобы выполнить этап слияния, вам нужно дождаться завершения этих двух потоков, поскольку для слияния требуются оба подрешения. Это "обязательное ожидание" делает эту программу параллельной.

Параллельная программа: Допустим, вы хотите сжать n текстовых файлов и создать сжатый файл для каждого из них. У вас может быть от 2 (до n) потоков, каждый из которых обрабатывает сжатие подмножества файлов. Когда каждый поток завершен, он просто завершен, ему не нужно ждать или делать что-либо еще. Таким образом, поскольку различные задачи выполняются чередующимся образом в "любом произвольном порядке", программа является параллельной, но не параллельной.

Как уже упоминал кто-то другой, каждая параллельная программа является параллельной (фактически, должна быть), но не наоборот.

Параллельное программирование — это общая концепция, при которой программа может выполнять несколько задач в неопределенном порядке выполнения и может выполняться или не выполняться одновременно.

Параллельное программирование — это просто тип параллельного программирования, в котором эти задачи выполняются в потоках, которые выполняются одновременно.

Я действительно не понимаю многих из чрезмерно подробных ответов здесь, по-видимому, подразумевающих, что параллельное и параллельное программирование - это разные подходы к программированию, которые не пересекаются.

Если вы пишете параллельную программу, вы по определению пишете частный случай параллельной программы. Кажется, что с годами термины были бесполезно запутаны и усложнены.

Одним из лучших и наиболее подробных материалов по параллельному программированию является книга Джо Даффи «Параллельное программирование в Windows». В этой книге дается определение параллелизма, а затем рассказывается о различных ресурсах ОС, библиотеках и т. д., доступных для написания «параллельных» программ, таких как библиотека Task Parallel в .NET.

На странице 5:

«Параллелизм — это использование параллелизма для разложения операции на более мелкие составные части, чтобы независимые части могли работать на отдельных процессорах на машине».

Итак, опять же, параллельное программирование — это просто особый тип параллельного программирования, при котором несколько потоков/задач будут выполняться одновременно.

PS Мне всегда не нравилось, что в программировании слова concurrent и parallel имеют такое перегруженное значение. Например, в большом мире за пределами программирования "баскетбольные матчи будут проводиться одновременно" и "баскетбольные матчи будут проводиться параллельно" идентичны.

Представьте смехотворную путаницу на конференции разработчиков, где в первый день они объявляют, что сеансы будут выполняться «параллельно», а на второй день они будут выполняться «одновременно». Было бы весело!

Эти два термина означают одно и то же.

  • Параллельность: словарь Merriam Webster имеет основное определение: «действующий или происходящий одновременно». Второе определение — «идти параллельно».

  • Параллельно: в отличие от последовательного. Слово «параллельный» относится к параллельным линиям (или, точнее, сегментам линий) при использовании визуальной диаграммы, где сегменты линий представляют потоки выполнения. Во избежание путаницы термин «потоки» используется в общем смысле, а не обязательно какой-либо конкретной технологии потоков. Последовательные сегменты линий означают, что задачи выполняются последовательно, одна за другой, а параллельные сегменты линий означают, что задачи выполняются параллельно или одновременно.

Несколько других ответов и некоторые авторитетные источники предполагают, что существует разница в отношении действительно одновременного выполнения на разных ядрах ЦП, но это различие не является общепринятым и признанным.

Разные люди говорят о разных видах параллелизма и параллелизма во многих конкретных случаях, поэтому необходимы некоторые абстракции, чтобы охватить их общую природу.

Основная абстракция делается в информатике, где как параллелизм, так и параллелизм связаны со свойствами программ. Здесь программы представляют собой формализованные описания вычислений. Такие программы не должны быть на каком-либо конкретном языке или кодировке, которая зависит от реализации. Существование API/ABI/ISA/OS не имеет отношения к такому уровню абстракции. Конечно, для выполнения конкретных работ по программированию потребуются более подробные знания, специфичные для реализации (например, модель потоков), а дух базовой абстракции не меняется.

Вторым важным фактом является то, что общие свойства параллелизма и параллелизма могут сосуществовать во многих различных абстракциях.

Общее различие см. В соответствующем ответе для основного взгляда на параллелизм и параллелизм. (Есть также некоторые ссылки, содержащие некоторые дополнительные источники.)

Параллельное программирование и параллельное программирование - это методы реализации таких общих свойств в некоторых системах, которые обеспечивают программируемость. Системы обычно являются языками программирования и их реализациями.

Язык программирования может предоставлять предполагаемые свойства по встроенным семантическим правилам. В большинстве случаев такие правила определяют оценки конкретных языковых структур (например, выражений), делая вычисление эффективно параллельным или параллельным. (Более конкретно, вычислительные эффекты, подразумеваемые оценками, могут идеально отражать эти свойства.) Однако семантика параллельного / параллельного языка по существу сложна и не нужна для практических работ (для реализации эффективных параллельных / параллельных алгоритмов в качестве решения реалистичных задач).). Таким образом, большинство традиционных языков используют более консервативный и более простой подход: предполагая семантику оценки полностью последовательной и последовательной, а затем предоставляя необязательные примитивы, позволяющие некоторым вычислениям быть параллельными и параллельными. Эти примитивы могут быть ключевыми словами или процедурными конструкциями ("функциями"), поддерживаемыми языком. Они реализуются на основе взаимодействия с размещенными средами (ОС или "железным" аппаратным интерфейсом), обычно непрозрачным (не выводимым с помощью переносимого языка) для языка. Таким образом, в этом особом виде высокоуровневых абстракций, видимых программистами, нет ничего параллельного / параллельного, кроме этих "магических" примитивов и программ, полагающихся на эти примитивы; тогда программисты могут наслаждаться менее подверженным ошибкам опытом программирования, когда свойства параллелизма / параллелизма не столь интересны.

Хотя примитивы абстрагируют комплекс в абстракциях самого высокого уровня, реализации все еще имеют дополнительную сложность, не раскрытую языковой функцией. Итак, нужны абстракции среднего уровня. Типичным примером является многопоточность. Потоки позволяют выполнять один или несколько потоков (или просто поток; иногда его также называют процессом, который не обязательно является концепцией задачи, запланированной в ОС), поддерживаемой языковой реализацией (среда выполнения). Потоки обычно предварительно планируются во время выполнения, поэтому поток не должен ничего знать о других потоках. Таким образом, потоки естественны для реализации параллелизма до тех пор, пока они ничего не разделяют (критические ресурсы): просто разложите вычисления в разных потоках, как только базовая реализация позволяет перекрывать вычислительные ресурсы во время выполнения, это работает. Потоки также подвержены одновременному доступу к общим ресурсам: простой доступ к ресурсам в любом порядке соответствует минимальным ограничениям, требуемым алгоритмом, и реализация в конечном итоге определит, когда осуществлять доступ. В таких случаях могут потребоваться некоторые операции синхронизации. Некоторые языки рассматривают операции с потоками и синхронизацией как части высокоуровневой абстракции и представляют их как примитивы, в то время как некоторые другие языки вместо этого поощряют только относительно более высокоуровневые примитивы (такие как futures / promises).

На уровне специфичных для языка потоков выполняется многозадачность базовой хостинговой среды (как правило, ОС). Упреждающая многозадачность на уровне ОС используется для реализации (вытесняющей) многопоточности. В некоторых средах, таких как Windows NT, основные единицы планирования (задачи) также являются "потоками". Чтобы отличить их от реализации упомянутых выше потоков в пользовательском пространстве, они называются потоками ядра, где "ядро" означает ядро ​​ОС (однако, строго говоря, это не совсем так для Windows NT; "настоящим" ядром является NT исполнительный). Потоки ядра не всегда сопоставляются с потоками в пространстве пользователя 1:1, хотя сопоставление 1:1 часто уменьшает большинство накладных расходов на сопоставление. Поскольку потоки ядра имеют большой вес (включая системные вызовы) для создания / уничтожения / связи, в пользовательском пространстве есть не зеленые потоки 1:1, чтобы преодолеть накладные расходы за счет затрат на отображение. Выбор отображения в зависимости от парадигмы программирования, ожидаемой в абстракции высокого уровня. Например, когда ожидается одновременное выполнение огромного числа потоков в пользовательском пространстве (например, Erlang), отображение 1:1 невозможно.

В основе многозадачности ОС лежит многозадачность на уровне ISA, обеспечиваемая логическим ядром процессора. Обычно это самый низкоуровневый публичный интерфейс для программистов. Ниже этого уровня может существовать SMT. Это форма более низкого уровня многопоточности, реализуемая аппаратными средствами, но, возможно, все еще несколько программируемая - хотя обычно она доступна только производителю процессора. Обратите внимание, что аппаратный дизайн, по-видимому, отражает параллелизм, но существует также механизм параллельного планирования, позволяющий эффективно использовать внутренние аппаратные ресурсы.

На каждом упомянутом выше уровне "потоков" участвуют как параллелизм, так и параллелизм. Хотя программные интерфейсы сильно различаются, все они подчиняются свойствам, раскрытым базовой абстракцией в самом начале.

Параллельный : на одноядерной машине многозадачность выполняется в стиле разделения процессорного времени.
Параллельный : на многоядерной машине несколько задач выполняются на каждом ядре одновременно.

Другие вопросы по тегам