Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Надежность и диагностика компонентов инфокоммуникационных и информационно-управляющих систем.-1

.pdf
Скачиваний:
0
Добавлен:
20.11.2023
Размер:
3.78 Mб
Скачать

лю. Если входные данные – таблица вероятностей, проверьте, находятся ли все значения между нулем и единицей.

4.Проверяйте допустимость всех вариантов значений. Если входное поле – код, обозначающий один из десяти районов, никогда не предполагайте, что если это не код ни одного из районов 1, 2, ..., 9, то это обязательно код района 10.

5.Если во входных данных есть какая-либо явная избыточность, воспользуйтесь ею для проверки данных.

6.Там, где во входных данных нет явной избыточности, введите ее. Если ваша система использует крайне важную таблицу, подумайте о включении в нее контрольной суммы. Всякий раз, когда таблица обновляется, следует просуммировать (по некоторому модулю)

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

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

Когда разрабатываются меры по обнаружению ошибок, важно принять согласованную стратегию для всей системы (т.е. применить идею концептуальной целостности к обнаружению ошибок). Действия, предпринимаемые после обнаружения ошибки в программном обеспечении (например, возврат кода ошибки), должны быть единообразными для всех компонент системы. Это ставит вопрос о том, какие именно действия следует предпринять, когда ошибка обнаружена. Наилучшее решение – немедленно завершить выполнение программы или (в случае операционной системы) перевести центральный процессор в состояние ожидания. С точки зрения предоставления человеку, отлаживающему программу, например системному программисту, самых благоприятных условий для диагностики ошибок немедленное завершение представляется наилучшей стратегией. Конечно, во многих системах подобная стратегия бывает нецелесо-

211

образной (например, может оказаться, что приостанавливать работу системы нельзя). В таком случае используется метод регистрации ошибок. Описание симптомов ошибки и «моментальный снимок» состояния системы сохраняется во внешнем файле, после чего система может продолжать работу. Этот файл позднее будет изучен обслуживающим персоналом.

Всегда, когда это возможно, лучше приостановить выполнение программы, чем регистрировать ошибки (либо обеспечить как дополнительную возможность работу системы в любом из этих режимов). Различие между этими методами проиллюстрируем на способах выявления причин возникающего иногда скрежета автомобиля. Если автомеханик находится на заднем сиденье, то он может обследовать состояние машины в тот момент, когда скрежет возникает. Если же вы выбираете метод регистрации ошибок (записывая скрежет на магнитофон), задача диагностики будет значительно сложнее.

Активное обнаружение ошибок

Не все ошибки можно выявить пассивными методами, поскольку эти методы обнаруживают ошибку лишь тогда, когда на входах появляются соответствующие данные. Можно делать и дополнительные проверки, если спроектировать специальные программные средства для активного поиска признаков ошибок в систе-

ме. Такие средства называются средствами активного обнаружения ошибок (или системами встроенного контроля) и будут более подробно рассмотрены в подразд. 4.3.

Активные средства обнаружения ошибок обычно объединяются в диагностический монитор: параллельный процесс, который периодически анализирует состояние системы с целью обнаружить ошибку. Большие программные системы, управляющие ресурсами, часто содержат ошибки, приводящие к потере ресурсов на длительное время. Например, управление памятью операционной системы сдает блоки памяти «в аренду» программам пользователей и другим частям операционной системы. Ошибка в этих самых «других час-

212

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

Диагностический монитор можно реализовать как периодически выполняемую задачу (например, она планируется на каждый час) либо как задачу с низким приоритетом, которая планируется для выполнения в то время, когда система переходит в состояние ожидания. Как и прежде, выполняемые монитором конкретные проверки зависят от специфики системы, но некоторые идеи будут понятны из примеров. Монитор может обследовать основную память, чтобы обнаружить блоки памяти, не выделенные ни одной из выполняемых задач и не включенные в системный список свободной памяти. Он может проверять также необычные ситуации: например, процесс не планировался для выполнения в течение некоторого разумного интервала времени. Монитор может осуществлять поиск «затерявшихся» внутри системы сообщений или операций ввода-вывода, которые необычно долгое время остаются незавершенными, участков памяти на диске, которые не помечены как выделенные и не включены в список свободной памяти, а также различного рода странностей в файлах данных.

Иногда желательно, чтобы в чрезвычайных обстоятельствах монитор выполнял диагностические тесты системы. Он может вызывать определенные системные функции, сравнивая их результат с заранее определенным и проверяя, насколько разумно время выполнения. Монитор может также периодически предъявлять системе «пустые» или «легкие» задания, чтобы убедиться, что система функционирует хотя бы самым примитивным образом.

Исправление ошибок и устойчивость к ошибкам

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

213

му обеспечению означает ликвидацию ущерба, нанесенного ошибкой, а не исправление самой ошибки. Исправление ошибки в аппаратуре (например, автоматическим переключением на запасное устройство) – вполне жизнеспособный прием, но пытаться исправить настоящую ошибку в программном обеспечении без участия человека бесполезно. Самое большее, что можно сделать по части устойчивости к ошибкам, – либо сделать нанесенный ущерб незаметным, либо изолировать его лишь в рамках части системы.

