Когда выбрать многопоточность или многопроцессорность?

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

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

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

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

проект с открытым исходным кодом (c/c++) с параллельным программированием, надеюсь, что вы можете порекомендовать один из них.

Большое спасибо за любую помощь.


person slee    schedule 12.11.2013    source источник
comment
Поскольку основной вопрос носит более концептуальный характер, его следует задать на programmers.stackexchange.com. С другой стороны, запрос кода или стороннего ресурса не по теме и здесь, и там.   -  person Some programmer dude    schedule 12.11.2013
comment
Я спрошу на Programers.stackexchange.com. И я не имею в виду коды. То, что я сказал о проекте с открытым исходным кодом, — это любой известный проект, который мы можем легко найти на sourceforge или github и других веб-сайтах с открытым исходным кодом. ссылка или название проекта в порядке.   -  person slee    schedule 15.11.2013


Ответы (1)


Многопоточность:

  • Выполнение распределяется между потоками; в некоторых операционных системах эти потоки легче, чем процессы; вместо этого в Linux они внутренне реализованы с использованием одних и тех же структур данных.
  • Потоки совместно используют память, поэтому глобальные общие структуры данных должны быть защищены с помощью механизмов взаимного исключения (например, семафоров, мьютексов, условных переменных и т. д.).
  • В Linux библиотека pthread (что означает «потоки POSIX») обеспечивает поддержку многопоточности на уровне пользователя; потоки создаются с помощью pthread_create(); эту библиотеку можно использовать в обычных программах на C/C++, скомпилировав с параметром -pthread.

Многопроцессорность:

  • Выполнение разделено между процессами
  • Процессы традиционно не используют общую память; однако в Linux процессы также могут совместно использовать память с помощью подходящих системных вызовов.
  • В системах POSIX (например, Linux) процессы создаются с помощью системного вызова fork(): процесс (называемый «родительским») может создавать («разветвлять») другой процесс (называемый «дочерним»). . Программу C/C++ не нужно связывать с какой-либо внешней библиотекой для вызова fork().
  • Обмен данными обычно осуществляется через механизмы передачи сообщений (например, каналы, FIFO и сокеты).

Выбор между использованием многопоточности или многопроцессорности обычно зависит от двух факторов:

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

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

person Claudio    schedule 12.11.2013
comment
Интересно, что по этому поводу говорит Unix Philosophy? Я вижу, что он рекомендует вам использовать каналы и промежуточные файлы в качестве средств межпроцессного взаимодействия и избегать функций множественной ответственности многопоточных программ. - person Sridhar Sarnobat; 28.09.2017