Процессоры MultiCore, многопоточность и переключение контекста?

Предположим, что у нас есть процессор с 20 ядрами и процесс с 20-процентной интенсивностью, независимо от других потоков: один поток на ядро ​​процессора. Я пытаюсь выяснить, происходит ли переключение контекста в этом случае. Я считаю, что это происходит потому, что в операционной системе есть системные процессы, которым также требуется время CPU.

Я понимаю, что существуют разные архитектуры процессора, и некоторые ответы могут отличаться, но можете ли вы объяснить:

  • Как происходит переключение контекста, например. на Linux или Windows и некоторые известные архитектуры процессоров? А что происходит под капотом на современном оборудовании?
  • Что делать, если у нас есть 10 ядер и 20 потоков или наоборот?
  • Как рассчитать, сколько потоков нам нужно, если у нас есть n процессоров?
  • Будет ли кеш процессора (L1/L2) пустым после переключения контекста?

Спасибо

Ответ 1

Как происходит переключение контекста, например. на Linux или Windows и некоторые известные Архитектуры процессора? А что происходит под капотом на современном оборудовании?

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

Ядро может изменять набор запущенных потоков, останавливая thread/s и запуская другие. Он может остановить любой поток, выполняющийся на любом ядре, путем очередности запроса на прерывание и создания аппаратного прерывания этого ядра, чтобы заставить ядро ​​запустить свой межпроцессорный драйвер для обработки запроса.

Что делать, если у нас есть 10 ядер и 20 потоков?

Зависит от того, что делают потоки. Если они находятся в каком-либо другом состоянии, чем готовы/запущены (например, заблокированы на вводе-выводе или межпоточных комм), между ними не будет переключения контекста, потому что ничего не выполняется. Если все они готовы/работают, 10 из них будут работать вечно на 10 ядрах, пока не произойдет прерывание. Большинство систем имеют периодическое прерывание таймера, которое может влиять на совместное использование доступных ядер вокруг потоков.

или наоборот

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

Как рассчитать, сколько потоков нам нужно, если у нас есть n процессоров?

App-зависимый. Было бы неплохо, если бы все ядра всегда использовались на 100% на столько же готовых потоков, сколько ядра, но, поскольку большинство потоков блокируются гораздо больше времени, чем они работают, трудно, за исключением некоторых конечных случаев (например, ваши интенсивные потоки, потребляющие 20 процессоров на 20 ядрах, для создания оптимального числа.

После переключения контекста пуст CPU (L1/L2) пуст?

Возможно - это полностью зависит от использования данных потоков. Как обычно, кеши будут загружаться по требованию. Нет никакой "перезагрузки общего кэша коммутатора контекста", но если потоки будут обращаться к другим, большие массивы данных во время работы, то (по крайней мере, L1) кеш действительно будет полностью перезагружен во время прогона потока.