Смекни!
smekni.com

Разработка программно–алгоритмических средств для определения надёжности программного обеспечения на основании моделирования работы системы типа "клиент–сервер" (стр. 3 из 13)

предотвращение ошибок за счет структурного программирования;

сокрытие информации или дозированный доступ к данным со стороны программных средств и объектов в объектно–ориентированном программировании;

отладка;

устойчивость к сбоям;

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

восстановление программы после сбоя;

верификация и валидация (верификация отвечает на вопрос, правильно ли и качественно ли создана программа, а валидация (или аттестация) – на вопрос правильно ли работает программа).

В работе [13] говорится о повышении надежности ПО с помощью введения избыточности. Для повышения надежности ПО пользуются методом резервирования. Для этого разрабатывают две или более различных по алгоритмам версий программы для решения одной и той же задачи. Для этого хорошо подходит метод, когда одну и ту же программу пишут две независимые группы программистов, даже если при этом они реализуют один и тот же алгоритм (задача не должна быть при этом тривиальной). Это очень ресурсоемкий метод и поэтому редко используется на практике. Такое ПО параллельно выполняется в процессе эксплуатации. Сюда же подходит метод быстрого, но не точного решения и долгого и точного, с последующим сравнением результатов. ПО считается правильно отработавшим, если результат сравнения удовлетворяет какому–либо критерию близости результатов, например разность результатов не должна превышать некоторого значения.

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

тестирование ветвей;

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

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

динамическое тестирование (с помощью динамически генерируемых входных данных), что удобно при быстром тестировании во всем широком диапазоне входных параметров;

тестирование путей выполнения программы;

функциональное тестирование;

проверки по времени выполнения программы;

проверка по использованию ресурсов и стрессовое тестирование.

В работе [8] говорится, что существует 4 основные составляющие функциональной надежности программных систем:

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

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

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

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

В этом случае высокий уровень функциональной надежности может быть достигнут только за счет уменьшения эффективности работы программы. В работе [19] говорится, что в соответствии с ГОСТ 19.004–80 различают следующие виды работ, направленные на устранение ошибок в ПО: проверка, отладка и испытание программы.

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

Рисунок 5 – Интенсивность обнаружения ошибок от интенсивности использования, где K – число пользователей, K1 > K2 > K3.

В [19] подчеркивается, что при заключительных приемо–сдаточных и сертификационных испытаниях для определения надежности ПО организуются многочасовые и многосуточные прогоны функционирования комплекса программ в реальной или имитационной внешней среде в условиях широкого варьирования исходных данных с акцентом на стрессовые ситуации.

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

Интенсивность обнаружения ошибок ниже 0,001 ошибок в день на человека, т.е. меньше одной ошибки в год на 3–4 специалистов, по видимому, может служить эталоном высокого качества отладки и надежности для ПО обработки информации и соответствует очень высокому уровню наработки на отказ » 5 – 10 тысяч часов.

В [20] к числу основных факторов, влияющих на надежность ПО отнесены:

взаимодействие ПО с внешней средой (программно–аппаратная средства, трансляторы, ОС). Этот фактор вносит наименьший вклад в надежность ПО при современном уровне надежности аппаратуры, ОС и компиляторов;

взаимодействие с человеком (разработчиком и пользователем) (см. например метрику Холстеда);

организация ПО (проектирование, постановка задачи и способы их достижения и реализации) и качество его разработки. Этот фактор вносит наибольший вклад в надежность;

тестирование.

В соответствии с этим способы обеспечения и повышения надежности ПО могут быть следующими:

усовершенствование технологии программирования (например, формальное описание этапов программирования при помощи языка UML);

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

резервирование программ – N–версионное программирование;

верификация и валидация программ с последующей коррекцией.

1.3 Выводы

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


2. Теоретическая часть

2.1 Существующие модели надежности ПО

Прогнозирование надежности ПО в процессе его эксплуатации осуществляется на основе математических моделей надежности программ.

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

В [20] дается классификация моделей надежности ПО. Наиболее известных моделей надежности ПО в настоящее время существует около десятка, поэтому в данной работе они сгруппированы по признакам. В качестве классификационных признаков выбраны следующие (рис.6):

временная структура процессов проявления ошибок в ПО (время появления ошибки, количество ошибок за заданный интервал времени);

сложность программы (мера сложности ПО – длина, количество функций или модулей, данных и т.п.);

разметка ошибок (искусственное внесение в ПО известных ошибок);

структура пространства входных данных;

структура текста программы (распределение ошибок по тексту программы).