2015-06-23 2 views
1

Я понимаю, что упреждающая многозадачная ОС может прерывать процесс в любой «позиции кода».Многозадачность и измерение разницы во времени

Учитывая следующий код:

int main() { 
    while(true) { 
    doSthImportant(); // needs to be executed at least each 20 msec 
    // start of critical section 
    int start_usec = getTime_usec(); 
    doSthElse(); 
    int timeDiff_usec = getTime_usec() - start_usec; 
    // end of critical section 
    evalUsedTime(timeDiff_usec); 
    sleep_msec(10); 
    } 
} 

Я ожидал бы этот код, как правило, производят правильные результаты для timeDiff_usec, особенно в том случае, doSthElse() и getTime_usec() не принимают много времени, поэтому они редко прерываются планировщиком ОС.

Но программа будет прерываться время от времени где-то в «критической секции». Переключатель контекста будет делать то, что он должен делать, и все же в таком случае программа произведет неправильные результаты для timeDiff_usec.

Это единственный пример, который я имею в виду прямо сейчас, но я уверен, что были бы другие сценарии, в которых многозадачность могла бы получить программу (mer) в проблему (поскольку время не является единственным состоянием, которое может быть изменено при re -Посещение).

  • Есть ли способ обеспечить точное измерение времени для определенного действия?
  • Какие другие распространенные проблемы имеют решающее значение при многозадачности и их необходимо учитывать? (Я не думаю о безопасности потоков, но могут быть общие проблемы).

Редактировать: Я изменил код примера, чтобы уточнить его. Я хочу проверить время, затраченное на то, чтобы doSthElse() не занимал 50 мсек или около того, и если бы это было так, я бы поискал лучшее решение.

+0

Я думаю, вам нужно пересмотреть, что означает «неправильные результаты» для timeDiff_usec. Этот код будет измерять время, прошедшее для вашего вызова функции. Является ли это «прекрасным», если нет прерывания ОС? «Прекрасно», если вам нужно извлечь страницы памяти из виртуальной памяти? – mattm

+0

Почему эти результаты не так? Если вы хотите фактическое время стены, которое должен был выполнить код, результаты верны. Если вы хотите что-то еще, что еще? –

+0

обе правый. Точнее: я хочу знать, сколько времени используется в моем процессе, например. для разбора файла. – radix

ответ

1
  • Есть ли способ, чтобы гарантировать, что измерение времени для определенных действий работает нормально?

Это зависит от операционной системы и степени привилегий. В некоторых системах для некоторых уровней привилегий вы можете установить для процесса или потока приоритет, который предотвращает его вытеснение с помощью чего-либо с более низким приоритетом. Например, в Linux вы можете использовать sched_setscheduler, чтобы указать приоритет потока в реальном времени. (Если вы действительно серьезны, вы также можете установить сходство потоков и сродство SMP, чтобы предотвратить обработку прерываний на процессоре, на котором работает ваша нить.)

Ваша система может также обеспечивать отслеживание времени, которое учитывает затраченное время прерванным. Например, POSIX определяет функцию getrusage, которая возвращает структуру, содержащую ru_utime (количество времени, проведенного в «пользовательском режиме» процессом) и ru_stime (количество времени, затраченного на «режим ядра» в процессе). Они должны суммироваться с общим временем, затрачиваемым ЦП на процесс, за исключением интервалов, в течение которых процесс был приостановлен. Обратите внимание, что если ядру необходимо, например, тратить время на поисковый вызов от имени вашего процесса, то он не определяет, сколько (если оно есть) того времени взимается с вашего процесса.

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

Какие другие распространенные проблемы имеют решающее значение при многозадачности и их необходимо учитывать? (Я не думаю о безопасности потоков, но могут быть общие проблемы).

Слишком широкий. На эту тему написаны целые книги.

Смежные вопросы