Поток против параллелизма, чем они отличаются? - PullRequest
35 голосов
/ 30 апреля 2009

В чем разница между многопоточностью и параллелизмом?

Какой из них имеет преимущество перед другим?

Ответы [ 8 ]

36 голосов
/ 30 апреля 2009

Даниэль Мот (бывший мой коллега) - Threading / Concurrency vs Parallelism * В статье 1002 * все объясняется.

Цитируется:

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

Быстрый тест: если на одноядерной машине вы используете потоки и это имеет смысл для вашего сценария, то вы не «выполняете параллелизм», вы просто делаете многопоточность.

6 голосов
/ 30 апреля 2009

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

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

Одним из примеров может быть то, что один поток просто ставит в очередь запросы к диску и передает его в рабочий поток, эффективно распараллеливая диск и процессор. Традиционный метод конвейеров UNIX состоит в том, чтобы разделить их на две полные программы, например, «cat» и grep в команде:

cat /var/log/Xorg.0.log | grep "EE"

Многопоточность может значительно снизить затраты на связь при копировании дискового ввода-вывода из процесса cat в процесс grep.

5 голосов
/ 30 апреля 2009

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

Параллелизм - это одновременная работа нескольких процессов на нескольких процессорах.

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

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

Если вы программируете на языке, использующем виртуальную машину (виртуальную машину), имейте в виду, что им нужно реализовать свой собственный планировщик (если вообще есть). Например, Python использует GIL, который говорит, что все, что работает на этой виртуальной машине, всегда остается на одном и том же процессоре. Хотя некоторые ОС способны переносить тяжелый процесс на другой процессор, который в данный момент не так занят, это, конечно, означает, что весь процесс должен быть приостановлен, пока он это делает.

Некоторые операционные системы, такие как DragonFlyBSD, используют совершенно иной подход к планированию, чем тот, который на данный момент является «стандартным» подходом.

Я думаю, что этот ответ дает вам достаточно ключевых слов для поиска дополнительной информации: -)

3 голосов
/ 30 апреля 2009

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

2 голосов
/ 16 мая 2017

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

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

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

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

С ответ Виктора Эйххоута о Коре .

1 голос
/ 09 сентября 2018

Если мы думаем, что ЦП как компания, а потоки - как ее сотрудники , тогда это поможет нам легче понять многопоточность и параллелизм.

Как у компании много работников, так и у процессора много потоков.

Также может быть более одной компании, и, следовательно, может быть более одного ЦП.

Поэтому, когда рабочие (потоки) работают в компании (ЦП), это называется threading .

И когда две или более компании (ЦП) работают независимо или вместе, это называется параллелизм .

1 голос
/ 30 апреля 2009

Потоки - это параллелизм бедняка.

РЕДАКТИРОВАТЬ: Чтобы быть более точным:

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

1 голос
/ 30 апреля 2009

Как вы определяете "параллелизм"? Многопоточность - это конкретная реализация концепции параллельного выполнения программ.

Статья, на которую ссылается RichardOD, в основном касается того, выполняются ли потоки параллельно на конкретной машине.

Однако ваш вопрос, похоже, рассматривает многопоточность и параллелизм как противоположности. Возможно, вы имеете в виду программы, которые используют несколько процессов , а не несколько потоков? Если это так, различия:

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