Задержка с помощью цикла

Задержка с помощью цикла

Наиболее простое для реализации (хотя обычно не оптимальное) решение — это использование задержки с помощью цикла или ожидания в состоянии занятости (busy loop, busy waiting). Эта техника работает, только если интервал времени задержки является кратным периоду системного таймера или когда точность не очень важна.

Идея проста — выполнить постоянный цикл, пока не будет получено необходимое количество импульсов системного таймера, как в следующем примере.

unsigned long delay = jiffies + 10; /* десять импульсов таймера */

while (time_before(jiffies, delay))

 ;

Цикл будет выполняться, пока значение переменной jiffies не станет больше, чем значение переменной delay, что может произойти только после того, как будут получены 10 импульсов системного таймера. Для аппаратной платформы x86 со значением параметра HZ, равным 1000, этот интервал равен 10 миллисекунд.

Аналогично можно поступить следующим образом.

unsigned long delay = jiffies + 2*HZ; /* две секунды */

while (time_before(jiffies, delay))

 ;

В этом случае цикл будет выполняться, пока не поступит 2*HZ импульсов системного таймера, что всегда равно 2 секундам, независимо от частоты системного таймера.

Такой подход не очень хорош для всей системы. Пока код ожидает, процессор загружен выполнением бесполезного цикла и никакой полезной работы при этом не выполняется! На самом деле к такому "глупому" подходу нужно прибегать по возможности реже, и он показан здесь, потому что является понятным и простым способом осуществить задержку. Его можно встретить в чьем-нибудь не очень хорошем коде.

Лучшим решением является перепланирование для того, чтобы процессор мог выполнить полезную работу, пока ваш код ожидает:

unsigned long delay = jiffies + 5*HZ;

while (time_before(jiffies, delay))

 cond_resched();

Вызов функции cond_resched() планирует выполнение другого процесса, но только в случае, если установлен флаг need_resched. Другими словами, данное решение позволяет активизировать планировщик, но только в случае, когда есть более важное задание, которое нужно выполнить. Следует обратить внимание, что. поскольку используется планировщик, такое решение нельзя применять в контексте прерывания, а только в контексте процесса. Задержки лучше использовать только в контексте процесса, поскольку обработчики прерываний должны выполняться по возможности быстро (а цикл задержки не дает такой возможности!). Более того, любые задержки выполнения, по возможности, не должны использоваться при захваченных блокировках и при запрещенных прерываниях.

Поклонники языка С могут поинтересоваться, какие есть гарантии, что указанные циклы будут действительно выполняться? Обычно компилятор С может выполнить чтение указанной переменной всего один раз. В обычной ситуации нет никакой гарантии, что переменная jiffies будет считываться на каждой итерации цикла. Нам же необходимо, чтобы значение переменной jiffies считывалось на каждой итерации цикла, так как это значение увеличивается в другом месте, а именно в прерывании таймера. Именно поэтому данная переменная определена в файле <linux/jiffies.h> с атрибутом volatile. Ключевое слово volatile указывает компилятору, что эту переменную необходимо считывать из того места, где она хранится в оперативной памяти, и никогда не использовать копию, хранящуюся в регистре процессора. Это гарантирует, что указанный цикл выполнится, как и ожидается.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Задержка передачи звука

Из книги Skype: бесплатные звонки через Интернет. Начали! автора Гольцман Виктор Иосифович

Задержка передачи звука Одна из самых неприятных помех во время разговора через VoIP-телефонию – это задержки сигнала, то есть вы слышите своего собеседника не сразу в тот момент, когда он говорит, а спустя некоторое время. И собеседнику ваш голос тоже приходит с


Эффект Simple Delay (Простая задержка)

Из книги Sound Forge 9 автора Квинт Игорь

Эффект Simple Delay (Простая задержка) Эффект Simple Delay (Простая задержка) позволяет применять базовые эффекты эха к звуковым фрагментам и композициям. Чтобы использовать этот эффект, нужно выполнить следующие действия.1. Выделить фрагмент аудиоданных, к которым нужно применить


Эффект Multi-Tap Delay (Многоотводная задержка)

Из книги Справочное руководство по C++ автора Страустрап Бьярн

Эффект Multi-Tap Delay (Многоотводная задержка) Функция Multi-Tap Delay (Многоотводная задержка) позволяет создавать очень сложные эффекты эха за счет установки сразу нескольких задержек, подобно одновременной установке нескольких эффектов Simple (Простое). Чтобы настроить эффект Multi-Tap


