Во второй главе данного учебного пособия мы уже сталкивались с различными подходами к обеспечению заданной надежности при проектировании аппаратного обеспечения. В четвертой главе – разделе по диагностике – будут рассмотрены системы встроенного контроля, позволяющие повысить достоверность получаемой информации. Однако не все методы обеспечения надежности аппаратного обеспечения могут быть использованы для ПО. Поэтому в данном параграфе рассматриваются методы повышения надежности, характерные для ПО. При этом, если это возможно, мы будем делать ссылки на аналогичные методы для аппаратуры.
Все принципы и методы обеспечения надежности ПО в соответствии с их целью можно разбить на четыре группы: предупреждение ошибок, обнаружение ошибок, исправление ошибок и обеспечение устойчивости к ошибкам. К первой группе относятся принципы и методы, позволяющие минимизировать или вообще исключить ошибки. Методы второй группы сосредоточивают внимание на функциях самого программного обеспечения, помогающих выявлять ошибки. К третьей группе относятся функции программного обеспечения, предназначенные для исправления ошибок или их последствий. Устойчивость к ошибкам – это мера способности системы ПО продолжать функционирование при наличии ошибок.
Предупреждение ошибок. К этой группе относятся принципы и методы, цель которых – не допустить появления ошибок в готовой программе. Большинство методов концентрируется на отдельных процессах перевода и направлено на предупреждение ошибок в этих процессах. Их можно разбить на следующие категории:
– методы, позволяющие справиться со сложностью, свести ее к минимуму, так как сложность процесса – главная причина ошибок перевода;
– методы достижения большей точности при переводе;
– методы улучшения обмена информацией;
– методы немедленного обнаружения и устранения ошибок, которые следует обнаруживать на каждом шаге перевода, не откладывая это до тестирования готовой программы.
Очевидно, что предупреждение ошибок – оптимальный путь к достижению надежности ПО. Гарантировать отсутствие ошибок, однако, невозможно никогда. Другие три группы методов опираются на предположение, что ошибки все-таки будут.
Обнаружение ошибок. Если предполагать, что в программном обеспечении ошибки все-таки будут, то лучшая стратегия – включить средства обнаружения ошибок в само ПО. Такие методы часто применяются в аппаратуре. Это коды, обнаруживающие ошибки (см. подразд. 4.3.8).
Большинство методов направлено по возможности на незамедлительное обнаружение сбоев. Немедленное обнаружение имеет два преимущества: можно минимизировать влияние ошибки и одновременно облегчить задачу для человека, которому придется извлекать информацию об этой ошибке, находить ее и исправлять.
Исправление ошибок. Следующий шаг – исправление ошибок. После того как ошибка обнаружена, либо она сама, либо ее последствия должны быть исправлены программным обеспечением
При проектировании систем аппаратурного обеспечения такой метод оказался плодотворным. При резервировании замещением, как показано в подразд. 2.2, некоторые устройства способны обнаружить неисправные компоненты и перейти к использованию идентичных запасов. Аналогичные методы неприменимы к программному обеспечению вследствие глубоких внутренних различий между отказами аппаратуры и ошибками в программах. Если некоторый программный модуль содержит ошибку, идентичные «запасные» модули будут содержать ту же ошибку.
Во второй главе (подразд. 2.5.2) был рассмотрен другой вариант этой идеи: коды, исправляющие ошибки. Для ПО аналогичный подход к исправлению связан с попытками восстановить разрушения, вызванные ошибками, например искажения записей в базе данных или управляющих таблицах системы. Польза от методов борьбы с искажениями ограниченна, поскольку предполагается, что разработчик заранее должен предугадать все возможные типы искажений и предусмотреть программно реализуемые функции для их устранения.
Устойчивость к ошибкам. Методы этой группы ставят своей целью обеспечить функционирование программной системы при наличии в ней ошибок. Они разбиваются на три подгруппы: динамическая избыточность, методы отступления и методы изоляции ошибок.
Истоки концепции динамической избыточности наряду со статической избыточностью лежат в проектировании аппаратурного обеспечения. Одна из концепций динамической избыточности – мажоритарный метод. Данные обрабатываются независимо несколькими идентичными устройствами и результаты сравниваются. Если большинство устройств выработало одинаковый результат, то он считается правильным. И опять-таки, при копировании программного модуля мы скопируем имеющуюся в нем ошибку. Предполагаемый поход к устранению этого затруднения – создание не идентичных копий модуля. Это означает, что все копии либо реализуют разные алгоритмы, либо выполнены разными лицами, что далеко не всегда возможно.
Вторая подгруппа методов обеспечения устойчивости к ошибкам называется методами отступления или сокращенного обслуживания. Эти методы приемлемы обычно лишь тогда, когда для системы программного обеспечения существенно важно закончить работу с минимальными отклонениями от алгоритма. Например, если ошибка оказывается в системе, управляющей технологическими процессами, и в результате эта система выходит из строя, то может быть загружен и выполнен особый фрагмент программы, призванный подстраховать систему и обеспечить безаварийное завершение всех управляемых системой процессов. Аналогичные средства часто необходимы в операционных системах.
Последняя подгруппа – методы изоляции ошибок. Основная их идея – локализовать последствия ошибки в как можно меньшей части системы ПО, чтобы при возникновении ошибки не вся система оказалась неработоспособной. Например, во многих операционных системах изолируются ошибки отдельных пользователей, а система в целом продолжает функционировать. Другие методы изоляции ошибок связаны с защитой каждой из программ в системе от ошибок других программ. Ошибка в прикладной программе, выполняемой под управлением операционной системы, должна оказывать влияние только на эту программу.