10.6.7. Приоритеты процессов и производительность системы
Многозадачная операционная система реального времени должна допускать назначение приоритетов исполняемым процессам. Обычно приоритеты являются динамическими, что означает, что во время исполнения они могут изменяться как самими процессами, так и операционной системой. Обычно существуют определенные ограничения и механизмы контроля, которые определяют, кто и как может менять приоритеты. Назначение приоритетов оказывает серьезное влияние на работу системы в целом.
Наиболее важные процессы или процессы, время реакции которых жестко ограничено, получают более высокий приоритет. К последним относятся обработчики прерываний. Задачи, выполняющие менее важные действия, например печать, получают более низкий приоритет. Очевидно, что необходимо обращать внимание на соглашения, используемые в системе относительно того, связан ли более высокий приоритет с большим или меньшим числом. Приоритеты имеют относительное значение и оказывав влияние только тогда, когда существуют процессы с разными приоритетами.
В системах реального времени реакция на прерывания отделена от вычислений, требующих значительных ресурсов процессора. Как только происходит событие или прерывание, его обработчик немедленно включается в очередь готовых процессов. Программы обработчиков прерываний обычно компактны, так как они должны обеспечивать быструю реакцию, например ввод новых данных, и передавать управление более сложным процессам, интенсивно потребляющим ресурсы процессора, которые исполняются с более низким приоритетом.
В вышеприведенном примере системы управления манипулятором робота (раз дел 10.6.3) одна задача, которую можно построить как обработчик прерываний, ждет поступления от датчика новых данных о текущем положении манипулятора. Когда поступает прерывание от датчика — есть новые данные, — эта задача должна ср получить управление. Затем она передает данные о положении программе их обработки, требующей больших вычислительных ресурсов. Эта программа не отвечает обработку прерываний и может использовать больше времени для вычислении.
Производительность системы реального времени значительно труднее поддается оценке, чем систем, использующих обычные последовательные программы. Если обычная последовательная программа исполняется на конкретном процессоре с известной скоростью, то программа реального времени зависит от поведения окружающей среды т. е. управляемых технических процессов. Общая производительность системы должна быть достаточной для того, чтобы выполнять все операции и выдавать результаты за установленное время. Иными словами, система реального времени всегда должна быть готова к максимальной нагрузке, которую может создать технический процесс.
В развитых и сложных операционных системах, таких как UNIX и Windows NT, и в еще большей степени в распределенных операционных системах, доступ к большинству функций (ввод/вывод, сетевая поддержка и т. д.) происходит через системные вызовы или механизм удаленного вызова процедур (раздел 10.5.4). В прикладных программах для вызова системных функций используется довольно простая нотация, за которой, как правило, стоит длинная последовательность действий операционной системы. Если между двумя процессами, исполняющимися в разных узлах сети, организован программный канал, то считывание одного символа из этого канала требует целой серии операций в обоих узлах. Поскольку на эти операции обычно наложены жесткие ограничения по времени, необходимо провести глубокий предварительный анализ прежде, чем принимать то или иное проектное решение. Если локальная сеть используется не только задачами реального времени, но и интерактивными пользователями, то от количества и активности последних в значительной мере зависит и ее общая нагрузка.
Многозадачные операционные системы имеют команды, показывающие в каждый момент все активные процессы, их текущий статус (например, ожидание ввода/ вывода, ожидание прерывания и т. д.) и долю в потреблении ресурсов процессора с момента последней перезагрузки системы или какого-либо иного события. Первый шаг по проверке характеристик системы — анализ ее работы с помощью подобной команды. Выявление процессов, занимающих слишком большую долю процессорного времени, может быть хорошей отправной точкой для поиска узких мест и оптимизации характеристик системы. Нет ничего плохого в том, если некоторые процессы загружают процессор больше, чем другие, однако разработчик системы должен иметь ясное представление о том, когда это происходит и почему.
10.6.8. Тестирование и отладка
Доказательство правильности работы программы является обязательным шагом в ее разработке. Необходимо проверить, что программа выполняет свои функции без ошибок. Визуальные и формальные методы позволяют выявить только ограниченное количество ошибок. На практике это означает, что формальная теория тестирования имеет мало смысла, а основную роль играет собственный опыт и "народные программистские" предания. Реальное тестирование проводится в "боевых" условиях.
Выявлять ошибки трудно — многие из них проявляются спорадически и их нельзя воспроизвести по желанию. Никакое доказательство не может гарантировать, что программа полностью свободна от ошибок, и никакие тесты не могут убедить, что выявлены все ошибки. Цель тестирования — найти как можно большее число ошибок, гарантировать, что программа работает с разумной надежностью. Один из создателей теории операционных систем, Эдсгер Дейкстра (Edsger Dijkstra), заметил: "Тесрование может доказать только наличие ошибок, но не их отсутствие". Тщательный тест требует соответствующей разработки и подготовки; необходимое сочетание практических и аналитических тестов. Сначала тестовые процедуры и данные и ожидаемые результаты описываются в специальном документе. В процессе тестирования ведется журнал испытаний, который затем сравнивается со спецификацией тестов. Желательно, чтобы коллектив разработчиков системы отличался от того, который будет определять процедуры испытаний и проводить их.
При тестировании систем реального времени существует дополнительная сложность из-за большого количества возможных взаимосвязей между задачами. Вероятность новой ошибки при исправлении старой очень велика — имеющий опыт разработки программ размером свыше 10 000 строк дает вероятность в пределах от 15 до 50%.
Существует два основных метода тестирования — исчерпывающий и на примеpax. При исчерпывающем тестировании проверяются все возможные комбинации входных и выходных данных. Очевидно, что этот метод можно использовать лищь в случае, если число таких сочетаний невелико.
Метод испытаний на примерах используется наиболее часто. Производится выбор репрезентативного числа сочетаний входа и выхода. Тестовые данные должны также включать крайние значения, например находящиеся за пределами допустимого диапазона. Тестируемый модуль должен правильно распознать и обработать эти данные.
В многозадачных системах программные модули вначале тестируются отдельно Во время такого тестирования должно быть проверено, что каждая строка программы выполняется хотя бы один раз. Иными словами, если программа содержит команды ветвления типа "if..then..else", то тестовые данные должны обеспечить выполнение обеих ветвей.
На этой фазе тестирования обычно полезны отладчики. Они позволяют непосредственно просматривать и изменять регистры процессора и области памяти при исполнении машинного кода. Отладчик вставляет в машинный код программы точки останова, в которых можно проверить состояние регистров и переменных и сравнить их со значениями, требуемыми логикой процесса. Однако с ростом сложности операционных систем и расширением функциональности системных вызовов, код которых обычно неизвестен программисту, использование отладчика может оказаться мало полезным. Обычные пошаговые отладчики не позволяют полностью оценить взаимодействие между несколькими параллельными процессами. Однако отладчики являются полезными и необходимыми средствами при разработке программ на ассемблере.
Только после того как все модули были проверены по отдельности и все обнаруженные ошибки исправлены, можно приступать к параллельному исполнению для отладки взаимодействия. Многочисленные взаимосвязи программных модулей могут привести к ошибкам в системе, даже если отдельные модули работают правильно. Общая работа системы — время обработки прерываний, производительность при разной нагрузке — проверяется на основе тестовой спецификации. Особое внимание следует обратить на функции, обеспечивающие надежность и безопасность системы.
Если система включает в себя обработку прерываний и исключений, то необходимо проверить корректность соответствующей реакции. Имитация ошибочных ситуаций позволяет оценить их последствия для системы и ее поведение в этом случае.
Результаты тестов отдельных модулей и комплексной отладки заносятся в протокол испытаний, и на его основе вносятся необходимые исправления. Не следует забывать, что ошибки тем труднее исправляются, чем позже они были обнаружены. Расходы на тестирование — это инвестиции не только в качество системы, но и в ее общую экономическую эффективность, поскольку значительная часть расходов в течение жизненного цикла системы уходит на ее сопровождение, т. е. в конечном счете на выявление и устранение ошибок.
- 1.1. Роль вычислительной техники в управлении процессами
- 1.5. Руководство для читателя
- Глава 8 посвящена архитектуре системных шин; наибольшее внимание уделено стандарту vme.
- Процессы реального времени. Методы программирования. Задачи цифрового управления
- 2.1.1. Пример — пресс для пластика
- 2.1.2. Управление на основе последовательного программирования
- 2.1.3. Управление на основе прерываний
- 2.2. Примеры задач управления процессами
- 2.2.1. Управление последовательностью событий и бинарное управление
- 2.2.2. Простой контур управления — регулятор температуры
- 2.2.3. Генерация опорного значения
- 2.2.4. Системы, содержащие несколько контуров управления.
- 2.2.5. Взаимосвязанные системы
- 2.2.6. Критичные по времени процессы
- 2.2.7. Свойства процессов, усложняющие управление
- 2.3. Особенности систем цифрового управления
- 2.4.2 Модельный пример 2 – биологическая очистка сточных вод (процесс активированного отстоя)
- 2.5. Заключение
- 3. Описание и моделирование систем
- 3.1.2. Масштаб времени динамических моделей
- 3. 1.3. Моделирование динамических систем
- 3.1.4. Моделирование дискретных событий
- 3.2. Основы моделирования динамических систем
- 3.2.1. Механические системы
- 3.2.2. Электромагнитные цепи
- Пример 3.4
- 7.4. Функциональные карты
- 7.4.1. Синтаксис функциональных карт
- 4 2. Реализация функциональных карт
- 7.4.3. Применение функциональных карт в промышленном управлении
- 7.5. Заключение
- 10.6. Методы программирования в реальном времени
- 10.6.1. Что такое программа реального времени?
- 10.6.2. Среда программирования
- 10.6.3. Структура программы реального времени
- 10.6.4. Обработка прерываний и исключений
- 10.6.5. Программирование операций ожидания
- 10.6.6. Внутренние подпрограммы операционной системы
- 10.6.7. Приоритеты процессов и производительность системы
- 10.7. Языки программирования и операционные системы реального времени
- 10.7.1. Требования к языкам и операционным системам реального времени