Re[7]: Что такое realtime?
От: vdimas Россия  
Дата: 05.01.25 12:32
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Не знаю, как в Linux, а в Windows аппаратные прерывания — один из последних факторов, влияющих на реактивность процессов.


Это от драйвера зависит.
Маскируемое прерывание должно быть отработано как можно быстрее, т.е. в идеале — выставить пару флагов, разрешить аппаратные прерывания и инициировать уже программное прерывание.


ЕМ>На современном железе нужны десятки-сотни тысяч прерываний в секунду, чтобы они стали ощутимо кому-то мешать.


Реалтайм бывает разный.
Современные Windows и Linux на грамотно построенной аппаратуре и соотв. драйверном и прикладном ПО способны обеспечить реакцию в единицы микросекунд запросто.


ЕМ>В основном тормозят кривые драйверы (в том числе родные) и чрезмерно раздутый код ядра.


Приличная часть кода ядра может и не использоваться вовсе, а в Linux лишнее можно легко выключить из сборки.

Ведь ты ж не будешь строить реалтаймовую систему как "просто еще одну программу" на десктопе общего назначения?
Зачем запускать десятки ненужных процессов?


V>>в виндах отродясь был realtime-приоритет, для linux есть соотв. патчи.

ЕМ>Это всего лишь наивысший приоритет user-mode кода. От тормозов в ядре он спасти не может.

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

Там всей разницы, что ожидающий на семафоре или HEVENT такой поток получает тики проца в Windows сразу же при установке примитива сигнализации, а в Linux такие потоки получали тики проца через стандартный решедуллинг раз в 1/1000 сек, почему Linux и не считалась системой реального времени. Но есть патчи, которые заставляют решедулить потоки при установке из ядра примитивов сигнализации, т.е. которые передают управление нужному потоку сразу — у каждого примитива сигнализации есть список ожидающих его потоков. На autoreset HEVENT обычно ожидает один поток, на семафоре могут ожидать несколько потоков, например, несколько прикладных потоков с наивысшим приоритетом раскиданы по физическим ядрам и обрабатывают поступающие данные в режиме СМО.


V>>не стоит создавать взаимные блокировки ресурсов у драйвера и прикладной части, стоит использовать lock-free техники.

ЕМ>Стоит, но кто бы это делал в той же винде...

Там это делали отродясь, по крайней мере в дровах от самой MS.


V>>прикладной код может целиком жить в драйвере, хотя в этом случае писать придётся на Си или на сильно урезанном С++ — без исключений/RAII, без динамической инициализации глобальных объектов, без RTTI и, возможно, без сохранения плавающих регистров м/у прерываниями, т.е.,

ЕМ>RAII не требует ничего, кроме поддержки конструкторов/деструкторов, это реализовано везде.

RAII требует реакции на исключения.

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


ЕМ>А что такое "динамическая инициализация глобальных объектов"?


Это когда у глобальных/статических переменных вызывается конструктор и в конце работы модуля деструктор.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.