Скажем, я запускаю простой однопоточный процесс, подобный приведенному ниже:
public class SirCountALot {
public static void main(String[] args) {
int count = 0;
while (true) {
count++;
}
}
}
(Это Java, потому что это то, с чем я знаком, но я подозреваю, что это не имеет большого значения)
У меня есть процессор i7 (4 ядра или 8 счетных гиперпотоков), и я запускаю 64-разрядную версию Windows 7, поэтому я запустил Sysinternals Process Explorer, чтобы посмотреть на использование ЦП, и, как ожидается, я вижу, что он использует около 20% всего доступного процессора.
Но когда я переключаю параметр, чтобы показать 1 график на процессор, я вижу, что вместо 1 из 4 "ядер", использование ЦП распространяется по всем ядрам:
Вместо этого я ожидал бы 1 core maxed out, но это происходит только тогда, когда я устанавливаю сродство к процессу к одному ядру.
Почему рабочая нагрузка распределяется по отдельным ядрам? Не будет ли разделение рабочей нагрузки на несколько ядер беспорядочно с кешированием или на другие штрафы за производительность?
Является ли это простой причиной предотвращения перегрева одного ядра? Или есть какая-то более глубокая причина?
Изменить: Я знаю, что операционная система отвечает за планирование, но я хочу знать, почему это "беспокоит". Разумеется, с наивной точки зрения, приклеивание (в основном *) однопоточного процесса до 1 ядра - это более простой и эффективный способ перехода?
* Я говорю в основном однопоточно, потому что здесь много ада, но только 2 из них делают что-то: