Изменение временного интервала

728
xakepp35

Этот вопрос касается возможности настройки ядра Windows в режиме реального времени, например, oses, и способов сделать это. Это довольно специфическая узкая тема, требующая глубокого уровня знаний - вы либо знаете, либо нет.

Я на платформе WS2016 x64, и я могу установить разрешение таймера только на 500us (0.5ms), вызывая NtSetTimerResolution()функцию в течениеntdll.dll библиотеке. Я думаю, что это значение привязано к временному интервалу sheduler.

Тем не менее, я хочу увеличить его до 100US . Измерение может включать вызов, NtDelayExecution()завернутый вQueryPerformanceCounter() вызовы много раз в цикле, а затем анализировать статистику, такую ​​как джиттер, стандартное отклонение и так далее.

Как это сделать? Есть ли в реестре / файл настройки, где я могу установить Arbiraty Windows Sheduler Timeslice?


PS. Некоторые люди могут спросить « Зачем тебе это нужно? » Или заявить: «Не делай этого, это неправильно! ». Я предвижу подобные мысли и отвечу заранее.

  • Это всего лишь программный эксперимент. Это просто для проверки возможности и физических результатов этого.
  • Я знаю, что это может привести к потенциальным проблемам, таким как дополнительное время процессора, потраченное только на переключение контекста, нестабильность системы, безответственность, потеря данных и любые другие проблемы, которые это может вызвать. Я принимаю любые негативные последствия, если буду делать это заранее и брать на себя всю ответственность. Даже если бы дым и блестки вышли бы из моей машины :)
  • В соответствии с поиском или поиском здесь - конечно, я уже сделал это и не смог найти полезную информацию, потому что эта тема довольно узкая, касающаяся работы планировщиков ОС. И делать практически бессмысленно на любой windows-машине. Я знаю, что не могу превратить его в реальное время. Этот поиск по сайту "sheduler timeslice" не дает результата.
1

1 ответ на вопрос

0
Jamie Hanrahan

Интервал временного интервала планировщика не зависит напрямую от разрешения таймера. Для большинства процессов на клиентских SKU это 20 мсек; для процесса, которому принадлежит окно переднего плана, это 60 мсек. Эти значения обычно равны 120 мсек в SKU сервера.

Эти значения одинаковы независимо от того, что вы делаете с NtSetTimerResolution. Независимо от разрешения таймера, соответствующее количество тактовых прерываний отсчитывается до того, как будет обнаружен интервал в 20 мс, и планировщик уменьшает «квантовый» счетчик текущего потока и т. Д.

Таким образом, если вам удастся улучшить разрешение таймера до 100 мкс, это не повлияет на планирование потоков. Это, однако, создаст дополнительные издержки, что с 5-кратным предыдущим числом обращений к подпрограмме, которая проверяет, истек ли срок действия таймеров.

Там нет реестра или других настроек, чтобы изменить это.

Существует взлом реестра, который можно использовать для преодоления «растяжения временного интервала», которое происходит в клиентских SKU, или для того, чтобы заставить серверную систему вести себя как клиент, или наоборот, в отношении длины временного интервала. И иногда (из-за небольшого изменения Thread-> Quantum, которое выполняется, когда поток выходит из ожидания), временной интервал может быть немного короче, чем «должен» быть. Но нет никакого способа установить временной интервал менее 20 мсек или что-либо, кроме кратного 20 мсек, и не так много разных кратных значений доступно.

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

Источник: Большая часть этого находится в Windows Internals от Solomon, Russinovich, et al .

Даже с помощью hex-редактирования некоторых двоичных файлов, если он случайно был скомпилирован как константа где-то внутри ядра Windows? Тогда возникает вопрос о том, чтобы найти 4 или 8 байтов и настроить его. Это не может быть невозможным, потому что это не аппаратная проблема, а программная. И это определенно какая-то подстройка ОС, несмотря на то, что она не может быть напрямую раскрыта через реестр. С чего мне начать поиск? xakepp35 5 лет назад 0
насколько я могу видеть в исходном кодеactos (вероятно, мы имеем из открытого источника) [`NtQueryTimerResolution ()` просто возвращает некоторые целые числа] (https://doxygen.reactos.org/df/d59/ntoskrnl_2ex_2time_8c_source.html#l00481 ), которые изменяются в функции [`KeSetTimeIncrement ()`] (https://doxygen.reactos.org/d0/db9/ntoskrnl_2ke_2clock_8c_source.html#l00228) xakepp35 5 лет назад 0