Имеет ли смысл порождать более одного потока на процессор? - PullRequest
8 голосов
/ 02 февраля 2009

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

Я видел некоторые серверные приложения, которые реализуют планировщик для логического управления задачами (часто называемыми заданиями), но также порождают много потоков, поэтому я не вижу, в чем преимущество.

Заранее спасибо.

Ответы [ 9 ]

23 голосов
/ 02 февраля 2009

Конечно. Если ваше программное обеспечение часто использует дисковый или сетевой ввод-вывод, вы часто можете улучшить пропускную способность, добавив еще несколько потоков. Эти дополнительные потоки будут бодрствовать и делать что-то, пока другие потоки блокируют IO.

12 голосов
/ 02 февраля 2009

Другие говорили о ситуациях, в которых это почти наверняка имеет смысл (когда вы выполняете медленный ввод-вывод).

Может быть не будет хорошей идеей, если:

  • ваши потоки выполняют работу, связанную с процессором

и

  • каждый из потоков хочет использовать много (т.е. значительно по сравнению с размером кэша) памяти, которая не перекрывается

В этом случае существует вероятность возникновения ненужных пропусков кэша.

6 голосов
/ 02 февраля 2009

Это может иметь смысл, если

  1. преимущества разработки вашей программы в том, что у вас есть параллельные задачи, которые лучше всего реализовать в потоках, или

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

4 голосов
/ 02 февраля 2009

Короткий ответ "да".

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

Если вы не пользуетесь многопоточностью, вы в конечном итоге будете выполнять работу по планированию самостоятельно, что может быть полезно, если это то, что вам нужно, но, скорее всего, будет утомительным и неэффективным

3 голосов
/ 02 февраля 2009

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

3 голосов
/ 02 февраля 2009

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

2 голосов
/ 02 февраля 2009

Поскольку все современные ОС являются многозадачными: каждый поток получает долю времени от процессора. На самом деле это не параллельное выполнение, но, учитывая, что процессор может обрабатывать тысячи запросов в секунду, это «очевидное» параллельное выполнение.

Так что да, если это необходимо, имеет смысл использовать многопоточность на одном процессоре.

1 голос
/ 15 октября 2010

Согласно Хербу Саттеру (одному из ведущих экспертов по параллелизму), один из Столпов параллелизма - это Отзывчивость и изоляция с помощью асинхронных агентов . Резюме:

Сохраняйте отзывчивость, выполняя задания независимо и асинхронно, общаясь через сообщения.

Отличная статья (и серия в целом!). Я все еще жду книгу.

1 голос
/ 27 марта 2009

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

На четырехъядерном процессоре, безусловно, имеет смысл запустить более четырех потоков. Маловероятно, что эти 4 потока будут распределены по нескольким ядрам, особенно при сегодняшних скоростях процессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...