В многоядерном процессоре есть способы указать конкретному приложению работать либо на одном ядре, либо на 2 ядрах, либо на 3 ядрах. Учитывая сценарий, в котором приложение (имеющее множество потоков) выполняется более чем на одном ядре, как планировщик сможет определить нагрузку (количество потоков) на конкретное ядро в многоядерном процессоре и соответственно распределить (сбалансировать) загружать (распределять потоки) по различным ядрам?
Определение нагрузки на конкретное ядро в многоядерном процессоре
Ответы (2)
В большинстве планировщиков каждый ЦП является независимым объектом, который исследует текущее состояние системы и пытается найти что-то полезное для себя. Представьте ЦП как трудоголика — он всегда будет пытаться сделать все возможное. Планировщик — это не «босс», который говорит ЦП, что делать дальше, следя за тем, чтобы каждый выполнял справедливую долю. Скорее, каждый ЦП следует алгоритму планирования, в котором он исследует состояние системы и пытается выяснить, как выполнить наибольшую работу, на которую он способен.
Алгоритм планирования может иметь некоторое положение для «привязки к потоку», что означает, что ЦП предпочтет запустить ранее запланированный поток, поскольку этот поток, скорее всего, находится в кеше. Однако, в отличие от балансировки сетевой нагрузки, алгоритмы планирования обычно (но не всегда) заботятся о том, чтобы каждый ЦП был максимально загружен, даже если рабочая нагрузка оказывается несправедливой.
Почему? Если рабочая нагрузка интенсивно использует ЦП, то каждый ЦП сможет работать почти на 100 %, и рабочая нагрузка будет справедливой. Если рабочая нагрузка связана с интенсивным вводом-выводом, а ЦП тратят большую часть своего времени на ожидание доступности общих ресурсов, что является нормальным случаем для реальной системы, любая стратегия балансировки нагрузки, скорее всего, будет противоречить простой работе по высвобождению общих ресурсов по мере их поступления. как можно быстрее.
Простой многопроцессорный планировщик будет включать в себя очередь выполняемых потоков и список заблокированных потоков — эта очередь и список представляют собой структуры данных, совместно используемые всеми процессорами, доступ к которым защищен блокировкой. Когда ЦП входит в планировщик, он выбирает исполняемый поток с наивысшим приоритетом и запускает этот поток до тех пор, пока не истечет время блоков или выделенный квант времени. Если поток блокируется, он помещается в список заблокированных потоков до тех пор, пока снова не станет работоспособным. Если квант времени истекает, поток помещается в отложенную позицию в очереди исполняемых потоков и выбирается другой поток.
В Linux вы можете использовать taskset -c ### ./executable
, где #### — список процессоров.