Характеристика BogoMlPS всегда была источником недоразумений и шуток. На самом деле вычисленное значение BogoMlPS не имеет ничего общего с производительностью компьютера и используется только для функций udelay()
и mdelay()
. Название этого параметра состоит из двух частей
Detected 1004.932 MHz processor.
Calibrating delay loop... 1990.65 BogoMlPS
Значение параметра BogoMIPS - это количество циклов, которые процессор может выполнить за указанный период времени, В действительности эта характеристика показывает, насколько быстро процессор может ничего не делать! Это значение хранится в переменной loops_per_jiffy
, и его можно считать из файла /proc/cpuinfo
.
Функции, использующие циклы задержки, используют данное значение, чтобы вычислить (и это получается достаточно точно), сколько итераций цикла необходимо выполнить, чтобы обеспечить необходимую задержку.
Ядро вычисляет значение переменной loops_per_jiffy
при загрузке системы в функции calibrate_delay()
, реализация которой описана в файле init/main.c
.
Функция udelay()
должна вызываться только для небольших задержек, поскольку при большом времени задержки на быстрой машине может возникнуть переполнение в переменных цикла. Общее правило: по возможности не использовать функцию udelay()
для задержек, больше одной миллисекунды. Для более продолжительных задержек хорошо работает функция mdelay()
. Так же как и другие методы задержки выполнения, основанные на циклах, эти функции (особенно функция mdelay()
, так как она дает длительные задержки) должны использоваться, только если это абсолютно необходимо. Следует помнить, что очень плохо использовать циклы задержек, когда удерживается блокировка или запрещены прерывания, потому что это очень сильно влияет на производительность и время реакции системы. Если необходимо обеспечить точное время задержки, то эти функции — наилучшее решение. Обычное использование этих функций — это задержки на не очень короткий период времени, который лежит в микросекундном диапазоне.
Функция schedule_timeout()
Более оптимальный метод задержки выполнения — это использование функции schedule_timeouit()
. Этот вызов переводит вызывающее задание в состояние ожидания (sleep) по крайней до тех пор, пока не пройдет указанный период времени. Нет никакой гарантии, что время ожидания будет
/* установить состояние задания в значение прерываемого ожидания */
set_current_state(TASK_INTERRUPTIBLE);
/* перейти в приостановленное состояние на s секунд */
schedule_timeout(s * HZ);