В чем разница между потоками и параллелизмом?
Какой из них имеет преимущество перед другим?
В чем разница между потоками и параллелизмом?
Какой из них имеет преимущество перед другим?
Дэниел Мот (мой бывший коллега) — Threading/Concurrency vs Parallelism статья все объясняет.
Цитата:
Чтобы воспользоваться преимуществами нескольких ядер нашего программного обеспечения, в конечном итоге необходимо использовать потоки. Из-за этого некоторые разработчики попадают в ловушку, приравнивая многопоточность к параллелизму. Это неверно... Вы можете иметь многопоточность на одноядерной машине, но вы можете иметь параллелизм только на многоядерной машине.
Быстрый тест: если на одноядерной машине вы используете потоки, и это идеально подходит для вашего сценария, то вы не используете параллелизм, вы просто используете многопоточность.
Многопоточность обычно относится к тому, что несколько процессов работают одновременно на одном процессоре (на самом деле вы не думаете, что они работают, но они очень быстро переключаются между ними).
Параллелизм — это когда несколько процессов работают одновременно на нескольких процессорах.
У обоих есть свои плюсы и минусы, в значительной степени зависящие от планировщика, используемого вашей операционной системой. Обычно стоимость вычислений для создания потока намного ниже, чем создание процесса на другом ЦП, однако наличие «цельного» ЦП для себя увеличивает общую скорость этого процесса. Но опять же, если этому процессу необходимо взаимодействовать с другим процессом на другом ЦП, вам необходимо решить проблему IPC (межпроцессное взаимодействие), которая может быть такой накладной, что лучше просто использовать поток на том же ЦП.
Большинство операционных систем знают о нескольких процессорах/ядрах и могут их использовать, но это обычно делает планировщик довольно сложным.
Если вы программируете на языке, который использует VM (виртуальную машину), имейте в виду, что им нужно реализовать собственный планировщик (если вообще). Python, например, использует GIL, который в значительной степени говорит, что все, что работает на этой виртуальной машине, всегда остается на одном и том же процессоре. Хотя некоторые ОС способны переносить тяжелый процесс на другой ЦП, который не так загружен в данный момент, что, конечно, означает, что весь процесс необходимо приостановить, пока он это делает.
Некоторые операционные системы, такие как DragonFlyBSD, используют совершенно другой подход к планированию, чем то, что в данный момент является «стандартным» подходом.
Я думаю, что этот ответ дает вам достаточно ключевых слов для поиска дополнительной информации :-)
Существует два различных типа параллелизма:
Как видите, они решают совершенно разные задачи.
Параллелизм — это общий метод использования более чем одного потока инструкций для выполнения вычислений. Важнейшим аспектом всех параллельных методов является взаимодействие между потоками для совместного получения окончательного ответа.
Потоки — это конкретная реализация параллелизма. Каждому потоку инструкций предоставляется собственный стек для хранения записей о локальных переменных и вызовах функций, и он неявно взаимодействует с другими потоками через общую память.
Одним из примеров может быть то, что один поток просто ставит в очередь запросы к диску и передает их рабочему потоку, эффективно распараллеливая диск и ЦП. Традиционный метод каналов UNIX состоит в том, чтобы разбить их на две полные программы, скажем «cat» и grep в команде:
cat /var/log/Xorg.0.log | grep "EE"
Многопоточность могла бы снизить затраты на связь при копировании дискового ввода-вывода из процесса cat в процесс grep.
Многопоточность — это технология, параллелизм — это парадигма, которая может быть реализована с помощью многопоточности (но с тем же успехом может быть реализована с использованием отдельных потоков на нескольких процессорах).
Вот лучший ответ, чтобы развеять чьи-либо сомнения, связанные с параллелизмом и многопоточностью.
Потоки — это программная конструкция. Я могу запустить столько pthreads, сколько захочу, даже на старом одноядерном процессоре. Таким образом, многопоточность не обязательно параллельна: она параллельна только в том случае, если аппаратное обеспечение может ее поддерживать. Поэтому, если у вас есть несколько ядер и/или гиперпоточность, ваша многопоточность становится параллельной. И в наши дни это на самом деле большую часть времени.
Параллелизм относится к действиям, которые не имеют четкого временного порядка. Так что опять же, если железо поддерживает, их можно делать параллельно, если нет, то нет.
Таким образом, традиционно многопоточность является почти синонимом параллелизма. И оба они становятся параллельными только в том случае, если аппаратное обеспечение поддерживает это. Даже в этом случае вы можете запускать намного больше потоков, чем поддерживает аппаратное обеспечение, и у вас остается параллелизм.
Из ответа Виктора Эйкхаута на Quora.
Многопоточность — это параллелизм для бедняков.
РЕДАКТИРОВАТЬ: Чтобы быть более точным:
Threading не имеет ничего общего с параллелизмом и наоборот. Многопоточность — это создание ощущения, что некоторые процессы выполняются параллельно. Однако это не заставляет процессы завершать ВСЕ свои действия в целом быстрее.
Как вы определяете «параллелизм»? Многопоточность — это конкретная реализация концепции параллельного выполнения программы.
Статья, на которую ссылается RichardOD, по-видимому, в основном касается того, действительно ли потоки выполняются параллельно на конкретной машине.
Однако ваш вопрос, кажется, рассматривает многопоточность и параллелизм как противоположности. Возможно, вы имеете в виду программы, которые используют несколько процессов, а не несколько потоков? Если да, то отличия:
Если мы думаем о ЦП как о компании, а о потоках как о его работниках, то это поможет нам легче понять многопоточность и параллелизм.
Подобно тому, как в компании много рабочих, у процессора также много потоков.
Также может быть более одной компании и, следовательно, может быть более одного процессора.
Поэтому, когда рабочие (потоки) работают в компании (CPU), это называется threading.
И когда две или более компаний (CPU) работают независимо или вместе, это называется параллелизм.