Ответ 1
Во-первых, существует ли разница между многопоточными и многоядерными?
Да.
Многопоточность и многоядерность - это разные термины, которые применяются к различным областям вычислений.
-
Multicore относится к компьютеру или процессору с более чем одним логическим ядром центрального процессора и может физически выполнять несколько инструкций одновременно. Компьютерный "подсчет ядра" - это общее количество ядер, которые компьютер имеет: компьютеры могут иметь несколько процессоров, каждый из которых может иметь несколько ядер; подсчет ядра - это общее количество ядер на всех процессорах.
-
Многопоточность относится к программе, которая может использовать многоядерный компьютер, одновременно работая на нескольких ядрах. В общем случае в два раза больше ядер равна вдвое большей вычислительной мощности (для программ, поддерживающих многопоточность), хотя некоторые проблемы ограничены факторами, отличными от использования ЦП; эти проблемы не будут иметь преимуществ, столь же драматических из многопоточности.
Важно отметить, что производительность - не единственная причина, по которой программы используют много потоков. Подробнее об этом позже.
Это две совершенно разные вещи или многопоточность использует более одного ядра, если это необходимо?
Они связаны друг с другом, но отдельно.
Программы, поддерживающие многопоточность, могут использовать более одного ядра, если доступно более одного.
В большинстве ядер есть два потока, но при профилировании моего приложения я заметил множество разных потоков, начиная от потока 128 и заканчивая потоком 3460.
Операционная система назначает номера потоков, чтобы отслеживать их.
В большинстве программ, которые вы когда-либо запускаете, не потребуется сразу 3400 потоков. Кроме того, работающий поток будет потреблять все ядро. Единственная причина, по которой ваш процессор не работает на 100% все время, заключается в том, что операционная система знает, как приостановить работу процессора, что в основном заставляет его останавливать все и ждать, пока что-то не произойдет (например, событие ввода-вывода или тактовый сигнал). Только один поток может работать на ядре сразу. Различные потоки, выполняемые на самом деле, - это просто потоки, которые прыгают на процессор и работают в течение коротких промежутков времени, а затем отключаются другими потоками, которые также нужно запускать.
Что определяет количество потоков вашего компьютера?
Общее количество потоков во всех ваших процессах. Кроме того, большинство операционных систем налагают жесткий предел, максимальное количество существующих потоков, которые нельзя превзойти.
Процесс - это программа (вы, наверное, знаете это). Многопоточность - это процесс, состоящий из нескольких потоков для каждого процесса (многие процессы не будут создавать более одного потока, потому что им не обязательно). Windows не имеет жесткого ограничения на количество потоков, которые вы можете создать (по крайней мере, не с XP. Не собираюсь ничего говорить о w98 и предыдущем), но, конечно, количество потоков, которые вы можете сделать, ограничено количеством памяти у вас есть.
Вы сказали, что некоторые программы используют несколько потоков по причинам, отличным от производительности.
Иногда приятно иметь возможность многозадачности, даже если не одновременно.
Иногда программам нужно делать определенные вещи в определенное время. Обычно цитируемый пример - это программа с видимым окном. Эта программа может интенсивно выполнять хэширование фона, но это принесет пользу, если она все равно сможет реагировать на пользовательские события, например, кнопки кликов и изменение размера. Это может быть достигнуто с помощью асинхронной обработки, которая потребует, чтобы ваш один поток неоднократно проверял работу GUI на интервалы, приостанавливал работу и обрабатывал графический интерфейс некоторое время. Многие вещи делают это таким образом.
Другой, возможно, лучший способ справиться с ним - это поток. Ваша программа не должна беспокоиться о переключении между хрустом числа и управлением графическим интерфейсом, операционная система справится с этим для вас. Даже если у вас есть только одно ядро, вы все равно можете запускать несколько потоков, и ваша ОС сделает все возможное, чтобы убедиться, что все запущенные потоки во всех запущенных процессах получают свою долю времени процессора.