Проверьте, произошло ли вытеснение в Linux между двумя точками кода

У меня есть приложение (простой код C), работающее поверх ядра Linux. Я измеряю время между двумя точками кода. Я хотел бы знать, вытеснил ли какой-либо другой процесс или сам планировщик мое приложение между этими двумя точками. Есть ли способ найти это.


person Ginu Jacob    schedule 02.10.2015    source источник
comment
это помогает? stackoverflow.com/a/21722393/678093   -  person m.s.    schedule 02.10.2015
comment
зачем тебе это знать?   -  person Alex Hoppus    schedule 02.10.2015
comment
Непонятно, хотите ли вы программный метод или командную строку. И неясно, хочет ли приложение самоанализа или вам просто нужно получить эти данные извне процесса. Все это имеет значение. Например, /proc/‹pid/status содержит количество добровольных и непроизвольных переключений контекста процесса. Для программного внешнего средства просмотра одним из возможных вариантов является systemtap. Пожалуйста, уточните свой вопрос, если ни один из них не подходит.   -  person kaylum    schedule 02.10.2015
comment
@AlexHoppus Для меня требуется найти время выполнения определенного фрагмента кода. Было замечено, что при работе на «голом железе» (без ОС) код выполняется намного быстрее по сравнению с запуском в ОС. Поэтому я расследую причину начала этого. Прежде чем перейти к другим причинам, я хотел бы сначала убедиться, что это не вызвано вытеснением.   -  person Ginu Jacob    schedule 02.10.2015
comment
@AlanAu: у меня есть возможность редактировать код, чтобы я мог найти любое вытеснение, произошедшее в критической части кода.   -  person Ginu Jacob    schedule 02.10.2015
comment
@GinuJacob вы слышали о функции clock_gettime или функции часов? Все это должно решить вашу проблему, см. CLOCK_PROCESS_CPUTIME_ID. По сути, /proc/pid/stime или utime содержат время в системных тиках, которые ваше приложение тратит только в ядре/пространстве пользователя соответственно. Проверить факт выполнения preemption из userspace невозможно (да и не нужно)   -  person Alex Hoppus    schedule 02.10.2015
comment
Было замечено, что при работе на чистом железе (без ОС) код выполняется намного быстрее, чем при работе в ОС. Вероятно, это справедливо почти для всех случаев. Введите команду ps -A, чтобы увидеть все остальные процессы, конкурирующие за ресурсы. Запустите приложение с префиксом команды time. Попробуйте изменить приоритет с помощью nice. Ваш вопрос очень похож на вопрос, мокрая ли вода.   -  person sawdust    schedule 02.10.2015
comment
@GinuJacob Тогда взгляните на systemtap. Это может позволить вам наблюдать за поведением любой программы в мельчайших деталях. В том числе и при переключении таксов.   -  person kaylum    schedule 03.10.2015
comment
Другая идея: поместить вашу программу в один из классов планирования реального времени (см. sched_setscheduler(2)). Это не устранит полностью прерывания (аппаратные прерывания и т. д. по-прежнему будут срабатывать), но никакие другие процессы, не работающие в реальном времени, не смогут вытеснить ваш процесс. И обычно нет процессов в реальном времени, так что это эффективно поставит вас на вершину кучи. Также имейте в виду, что есть и другие причины, по которым ваша программа может быть приостановлена ​​— ошибки страниц, ввод-вывод и т. д.   -  person Gil Hamilton    schedule 03.10.2015


Ответы (1)


Один из способов определить, было ли какое-либо переключение контекста между двумя точками в коде, — это использовать

getrusage(int who, struct rusage *usage)

позвоните и сравните значения ru_nvcsw и ru_nivcsw

   struct rusage {
       ...
       long   ru_nvcsw;         /* voluntary context switches */
       long   ru_nivcsw;        /* involuntary context switches */
   };
person Nithin    schedule 04.10.2015