Как экспериментально определить квант планирования процесса / потока?

Просто для того, чтобы исключить какие-либо комментарии на тему "зачем вам это знать?": Это просто загадка, которая меня интересовала, а не то, что мне нужно делать по какой-либо практической причине.

Учитывая типичную систему POSIX [1], как бы вы разработали эксперимент для определения кванта планирования [2] процесса, связанного с процессором?

[1]: но НЕ тот, который позволяет вам запрашивать эту информацию через интерфейс системного вызова или /proc

[2]: "Квант планирования" определяется как период времени, в течение которого процесс будет выполняться на ЦП без блокирования или уступки до того, как закончится его запланированное время, и ОС позволит запустить другой процесс.

2 ответа

Я не уверен, насколько это точно, но это может сработать:

  1. Убедитесь, что ваш компьютер бездействует (или настолько прост, насколько это возможно)
  2. Создает 2N потоков (где N - количество ядер в вашем компьютере). Все эти потоки должны быть настроены на одинаковый приоритет друг с другом.
  3. Каждый из потоков должен выполнять бесконечный цикл, в котором он ничего не делает, кроме как многократно извлекает текущее время монотонно увеличивающегося количества часов в стене, используя таймер высокого разрешения (например, вызывая std::chrono::stable_clock::now() или подобное).
  4. На каждой итерации цикла каждый поток должен проверять результирующее значение времени на наличие "внезапных промежутков", т. Е. Когда время на часах изменяется от (t) до (t+n миллисекунд, где n больше обычного значения дельты). Эти промежутки, скорее всего, указывают период времени, когда поток был запущен из ЦП, чтобы мог работать еще один поток.
  5. В какой-то момент вычислите среднее значение размеров всех этих промежутков, и это ваша оценка квантового размера планировщика.

Обратите внимание, что это предполагает, что разрешение ваших часов больше, чем квантовый размер планировщика; если это не так (например, если вы пытаетесь использовать часы с разрешением 10 мс для измерения квантовой длины 5 мс), то измерение квантовой длины будет затруднительным.

Я думаю, что вы могли бы получить ответ через статистический анализ достаточного количества прогонов следующей системы:

  • Запускайте один поток на процессор, который очищает флаг завершения, затем запускает цикл для фиксированного числа итераций или до тех пор, пока не будет установлен флаг завершения, в зависимости от того, что наступит раньше. Эти потоки записывают, завершены ли они из-за выполнения всех итераций или из-за установленного флага завершения.

  • В то же время запустите дополнительный поток, который устанавливает флаг завершения.

Делайте это с разным количеством итераций в цикле.

Если цикл завершается во временном интервале потока, он завершит все итерации. Если он не завершится во временном интервале потока, поток завершения сможет прервать один из циклических потоков.

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

Однако при достаточном количестве повторений при достаточном различии пределов итераций цикла это должно дать вам количество повторений цикла в одном временном интервале. Затем вы можете запустить большое количество итераций в незагруженной системе, чтобы получить время, необходимое для каждой итерации, а затем рассчитать время настенных часов для каждого временного интервала.

Другие вопросы по тегам