Concurrency: Процессы против потоков

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

Ответы

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

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

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

В целом:

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

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

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