Как измерить длину временных интервалов на ОС, таких как Windows или Linux? - PullRequest
0 голосов
/ 14 апреля 2019

Есть ли способ узнать длительность слайда?Как спроектировать эксперимент, чтобы понять его в некотором смысле, например, фрагмент кода C

Хотя я прочитал соответствующие вопросы под названием Как узнать временной интервал планировщика Linux? подробно,но пока нет ответа на вопрос о том, как разработать код на C, чтобы получить временной интервал на победу 10.

1 Ответ

0 голосов
/ 15 апреля 2019

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

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

Что верно, так это то, что у вас будет расписание при первом запуске хронографа, а затем при попытке увидеть, что произошло.

Попытка узнать, сколько разваш процесс был прерван чем-то между программными точками, это огромная задача, так как это делают многие устройства, и вы не можете, вообще говоря, предполагать переключение контекста на любом из этих прерываний.Обычно ядро ​​поддерживает счетчики, чтобы узнать, сколько прерываний типа X было подсчитано, и вы можете использовать разницу в значениях счетчика, чтобы узнать, сколько прерываний типа X произошло с тех пор.Какие из них или как они превращаются в переключатели контекста процесса (или потока), обычно недоступны, но, посмотрев на исходный код ядра.

Но ... у вас есть простой способ проверки оценки,Если вы сравниваете время, используя различные clock_gettime часы, доступные в вашей системе, вы можете оценить количество процессорного времени, которое ваш процесс потратил от его имени, и сколько времени система делала иначе.Вы получите грубое и неточное значение из разницы между часами.Например, FreeBSD имеет

  • CLOCK_VIRTUAL Увеличивается, только когда ЦП работает в пользовательском режиме от имени вызывающего процесса.
  • CLOCK_PROF Увеличивается, когда ЦП работает в пользовательском илирежим ядра.
  • CLOCK_PROCESS_CPUTIME_ID Возвращает время выполнения вызывающего процесса.
  • CLOCK_THREAD_CPUTIME_ID Возвращает время выполнения вызывающего потока.
  • CLOCK_REALTIME_PRECISE Увеличивается какнастенные часы должны.

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

NOTE

Из комментария, который вы делаете:

@ ЯрославМашко Большое спасибо!Я попробовал это, и это сработало с ответом 15 мс, но есть ли способ решить это, создав процесс на полную загрузку процессора, чтобы наблюдать переключение временных интервалов?

Вы не можете сделать это вПроцесс пользователя, по понятным причинам, будет запланирован ядром, чтобы позволить другим процессам делать, и тогда вы вообще ничего не сможете измерить.Все в этом смысле потребует прикосновения к большому коду ядра и сделает вашу систему очень неэффективной из-за времени, которое требуется для сбора всей информации при каждом переключении контекста.Но у вас есть полный исходный код ядра, и, возможно, вы сможете исследовать этот подход.Обычные инструменты, такие как top(1) или htop(1), получают доступ к переменным ядра для счетчиков, где ядро ​​обновляется, и получают некоторые средние значения того, что делает ядро ​​... и это потому, что регистрирует всю активность ядра для обработки однимПроцесс - это рекурсивная ситуация, когда весь процесс, который вы выполняете, также должен быть учтен, и вы попадете в бесконечный рекурсивный цикл, где нагрузка на систему более серьезно повреждена, чем вы хотите получить более точные результаты.

Есть процессоры (скорее всего, на основе ARM), которые имеют отладочные модули, которые позволяют им плевать на выделенную линию, все действия, которые они выполняют при полном запуске.Но объемы информации, которую они обычно дают, должны обрабатываться более мощной системой, способной переваривать огромное количество информации, которую излучают эти процессоры.В любом случае, поскольку информация никогда не используется в отлаженной системе, это не представляет проблемы (рекурсивность прерывает цикл)

Кстати, проверить, что вы получили 15 мс на другой комментарий, который вы публикуете, кажется очень странным.Вы были перенесены на 15 мс, но чтобы выполнить это измерение, вам нужно было сделать еще два системных вызова (всего три, два системных вызова, чтобы запросить время и один, чтобы поспать в течение минимального времени). Это ничего не значит, так как ядро ​​обычнопозволяет процессу нормально работать дольше, если это необходимо.Переключение контекста подразумевает переключение всего его виртуального адресного пространства, что означает недействительность большого объема информации кэша памяти и значительное замедление процессора, поэтому обычно ядро ​​допускает нечто большее, чем срез процесса, в случае необходимости.Если вы смогли снова переключиться на себя за такое короткое время, возможно, это потому, что ваш процесс был единственным, который может быть запущен, и в этом случае наиболее вероятным является то, что ядро ​​ничего не запланировало во время между,Максимальное время позволяет ядру запускать процесс, поэтому система не блокируется одним процессором, требующим много времени.Но также нормально, что ни один процесс полностью не использует свой временной интервал ... поэтому, чтобы выполнить какой-либо тест в этом смысле, вам нужно несколько процессов, работающих с полной загрузкой процессора, чтобы увидеть, как ядро ​​передает процессор каждому.

В обычном 64-битном процессоре Intel ядро ​​во FreeBSD работает со скоростью 1000 тактов в секунду, это означает, что, как правило, ядро ​​принимает решение с интервалом в 1 / 1000сек, если оно переключает процессор на тот или иной процесс.Но во многих случаях он решает не переключать процесс, а продолжать выполнять процесс внутри процессора.В Linux вы можете сделать его без тиканья, что означает, что таймер не прерывает процессор с фиксированной скоростью, а только тогда, когда что-то запускает таймер для включения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...