Я понимаю, что упреждающая многозадачная ОС может прерывать процесс в любой «позиции кода».Многозадачность и измерение разницы во времени
Учитывая следующий код:
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 мсек или около того, и если бы это было так, я бы поискал лучшее решение.
Я думаю, вам нужно пересмотреть, что означает «неправильные результаты» для timeDiff_usec. Этот код будет измерять время, прошедшее для вашего вызова функции. Является ли это «прекрасным», если нет прерывания ОС? «Прекрасно», если вам нужно извлечь страницы памяти из виртуальной памяти? – mattm
Почему эти результаты не так? Если вы хотите фактическое время стены, которое должен был выполнить код, результаты верны. Если вы хотите что-то еще, что еще? –
обе правый. Точнее: я хочу знать, сколько времени используется в моем процессе, например. для разбора файла. – radix