R.6.5 Операторы цикла

Из книги Советы по Delphi. Версия 1.0.6 автора Озеров Валентин

R.6.5 Операторы цикла Эти операторы задают виды цикла.оператор-цикла: while ( выражение ) оператор do оператор while ( выражение ) for ( оператор-иниц выражение opt ; выражение opt ) оператороператор-иниц: оператор-выражение оператор-описаниеОбратите внимание, что конструкция


Задержка выполнения

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Задержка выполнения Задержка выполнения OnChange (Delphi 2) В случае нажатия пользователем клавиши или изменении текущего элемента компонента ComboBox, вы обратите внимание на досадную задержку, возникающую при генерации события OnChange.Так как "работа кипит", я хотел бы


Задержка выполнения OnChange (Delphi 2)

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Задержка выполнения OnChange (Delphi 2) В случае нажатия пользователем клавиши или изменении текущего элемента компонента ComboBox, вы обратите внимание на досадную задержку, возникающую при генерации события OnChange.Так как "работа кипит", я хотел бы отреагировать на изменение ItemIndex


12.4. Пропускная способность и задержка

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

12.4. Пропускная способность и задержка Другим последствием использования быстрых процессоров является то, что производительность обычно ограничивается затратами на I/О-операции и (особенно в случае программ, использующих Internet) затратами на сетевые транзакции.


12.4. Пропускная способность и задержка

Из книги Мошенничество в Интернете. Методы удаленного выманивания денег, и как не стать жертвой злоумышленников автора Гладкий Алексей Анатольевич

12.4. Пропускная способность и задержка Другим последствием использования быстрых процессоров является то, что производительность обычно ограничивается затратами на I/O-операции и (особенно в случае программ, использующих Internet) затратами на сетевые транзакции.


Синтаксис цикла

Из книги CSS3 для веб-дизайнеров автора Сидерхолм Дэн

Синтаксис цикла Синтаксис цикла непосредственно следует из предшествующих соображений, определяющих ингредиенты цикла. Он будет включать элементы, отмеченные как необходимые.[x]. Инвариант цикла inv - утверждение.[x]. Условие выхода exit, чья конъюнкция с inv дает желаемую


Задержка с выводом средств

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Задержка с выводом средств Вывод средств, полученных в результате выигрыша в интернет-казино или лотерее – еще одна лазейка, позволяющая мошенникам получать дополнительные деньги, а точнее – успешно избегать причитающихся игрокам выплат выигранных сумм.Не секрет, что


Задержка перехода

Из книги C++ для начинающих автора Липпман Стенли

Задержка перехода Можно сделать так, чтобы переход осуществлялся не сразу после того, как срабатывает связанное с ним событие, но с некоторой задержкой. Например, сделаем так, чтобы переход цвета фона происходил через полсекунды после того, как ссылка попала


18.5.5. Посылка сигналов серверам с помощью цикла for

Из книги HTML, XHTML и CSS на 100% автора Квинт Игорь

18.5.5. Посылка сигналов серверам с помощью цикла for Поскольку цикл for может обработать каждое слово списка, установим переменную для отображения названий некоторых серверов сети. Воспользуемся циклом for для посылки сигналов каждому из этих серверов.$ pg


18.5.6. Создание резервных копий файлов с помощью цикла for

Из книги Разработка ядра Linux автора Лав Роберт

18.5.6. Создание резервных копий файлов с помощью цикла for Цикл for можно использовать для создания резервных копий файлов. При этом переменная просто добавляется к целевому аргументу команды ср. Ниже применяется переменная под названием ВАК. Эта переменная добавляется к


5.5. Инструкция цикла for

Из книги автора

5.5. Инструкция цикла for Как мы видели, выполнение программы часто состоит в повторении последовательности инструкций - до тех пор, пока некоторое условие остается истинным. Например, мы читаем и обрабатываем записи файла, пока не дойдем до его конца, перебираем элементы


Операторы цикла

Из книги автора

Операторы цикла Для многократного выполнения кода используют операторы цикла. Кроме того, циклы предоставляют удобные средства для манипулирования массивами.Цикл forОператор for служит для создания цикла. Он имеет следующий синтаксис:for (выражение инициализации;


Задержка выполнения

Из книги автора

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