Хотя методы исправления/устойчивости и имели ограниченный успех в нескольких системах, в большинстве случаев их лучше избегать. Число возможных ошибок в большой системе так велико, что может считаться практически бесконечным. Разрабатывая методы исправления/устойчивости, мы вынуждены пытаться предугадать лишь несколько типов ошибок, чтобы реализовать средства, предназначенные для борьбы с ущербом от этих ошибок. В лучшем случае наша система будет исправлять ничтожный процент своих потенциальных ошибок. К тому же эти средства сами довольно сложны, так что благодаря им исходное количество ошибок в системе только возрастет. Более того, они сами будут, несомненно, содержать ошибки. Наконец, если некоторые средства исправления/устойчивости все-таки заработают, они тем самым станут маскировать ошибки (делая их менее заметными), и последние, возможно, никогда не будут устранены обслуживающим персоналом, а это – явно нежелательное следствие.

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

Изоляция ошибок

В большой вычислительной системе изоляция программ является ключевым фактором, гарантирующим, что отказы в программе

214

одного пользователя не приведут к отказам в программах других пользователей или к полному выводу системы из строя. Основные правила изоляции ошибок перечислены ниже. Хотя в формулировке многих из них употребляются слова «операционная система», они применимы к любой программе (будь то операционная система, монитор телеобработки или подсистема управления файлами), которая занята обслуживанием других программ.

1.Прикладная программа не должна иметь возможности непосредственно ссылаться на другую прикладную программу или данные в другой программе и изменять их.

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

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

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

4.Операционная система должна защищать все прикладные программы и данные от случайного их изменения операторами системы или обслуживающим персоналом.

5.Прикладные программы не должны иметь возможности ни остановить систему, ни вынудить ее изменить другую прикладную программу или ее данные.

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

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

215

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

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

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

кизменению других компонент или их данных.

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

11.Операционная система должна давать прикладным про-

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

Реализация многих из этих принципов влияет на архитектуру лежащего в основе системы аппаратного обеспечения.

Читатель может заметить, что многие из перечисленных правил являются также правилами обеспечения защиты в операционных системах [2]. Таким образом, цели обеспечения защиты ресурсов и надежности обычно согласуются.

Обработка сбоев аппаратуры

Улучшая общую надежность системы, следует заботиться не только об ошибках в программном обеспечении (хотя надежность программного обеспечения требует наибольшего внимания). Другая

216

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

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

1.Повторное выполнение операций. Многие сбои аппаратуры не постоянны (например, скачки напряжения, шум в телекоммуникационных линиях, колебания при механическом движении). Всегда имеет смысл попытаться выполнить операцию, искаженную сбоем (например, команду машины или операцию ввода-вывода), несколько раз, прежде чем принимать другие меры.

2.Восстановление памяти. Если обнаруженный случайный сбой аппаратуры вызывает искажение области основной памяти и эта область содержит статические данные (например, команды объектной программы), то последствия сбоя можно ликвидировать, повторно загрузив эту область памяти.

3.Динамическое изменение конфигурации. Если аппаратная подсистема, такая как центральный процессор, канал ввода-вывода, блок основной памяти или устройство ввода-вывода, выходит из строя, работоспособность системы можно сохранить, динамически исключая неисправное устройство из набора ресурсов системы.

4.Восстановление файлов. Системы управления базами данных обычно обеспечивают избыточность данных, сохраняя копию текущего состояния базы данных на выделенных устройствах вводавывода, регистрируя все изменения базы данных или периодически автономно копируя всю базу данных. Поэтому программы вос-

217

становления могут воссоздать базу данных в случае катастрофического сбоя ввода-вывода.

5.Контрольная точка/рестарт. Контрольная точка – это пе-

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

6.Предупреждение отказов питания. Некоторые вычисли-

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

7.Регистрация ошибок. Все сбои аппаратуры, с которыми удалось справиться, должны регистрироваться во внешнем файле, чтобы обслуживающий персонал мог получать сведения о постепенном износе устройств.

3.2.7. Проектирование и программирование модуля

Этапы проектирования и программирования каждого модуля – заключительные в общем цикле проектирования. На этих этапах вы-

полняются процессы внешнего проектирования модуля (т.е. раз-

работки сопряжений каждого модуля) и проектирования логики модуля (т.е. ряд шагов, включающих определение данных, выбор алгоритма, разработку логики и собственно программирование). Для многих эти процессы олицетворяют сущность программирования; однако уже теперь должно быть ясно, что эти два процесса – лишь малая часть полного цикла разработки программного обеспечения.

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

218

Внешнее проектирование модуля

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

Внешние спецификации модуля должны содержать сведения следующих шести типов:

Имя модуля. Указывается имя, применяемое для вызова модуля. Для модуля с несколькими входами это имя определенного входа (для каждого входа имеются отдельные спецификации).

Функция. Дается определение функции или функций, выполняемых модулем. Этот раздел не должен описывать логику или контексты, в которых модуль применяется.

Список параметров. Определяется число и порядок параметров, передаваемых модулю.

Входные параметры. Дается точное описание всех входных параметров. Сюда включается определение формата, размеров, атрибутов, единиц измерения (например, морские мили) и допустимых диапазонов значений всех входных параметров.

Выходные параметры. Дается точное описание всех данных, возвращаемых модулем. Сюда должно входить определение формата, размеров, атрибутов, единиц измерения и допустимых диапазонов значений всех выходных данных. Должна быть описана функциональная связь между входными и выходными данными, т.е. следует показать, какие выходные данные какими входными порождаются. Должны быть также определены выходные данные, порождаемые модулями в случае, когда входные данные не годятся. Для того чтобы можно было считать модуль специфицированным пол-

219

ностью, должно быть определено его поведение при любых входных условиях.

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

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

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

220