2013-06-07 3 views
0

Как только я подумал, что нужно использовать только несколько потоков, когда требуется обработка ввода-вывода.Значение многопоточности на одноядерном процессоре

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

В моем понимании, это было бы

the process with more threads are given more CPU time. 

ли это, почему несколько потоков, позволяет повысить производительность даже на одном ядре?

+0

У вас больше шансов обниматься с планировщиком? :) –

+0

даже некоторые из одиночных ядер могут выполнять несколько потоков. см. гиперпоточность. –

+0

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

ответ

3

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

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

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

+2

«такие вещи, как« чтение и запись в память », по-прежнему« ввод-вывод »- да, но они невидимы для ОС и не создают контекстных переключателей. поэтому с одним ядром вы будете застревать в ожидании памяти. –

+1

Весь этот ответ, по-видимому, основывается на рассматриваемом процессоре с гиперпотоком. Без hyperthreading OS планирует только один поток за раз, как указал @KarolyHorvath. –

+0

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

Смежные вопросы