Параллельность: процессы против потоков - PullRequest
17 голосов
/ 30 ноября 2010

Каковы основные преимущества использования модели для параллелизма на основе процессов над одним на основе потоков и в каких контекстах уместно последнее?

Ответы [ 4 ]

18 голосов
/ 30 ноября 2010

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

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

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

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

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

С учетом сказанного, это обсуждение действительно является предметом исследования.Если вы хотите вникнуть в подробности, вы можете прочитать статью Джо Армстронга о отказоустойчивых системах] 1 , в ней многое объясняется об Erlang и философии, которая его стимулирует.

7 голосов
/ 30 ноября 2010

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

Недостатком использования потоковой модели является то, что вы, вероятно, ошибетесь.Это может звучать подло, но это правда - покажи мне код, основанный на потоках, и я покажу тебе ошибку.Я обнаружил ошибки в многопоточном коде, который работал «правильно» в течение 10 лет.

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

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

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

2 голосов
/ 30 ноября 2010

Прежде всего, процессы отличаются от потоков в основном тем, как обрабатывается их память:

Process = n*Thread + memory region  (n>=1)

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

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

Память - это самый важный фактор распознавания, посколькупоследствия:

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

Использование процессов обеспечивает хорошую (или окончательную) инкапсуляцию.Поскольку межпроцессное взаимодействие требует особых усилий, вы будете вынуждены определить чистый интерфейс.Это хорошая идея, чтобы отделить определенные части вашего приложения от основного исполняемого файла.Может быть, вы можете разделить зависимости таким образом.Например, Process_RobotAi <-> Process_RobotControl ИИ будет иметь совершенно разные зависимости по сравнению с компонентом управления.Интерфейс может быть простым: Process_RobotAI --DriveXY--> Process_RobotControl.Может быть, вы измените платформу робота.Вам нужно только реализовать новый исполняемый файл RobotControl с этим простым интерфейсом.Вам не нужно ничего трогать или даже перекомпилировать в компоненте ИИ.

По тем же причинам он в большинстве случаев ускорит компиляцию.

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

В общем:

  1. Хотите создать что-то в высокой степени параллельное или синхронное, как алгоритм с n >> 1 экземплярами, работающими параллельно и совместно использующими данные, используйте потоки.
  2. Имейте систему с несколькими компонентами, которые не должны обмениваться данными или алгоритмами, и при этом они не обмениваются данными слишком часто, используют процессы.Если вы используете библиотеку RPC для межпроцессного взаимодействия, вы получаете сетевое решение без дополнительной оплаты.

1 и 2 - это крайние и простые сценарии, все между ними должно бытьопределяется индивидуально.

Для хорошего (или удивительного) примера системы, которая интенсивно использует IPC / RPC, взгляните на ros .

2 голосов
/ 30 ноября 2010

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

Процессы Erlang - это не то же самое, что процессы ОС. Процессы Erlang очень легкие, и Erlang может иметь много процессов Erlang в одном потоке ОС. См. Технически, почему процессы в Erlang более эффективны, чем потоки ОС?

...