2016-04-19 4 views
1

В настоящее время я изучаю многопоточность, потоки, потоки потоков и т. Д. Я прочитал, что количество потоков не может быть больше количества логических процессоров вашего компьютера (или, по крайней мере, нет преимуществ, которые можно получить, поскольку ваш процессор не может обрабатывать больше).Threads and Processors

Итак, каково ожидаемое поведение, если вы пишете код, который создал сотни потоков на компьютере, скажем, 12 логических процессоров? Они стоят в очереди? Они ждут друг друга? Или это дает вам ошибку? Если у вас есть процесс, который может извлечь выгоду из 100 непрерывно работающих потоков, но имеет только 12 ядер, каков наилучший способ справиться с этим? Я часто открываю свой диспетчер задач, чтобы увидеть сотни процессов и тысячи потоков. Как это работает?

Кроме того, что делать, если я запускаю программу в Windows, с запуском других приложений (например, Chrome, MS Excel, Skype и т. Д.) И, возможно, букет фоновых сервисов (т. Е. Windows Defender, Wifi services, ect ...) Удовлетворяют ли эти другие приложения логические процессоры, уменьшая тем самым количество логических процессоров, доступных для моей потоковой программы?

+0

Связанный: http://stackoverflow.com/questions/2856239/will-multi-threading-increase-the-speed-of-the-calculation-on-single-processor?rq=1 http: // stackoverflow. ком/вопросы/25790064/будет-а-многопоточный-приложение-быть на самом деле-быстрее, чем-а-однопоточных-заявл? RQ = 1 – Thilo

ответ

1

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

Что такое ожидаемое поведение, если вы пишете код, который создал сотни потоков на компьютере, скажем, 12 логических процессоров?

Если мы исходим из предположения, что среда (каркас, платформа, язык, ОС, оборудование), используемые для создания этих потоков, может поддерживать, чем много параллельных потоков, тогда результат будет состоять в том, что каждый поток запланирован операционная система на основе количества доступных ядер и приоритета этих потоков по сравнению с другими выполняемыми потоками/процессами. Это может сильно варьироваться в зависимости от конкретной операционной системы, набора инструментов, типа программы (режим ядра/пользовательский режим в окнах) и аппаратного обеспечения кода.

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

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

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

1

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

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

Неужели они стоят в очереди? Они ждут друг друга?

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