Когда создается новая тема, что
алгоритм назначения потока
к конкретному ядру?
Это полностью зависит от ОС. И ответом обычно является сильно модифицированная круговая схема. Каждые x миллисекунд ядро прерывается, и на него помещается новый поток (поэтому нет «наименее используемого ядра». Пока есть готовые к работе потоки, каждому ядру будет чем заняться).
В Windows я считаю, что поток / процесс с самым высоким приоритетом всегда выбран для выполнения. (Таким образом, если у вас есть один процесс с высоким приоритетом в одноядерной системе, этот процесс потенциально может выполняться 100% времени, что приводит к истощению всех остальных процессов. Конечно, это применимо, только если этот процесс никогда не блокируется, что маловероятно в реальный мир.
И, конечно, поскольку современная ОС, такая как Windows, сложна, в ней есть намного больше. Некоторым процессам время от времени предоставляется преференциальный режим, но, как правило, Windows всегда будет выбирать высокоприоритетные процессы (именно поэтому вы можете в значительной степени заморозить свой компьютер, отдавая приоритет процесса в реальном времени в одноядерные дни )
В Linux процессы с более низким приоритетом также регулярно планируются, но не так часто.
Но лучшее, что вы можете сделать, - это просто предположить, что ОС разработает честную схему, а затем попытаться поиграть с остальной системой. (Выходить / блокировать / спать, когда вам нечего делать, позволяя другим потокам работать).
Переносятся ли потоки из одного ядра в
другой при жизни?
Конечно. Представьте, что у вас есть три потока, работающих в двухъядерной системе. Покажите мне честное расписание, которое не предполагает регулярного перемещения потоков между ядрами.
Мой последний вопрос, который в основном
повторное использование выше, о
Класс .NET ThreadPool, который обрабатывает
такие вещи, как .BeginInvoke и такие.
Этот класс делает что-нибудь из этого?
Если нет, то почему бы и нет?
Какие вещи? Планирование потоков и выбор ядер для запуска? Нет, пул потоков - это просто механизм повторного использования потоков для нескольких задач, вместо того, чтобы создавать новый поток для каждой отдельной задачи, а затем закрывать его.
Есть ли способ настроить это
обработка, своего рода намек на
операционная система, которая эта конкретная
нить
Вот для чего приоритет потока / процесса. Если у вас есть поток, который должен получать много процессорного времени, даже если запущены другие потоки с интенсивным использованием процессора, увеличьте приоритет потока.
Но обращаться с осторожностью. Обычно не так много запущенных потоков, интенсивно использующих процессор, а это значит, что даже при обычном приоритете вы получите 99,9% процессорного времени. Как я уже говорил, Windows очень агрессивно планирует потоки с более высоким приоритетом, поэтому повышайте приоритет только в том случае, если вы действительно имеете это в виду.