Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Надежность программных средств






 

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

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

- безотказность - свойство программы выполнять свои функции во время эксплуатации;

- работоспособность - свойство программы корректно (так как ожидает пользователь) работать весь заданный период эксплуатации;

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

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

 

Различают дефекты ПО и сбои.

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

Дефект – это ошибка/неточность, которая может быть (а может и не быть) следствием сбоя.

 

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

o выдача неверных результатов;

o отсутствие результатов («зависание компьютера»);

o выдача системного сообщения об ошибке;

o уменьшение производительности;

o порча данных пользователя.

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

Отказ программного продукта может быть обусловлен двумя причинами:

1) нарушение разработчиком программы спецификации - технических требований к программе;

2) спецификация неточная или не полная.

Поскольку не всегда возможно составить точную спецификацию, программы классифицируют по степени точности спецификации следующим образом:

1) программы, функции которых полностью определяются спецификацией;

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

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

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

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

Для обеспечения и повышения надежности программ используются следующие мероприятия:

1) Усовершенствование технологии программирования. Для реализации этого мероприятия применяют два методологических подхода. Во-первых, необходимо широко использовать принципы модульного программирования в сочетании с практикой минимизации числа соединений между модулями. Во-вторых, необходимо искать и применять способы защитного программирования, направленного на уменьшение вероятности ошибок в программах. Такое программирование опирается на две основные концепции: защиту и устойчивость к ошибкам.

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

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

б) Основное допущение программирования, устойчивого к ошибкам, заключается в том, что как бы хорошо ни была спроектирована и реализована программа, в ней обязательно будет содержаться несколько остаточных ошибок. А раз так, то модули программы, которые могут дать сбой, должны иметь “резервный запас”. С этой целью модуль проектируется в виде блоков восстановления. Каждый блок восстановления содержит пропускной тест и один или несколько вариантов реализации. Основной вариант инициируется при вызове блока восстановления, и когда его выполнение завершается, происходит проверка значения пропускного теста. Если он дает «истину», то считается, что выполнение блока восстановления успешно завершено. Если же тест дает «ложь», то инициируется другой вариант, за которым следует определение значения пропускного теста и т. д., и так до успешного выполнения блока восстановления. Если же ни один вариант не прошел пропускного теста, то блок восстановления рассматривается как ошибочный и начинается исполнение другого варианта вызываемого модуля.

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

Мерой чувствительности алгоритма может являться погрешность вычислений. Результаты вычислений искажаются следующими погрешностями:

а) исходных данных, трансформированными в ходе вычислений;

б) округления;

в) погрешностями метода;

г) погрешностями, обусловленными отказами, сбоями и ошибками в программе;

3) Резервирование программ (введение структурной избыточности).

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

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

Рассмотренные способы резервирования требуют в 2 или N раз больше времени для вычислений и увеличение объема труда программистов во столько же раз.

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

4) Тестирование программ. Тестирование - проверка работы программы по результатам ее выполнения на специально подобранных наборах исходных данных - тестах.

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

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

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

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.