
- •3.2. Операционные системы реального времени и Windows
- •Перечислим необходимые требования к ос для обеспечения предсказуемости.
- •Удовлетворяет ли Windows nt требованиям, предъявляемым к ос рв?
- •Предсказуемость системных вызовов Win32 api.
- •Управление прерываниями в nt.
- •Управление памятью в nt.
- •Может ли Windows nt использоваться в качестве ос рв?
- •Коммерческие решения, расширяющие nt возможностями обработки в реальном времени.
- •Использование nt как таковой.
- •Реализация Win32 api над другой ос рв.
- •Совместная работа на одном процессоре nt и ос рв
- •Использование многопроцессорной архитектуры.
Предсказуемость системных вызовов Win32 api.
Для тестирования системных вызовов был написан процесс (принадлежащий классу реального времени), содержащий вызовы системы синхронизации нитей, и измерялось время, затраченное на каждый вызов. Максимальное значение на вызове mutex достигает 670 мкс при среднем времени 35 мкс. Это произошло потому, что во время работы теста происходили обращения к диску и по сети. Если компьютер искусственно загрузить обращениями к диску и сетевой обработкой, то задержки возрастают до нескольких миллисекунд. Win32 API очень богат, но не предназначен для реального времени. Например, запросы mutex обрабатываются в порядке поступления, а не в порядке приоритетов, что снижает предсказуемость. Для синхронизации нитей в одном процессе критические секции следует предпочесть всем другим способам (этот вызов затрачивает всего несколько мкс по сравнению с 35 мкс на вызов mutex).
Несмотря на все достоинства API, ядро и менеджер ввода/вывода Windows NT недостаточно приспособлены к обработке событий реального времени на уровне приложений.
Управление прерываниями в nt.
В Windows NT единственный способ управления аппаратурой – через драйвер устройства. Поскольку приложение реального времени имеет дело с внешними событиями, разработчик должен написать и включить в ядро драйвер устройства, дающий доступ к аппаратуре. Этот драйвер реагирует на прерывания, генерируемые соответствующим устройством.
Прерывания обрабатываются в два этапа. Сначала выполняется очень короткая программа обслуживания прерываний (ISR). Впоследствии работа завершается выполнением DPC – процедуры отложенного вызова. Возникает следующий поток событий:
– Происходит прерывание.
– Процессор сохраняет PC, SP и вызывает диспетчер.
– ОС сохраняет контекст и вызывает ISR.
– В ISR выполняется критическая работа (чтение/запись аппаратных регистров).
– DPC ставится в очередь.
– ОС восстанавливает контекст.
– Процессор восстанавливает PC, SP.
– Ожидающие в очереди DPC выполняются на уровне приоритета DISPATCH_LEVEL.
– После завершения всех DPC ОС переходит к выполнению приложений.
ISR должно быть как можно короче, поэтому большинство драйверов выполняют значительную часть работы в DPC (которая может быть вытеснена другим ISR), ожидая окончания других DPC, ранее попавших в очередь (все DPC имеют одинаковый приоритет).
Из документации по NT следует, что ISR может быть вытеснена другим ISR с более высоким приоритетом, и что DPC имеет более высокий приоритет, чем пользовательские и системные нити. Но поскольку все DPC имеют одинаковый уровень приоритета и ISR должна быть сведена к минимуму, ваш DPC будет вынужден ждать других и ваше приложение будет зависеть от остальных драйверов устройств непредсказуемым образом. Задержки системных вызовов, описанные в предыдущем разделе, обусловлены именно тем, что DPC от драйверов жесткого диска и сети блокируют все другие.
В настоящих ОС РВ разработчик знает, на каком уровне выполняются драйверы всех других устройств. Обычно имеется свободное пространство для прерываний выше стандартных драйверов. Вся критическая работа выполняется в ISR, что позволяет настроить конфигурацию драйвера в зависимости от временных ограничений приложения.