Подтвердить что ты не робот

Многопоточные и многоядерные разности

У меня есть несколько небольших вопросов.

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

Во-вторых, у большинства ядер есть два потока, но при профилировании моего приложения я заметил множество разных потоков, начиная от потока 128 до потока 3460. Что определяет количество потоков вашего компьютера?

Спасибо

4b9b3361

Ответ 1

Во-первых, существует ли разница между многопоточными и многоядерными?

Да.

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

  • Multicore относится к компьютеру или процессору с более чем одним логическим ядром центрального процессора и может физически выполнять несколько инструкций одновременно. Компьютерный "подсчет ядра" - это общее количество ядер, которые компьютер имеет: компьютеры могут иметь несколько процессоров, каждый из которых может иметь несколько ядер; подсчет ядра - это общее количество ядер на всех процессорах.

  • Многопоточность относится к программе, которая может использовать многоядерный компьютер, одновременно работая на нескольких ядрах. В общем случае в два раза больше ядер равна вдвое большей вычислительной мощности (для программ, поддерживающих многопоточность), хотя некоторые проблемы ограничены факторами, отличными от использования ЦП; эти проблемы не будут иметь преимуществ, столь же драматических из многопоточности.

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

Это две совершенно разные вещи или многопоточность использует более одного ядра, если это необходимо?

Они связаны друг с другом, но отдельно.

Программы, поддерживающие многопоточность, могут использовать более одного ядра, если доступно более одного.

В большинстве ядер есть два потока, но при профилировании моего приложения я заметил множество разных потоков, начиная от потока 128 и заканчивая потоком 3460.

Операционная система назначает номера потоков, чтобы отслеживать их.

В большинстве программ, которые вы когда-либо запускаете, не потребуется сразу 3400 потоков. Кроме того, работающий поток будет потреблять все ядро. Единственная причина, по которой ваш процессор не работает на 100% все время, заключается в том, что операционная система знает, как приостановить работу процессора, что в основном заставляет его останавливать все и ждать, пока что-то не произойдет (например, событие ввода-вывода или тактовый сигнал). Только один поток может работать на ядре сразу. Различные потоки, выполняемые на самом деле, - это просто потоки, которые прыгают на процессор и работают в течение коротких промежутков времени, а затем отключаются другими потоками, которые также нужно запускать.

Что определяет количество потоков вашего компьютера?

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

Процесс - это программа (вы, наверное, знаете это). Многопоточность - это процесс, состоящий из нескольких потоков для каждого процесса (многие процессы не будут создавать более одного потока, потому что им не обязательно). Windows не имеет жесткого ограничения на количество потоков, которые вы можете создать (по крайней мере, не с XP. Не собираюсь ничего говорить о w98 и предыдущем), но, конечно, количество потоков, которые вы можете сделать, ограничено количеством памяти у вас есть.

Вы сказали, что некоторые программы используют несколько потоков по причинам, отличным от производительности.

Иногда приятно иметь возможность многозадачности, даже если не одновременно.

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

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

Ответ 2

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

Конечно, с одним ядром вы не можете одновременно запускать несколько потоков. ОС должна постоянно переключаться между потоками.

Ответ 3

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

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

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

Ответ 4

Большинство ядер имеют два потока

Здесь, я думаю, вы путаете перегруженный термин "поток". Как правильно указано в других ответах, поток обычно ссылается на концепцию "программного обеспечения". Но иногда он также используется как "аппаратная" концепция. Когда "ядро" имеет два "потока" (как и во многих новых чипах Intel), это означает, что ядро ​​может запускать два параллельных потока, как если бы было два ядра. Это, однако, обычно называют гиперпотоком. См:

http://en.wikipedia.org/wiki/Hyper-threading

Итак, если у вас есть N потоков (я имею в виду программные потоки, созданные в вашем приложении или просто запуская разные приложения одновременно) и M-процессоры (являющиеся ядрами или связанные с ними потоки оборудования, описанные выше), происходит следующее:

  • N <= M: тогда операционная система должна назначать каждому потоку другой процессор. Затем потоки приложений работают по-настоящему параллельно.
  • N > M: тогда некоторые потоки должны разделить процессор.

Ответ 5

Каждое ядро сможет выполнять один поток одновременно. Ядро отвечает за выполнение цикла потока.