LINUX.ORG.RU

Линукс и реальное время или почему время идёт назад ?


0

0

Что такое ОС реального времени ? Вопрос сложный и недонозначный. Говорят о "жёстком" и "мягком" реальном времени, спорят и терминологии и определениях. ОК, пусть будет так. Но, надеюсь, никто не будет спорить с тем, что в ОС, претендующей называться ОС реального времени, время назад идти не может. А вот линуксе может. Сейчас расскажу, как это проявлется.

Нужно синхронизировать время. Получаем с источника точного времени время, которое, допустим, меньше локального. Надо потихоньку отвести время назад. Для этого говорим tickadj 9000, к примеру. Согласно всей документации после этого время должно идти медленнее, каждое прерывание должно прибавлять меньше времени к счётчику. Итого за определённое количество времени мы плавно и прорачно для приложений синхронизируемся. Какбы не так. Линукс вместо этого потихоньку маленькими шажочками отводит часы назад. Как это проверяется - есть программа, которая постоянно печатает показания времени и на этой рапечатке очень хорошо видно, как Линукс двигает время назад. Исходный код приведу ниже. Как проверить ? Говорим tickadj 9000, говорим что-то типа my_prog > log.log. Ждём несколько секунд, ^C, смотрим log.log, ищем там знак минус ("-"). Находим, пытаемся понять, почему время идёт назад.

Что же это получается, дорогие товарищи ? Как же оценивать маленькие задержки прикажите ? Счётчик uptime слишком грубый, нужно до сотни микросекунд точнось. Всё больше и больше убеждаюсь, что никто никогда Линукс для серьёзных примениний использовать даже не пробовал, честное слово.


Ответ на: комментарий от MKuznetsov

> А каким тогда образом тесты hrtimers-test проходят успешно на всех
> ядрах начиная с 2.6.12 ?

я не знаю, что это за тесты

> Если бы nanosleep срабатывал в момент тика, то тесты бы просто не
> прошли.

да вы код-то посмотрите...

        run_timer_softirq()->hrtimer_run_queues()

еще раз: я говорю о Linus's tree. уже есть патч (кажется, они
интегрированы в -rt) который перепрограммирует контроллер
прерываний. (George Anzinger)

> какая ещё часть от realtime-preempt патча от mingo кроме hrtimers
> уже интегрированна в trunc ?

а что такое trunc?

да не очень много пока. Ingo's -rt kernel стимулировал много
наработок: hrtimers, RCU signals, etc, которые вливаются в
mainline. rt-mutex (для futex) в -mm tree...

но все-таки неверно говорить, что hrtimers это часть -rt.
собственно, к -rt как таковому они имееют отдаленное отношение.

наиболее противоречивая (по отношению к mainline) часть -rt
это перенос irq в процесс контекст и очень-много-мелочей, aka
"devil in the details". не следует надеяться, что мы можем
просто добавить к ядру что-то хорошее (типа hrtimers) и получить
real time.

idle ★★★★★
()

Кстати, определенно имеется баг:

Вчера поставил adjtimex -t 9000 и забыл переставить обратно. Утром обнаружил, что часы ушли _вперед_ (на 10 минут)! Восстановил adjtimex -t 10000 и ушел на семинар. Через 2 часа -- часы _отстают_ на ЧАС! До этого проблем с часами не было.

Комп, правда, в сети, и ntp работает. Но, кажется, это значит, что-то с чем-то явно не дружит, и коррекция времени в Линуксе не работает правильно...

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.