TheFreeMan> Scheduler Windows (и Linux тоже) не делает разницы между релаьными и виртуальными ядрами.
TheFreeMan> Строго говоря, когда влючен HT то реальных ядер вообще нет, есть только виртуальные.
TheFreeMan> Если отключить HT, то будут только реальные.
TheFreeMan> Насчет самого топика, напишите программу которая запускает 2 потока которые исполняют while(1).
TheFreeMan> Будут загружены 2 ядра из 4-х. Надо обьяснять почему ?
В данном случае у нас не 2 треда, а, как легко видеть, 1041.
И вообще, вопрос исчерпан. По данной Никите ссылке, Windows знает, какие ядра "виртуальные". Вернее, скорее всего, знает, какая пара "виртуальных" сидит на одном "реальном". И дальше действует в соответствии. Т.е, скажем, у нас такая раскладка:
Ядро 1-2 - на "реальном" №1
Ядро 3-4 - на "реальном" №2
Ядро 5-6 - на "реальном" №3
Ядро 7-8 - на "реальном" №4
Загрузка такая:
1, 4, 5, 8 - 75%
2, 3, 6, 7 - 0%
Что такое 75%? Это, по большому счету, значит вот что: в данный момент вероятность застать ядро свободным равна 1/4. Конечно, у нас есть всякие очереди и т.п, но если у нас общая нагрузка на процессоры низка, очереди на выполнение практически пусты / процессы в состоянии ожидания.
Теперь мы пытаемся выполнить тред. Винда видит, что 1-2 - на одном и том же "реальном" ядре и понимает, что не имеет смысла выдавать на ядро 2 пока ядро 1 не занято. Потому, что хотя HT сделает переключение контекста быстрее, чем ОС, но не делать переключение - еще быстрее. Итак, винда сначала пытается найти свободное "реальное" ядро и с вероятностью 1-(3/4)4 его находит. Иначе выдает исполнение на "несвободное".
ЗЫ Я понимаю, что в реальности scheduler куда сложнее, я иллюстрирую принцип.