Надежность программного обеспечения
Микропроцессорные системы, используемые на судах, могут выполнять задачи по управлению техническими средствами и системами регулирования и контроля при правильном выполнении аппаратурных средств и программного обеспечения (ПО) своих функций.
Под программным обеспечением понимается совокупность программ и документов, предназначенных для реализации целей и задач МПС.
Вследствие сложности программного обеспечения, большой трудоемкости процесса его разработки практически всегда существует вероятность наличия в программах разного рода ошибок, внесенных в них, как правило, при разработке или в процессе эксплуатации. В результате ошибок возникает отказ программы или ПО, определяемый как недопустимое отклонение характеристик процесса функционирования программы от требуемых. Отказ ПО в ряде случаев может иметь более серьезные последствия, чем отказ аппаратурных средств МПС, так как при этом могут формироваться неправильные управляющие воздействия.
В связи с этим при анализе надежности МПС следует рассматривать как систему, состоящую из двух в смысле надежности последовательно соединенных подсистем - аппаратурных средств и ПО.
При абсолютно надежных аппаратурных средствах и фиксированных исходных данных программа должна давать однозначный результат на выходе. Однако вследствие комбинаторного характера исходных данных, наличия множества условных переходов, зависящих от промежуточных результатов вычисления, число возможных путей реализации программы увеличивается и может превышать на несколько порядков число команд в программе. Проверить все варианты исполнения программы практически сложно, поэтому даже после нескольких лет ее использования могут появиться непроверенные варианты, в том числе и содержащие ошибки. Таким образом, появление ошибки в ПО, т. е. отказ ПО - случайное событие, в то время как сама ошибка не является случайной.
В настоящее время накоплено достаточно большое количество данных об ошибках ПО и их причинах (табл.3.17).
Эти данные составляют основу для построения математических моделей надежности ПО с целью оценки показателей надежности, а также разработки способов их обеспечения и повышения.
Таблица 3.17.
Ошибки программного обеспечения
Причина ошибки | Частота появления ошибки, % |
Неполное или ошибочное задание | |
Отклонение от задания | |
Ошибочная логика или последовательность операций | |
Пренебрежение правилами программирования | |
Ошибочная выборка данных | |
Ошибочные арифметические операции | |
Неточная запись | |
Нехватка времени для решения | |
Неправильная обработка прерываний | |
Неправильные постоянные или исходные данные |
Отказы могут возникнуть и в процессе функционирования ПО из-за неправильных действий пользователя или неправильной интерпретации сообщений, ошибочных действий пользователя в процессе диалога с ЭВМ и т. п. Часто эти отказы — следствие некачественной программной документации (неверное описание возможностей программы, режимов работы, форматов входной и выходной информации, диагностических сообщений и т. д.).
На надежность ПО определенное влияние могут оказывать и неисправности, возникающие в работе аппаратурных средств, используемых для реализации вычислительного процесса. Появление самоустраняющегося отказа в работе аппаратуры приводит к нарушению нормального хода вычислительного процесса и в ряде случаев - к искажению данных текстов программ в памяти.
Как видно, процессы, приводящие к отказу МПС из-за наличия ошибки в ПО, существенно отличаются от процессов в аппаратурных средствах, также приводящих к отказу МПС. Вместе с тем при оценке надежности ПО могут быть использованы основные положения и понятия теории надежности.
Под надежностью ПО понимают его способность выполнять заданные функции, сохраняя во времени свои характеристики в установленных пределах при определенных условиях эксплуатации.
Надежность ПО или программы определяется в основном безотказностью и восстанавливаемостью (ремонтопригодностью).
Безотказность ПО - это свойство непрерывно сохранять работоспособность в течение заданного времени. Ее можно оценить вероятностью безотказной работы, а также средним временем между моментами возникновения отказов в функционировании программы. Вероятность безотказной работы ПО P(t) - вероятность того, что ошибки программы не проявятся на интервале времени от 0 до t при определенных условиях влияния среды
P(i) = Bep(t<t0),
где t0 - случайная величина времени работы ПО до отказа.
Под определенными условиями внешней среды понимают совокупность входных данных и характер состояния вычислительной системы.
Безотказность может быть оценена и вероятностью Q(t) появления отказа ПО в течение времени t:
Q(t) = 1 - P(t).
Интенсивность отказов ПО λ(t) - это условная плотность вероятности возникновения отказа программы, определяемая для рассматриваемого момента t при условии, что до этого момента отказа не было:
Среднее время между моментами возникновения отказов в функционировании программы есть средняя наработка на отказ То - математическое ожидание временного интервала между последовательными отказами ПО. При этом предполагается, что аппаратурные средства МПС находятся в работоспособном состоянии.
С точки зрения безотказности программное обеспечение принципиально отличается от аппаратурных средств. Так, программы не изнашиваются и не стареют, и их отказ по этим причинам невозможен. Характеристики безотказности ПО зависят от качества процесса его создания. Безотказность ПО зависит от наличия в нем ошибок, внесенных при программировании. Проявляются эти ошибки тогда, когда в обработку поступают ранее не встречавшиеся совокупности входных данных, которые программа не может правильно обработать.
Со временем безотказность ПО увеличивается, так как в процессе эксплуатации обнаруживаются и устраняются ошибки, допущенные при создании программ.
На рис. 3.40 показаны характерные зависимости интенсивности отказов λ(t) для ПО и аппаратурных средств.
Рис. 3.40. Зависимости интенсивности отказов от времени эксплуатации
программного обеспечения (1) и аппаратурных средств (2)
Восстанавливаемость - важная характеристика надежности ПО. Она определяется затратами на устранение отказа из-за проявившейся ошибки в программе. Восстановление программы после отказа может включать в себя поиск ошибки, корректировку программы, исправление данных, внесение изменений в организацию процессов вычисления и управления. Восстанавливаемость ПО зависит от сложности структуры комплекса программ, структуры самих программ, алгоритмического языка, качества исходной документации и др.
Восстанавливаемость программного обеспечения может оцениваться средним временем восстановления Tв.cp - математическое ожидание времени восстановления работоспособности программы, состоящее из времени на обнаружение, поиск причины и устранение последствий отказа.
Статистически указанные показатели надежности ПО могут быть определены следующим образом.
Число N возможных наборов Е = (Еi, i = l, 2..., N) значений входных данных, необходимых для выполнения прогона программы в МПС, может быть достаточно велико, но всегда конечно. При этом для некоторого множества значений входных данных Ei E выполнение программы приводит к получению результата F(Ei), находящегося в допустимых пределах, а для всех остальных значений входных данных El E выполнение программы не обеспечивает (отказ ПО) приемлемого результата, т. е. результат F(El) неприемлем. Под прогоном программы понимается совокупность действий, включающая ввод значений набора входных данных и выполнение программы, которая заканчивается получением правильного результата F(Ei) или отказом F(El).
Отсюда следует, что вероятность того, что прогон программы приведет к отказу, т. е. что набор значений входных данных, случайно выбранный из Е среди равновероятных и использованный в данном прогоне, принадлежит множеству El, будет
Q = nl/N,
где m - число различных наборов значений входных данных, содержащихся в El.
Соответственно, вероятность того, что прогон программы при наборе входных данных, случайно выбранных из Е, приведет к получению правильного результата, будет
P = 1 - nl/N.
Вероятность безотказной работы ПО может рассматриваться как вероятность безотказного выполнения п прогонов программы. Если выбор входных данных осуществляется с одинаковыми априорными вероятностями, то
P(n) = Pn = (1 - Q)n.
Статистически вероятность безотказной работы программы может быть оценена путем прогонов программы на п наборах входных данных и расчетом оценки по формуле
где - число наборов входных данных, при которых произошли отказы.
С помощью соответствующих замен переменных и подстановок функцию Р (п) можно выразить через время функционирования. Однако зависимость безотказности ПО от времени косвенная, так как частота появления отказов ПО определяется только входными данными.
Если за рассматриваемый срок эксплуатации ПО на устранение m отказов было затрачено время Тв1 Тв2, ..., Твт, то среднее время восстановления
_ Т в.ср = .
Ошибки, существующие в ПО после его разработки, в общем случае устраняются по мере их проявления при доработке, испытаниях и эксплуатации. Полные затраты на доработку, испытания и эксплуатацию ПО, определяемые надежностью ПО, составляют
С (tди/Т ) = Cдиm (tди) + Сэ [m(Т ) - m(tди) ] + диtди ,
где Сди - средние затраты на устранение одной ошибки во время доработки и испытаний; Сэ - средние затраты на устранение одной ошибки во время эксплуатации; ди - затраты в единицу времени на проведение доработки и испытаний ПО; tди - длительность доработки и испытаний ПО; Т - суммарная продолжительность доработки, испытаний и эксплуатации ПО; m(tди), m(T ) - количество ошибок в ПО, устраняемых в период доработки и испытаний за время tm и за суммарное время T соответственно.
На основе приведенного соотношения могут быть оптимизированы затраты на доработку, испытания и эксплуатацию ПО, обеспечивающие требуемый уровень надежности, который соответствует минимуму общих затрат C(tди/T ).
Для вероятностной оценки показателей надежности ПО в настоящее время применяются модели надежности, основанные на предположении о дискретном изменении характеристик надежности программ в моменты устранения ошибок, и модели, основанные на экспоненциальном изменении количества ошибок от времени тестирования и функционирования программы.
Дискретное изменение характеристик надежности программ предполагается в модели с дискретно понижающейся интенсивностью отказов (интенсивность отказов постоянна до обнаружения и исправления ошибки, после чего опять постоянна, но с меньшим значением) и в модели с дискретно увеличивающимся временем наработки на отказ (устранение ошибки в программе приводит к увеличению времени наработки на отказ на одну и ту же случайную величину).
Для практики представляет интерес экспоненциальная модель надежности программ, в которой интенсивность отказов предполагается некоторой функцией времени, пропорциональной числу оставшихся ошибок. Модель имеет достаточно простое математическое описание и позволяет прогнозировать надежность программы на основе данных тестирования. Ниже рассматриваются основные соотношения для оценки показателей надежности программ, получаемые с помощью этой модели надежности.
В данной модели число оставшихся в программе ошибок m0(τ) находят как разность между числом ошибок М, имеющихся в программе перед тестированием, и числом m(τ) исправленных ошибок:
m0(τ)=М - т(τ),
где τ - суммарное время функционирования программы, отсчитываемое от момента начала тестирования программы с устранением обнаруженных ошибок до момента оценки надежности. Интенсивность отказов полагается пропорциональной числу оставшихся в программе ошибок т0(τ), т. е.
λ(τ) = km0(τ), (3.119)
где k - коэффициент, учитывающий фактическое быстродействие ЭВМ и число команд в программе.
Если в процессе устранения выявленных ошибок новые ошибки не создаются в программе, то интенсивность исправления ошибок dm/dτбудет равна интенсивности их обнаружения:
dm/dτ =K(x)
и с учетом (3.119) получается уравнение
(dm/dτ) + km = kM
Решением этого уравнения при начальных условиях τ = 0, m = 0 (перед началом работы ЭВМ ни одна ошибка не была исправлена) будет
т = М[1—ехр (— kτ)].
Соответственно, интенсивность отказов программы
λ(τ) = kmo(τ) = k(M—m) =kM ехр (—kτ). (3.120)
Среднюю наработку на отказ программы после ее тестирования в течение времени т определяют в виде
Т0=1/λ(τ)= Т0н exp[τ/(MT0н)], (3.121)
где Т0н= 1/kМ - начальное значение средней наработки на отказ перед тестированием.
Из (3.120) и (3.121) видно, что по мере выявления и устранения ошибок интенсивность отказов программы уменьшается, а средняя наработка на отказ увеличивается.
Если в процессе устранения выявленных ошибок могут появиться новые ошибки, то их можно учесть при определении надежности ПО с помощью коэффициента уменьшения ошибок
B = m/n = M/No,
где п - число обнаруженных отказов; No - число отказов, которые должны произойти для выявления и устранения m соответствующих ошибок.
Тогда среднюю наработку на отказ и количество обнаруженных отказов определяют по формулам
Tо = = Тон exp [τ/(NoToн)]
n=N0[1—exp(—Bkτ)] = No{1—exp[—τ/(NоTон)]}.
Начальное значение средней наработки на отказ перед тестированием Toн= 1/(BkNo) — 1/(kM) остается таким же, как и в случае, когда при устранении выявленных ошибок новые ошибки не создаются, а средняя наработка на отказ несколько уменьшается в соответствии с коэффициентом В.
Коэффициент В может быть определен статистически, исходя из количества ошибок, возникающих во время устранения обнаруженных ошибок. Для систем программного обеспечения общего назначения В изменяется в диапазоне 0,91. . .0,95.
С ростом числа обнаруженных и устраненных отказов безотказность ПО увеличивается. На основе приведенных соотношений можно оценить число отказов An, которые должны быть обнаружены и устранены для увеличения средней наработки на отказ ПО от T01 до Т02:
п = п2 — п1 =
Соответственно дополнительное время работы ПО для такого увеличения средней наработки на отказ составит
= τ2 - τ1 = NoToн ln(T02/Tон) - NoToн ln(To1/Toн) = NoTон ln(T02/T01).
Таким образом можно определить время доработки и испытаний программ для достижения заданного уровня надежности и оценить количество оставшихся в программе ошибок. Количество ошибок, имеющихся в программе перед тестированием М и величину No можно оценить по среднему числу ошибок на одну команду в начале тестирования. Для программ, написанных на языке Ассемблера, на 1000 команд число ошибок составляет 4...8.
Надежность программного комплекса МПС в целом определяется как функция надежности его составных частей - подпрограмм. Для оценки надежности программного комплекса может быть использована марковская модель случайного процесса.
Каждому набору входных данных, поступающих на вход программы, соответствует некоторая последовательность выполняемых подпрограмм. Значит, надежность программного комплекса будет зависеть от последовательности выполняемых подпрограмм и надежности каждой из этих подпрограмм. Безотказность подпрограммы характеризуется вероятностью того, что подпрограмма правильно выполнит свое назначение — выдаст правильные выходные данные и правильно передаст управление следующей подпрограмме.
Марковская модель управления подпрограммами предполагает, что выбор следующей для выполнения подпрограммы зависит только от подпрограммы, выполняемой в данный момент и не зависит от предыстории.
При использовании марковской модели обычно также полагают, что показатели надежности каждой подпрограммы могут быть определены и являются величинами независимыми; вероятности передачи управления между подпрограммами есть величины постоянные; программный комплекс откажет, если возникнет отказ хотя бы в одной из подпрограмм, выполняемых в данном прогоне программы.
При этих предположениях структура управления программы представляется в виде направленного графа, в котором каждая вершина Si(i = ) соответствует подпрограмме i, а дуга (Si, Sj) - возможной передаче управления от Si к Sj. Каждой вершине Si соответствует вероятность безотказной работы Pi, подпрограммы i, а каждой дуге — величина вероятности перехода из вершины Si по дуге (Si, Sj). Граф представляется с единственной входной Si, единственной выходной Sn и двумя дополнительными вершинами, соответствующими правильному П и ошибочному О выходным результатам.
Вероятность безотказной работы программного комплекса вычисляют как вероятность достижения конечного состояния П из начального состояния графа S1. Вычисления производятся с помощью матрицы переходных вероятностей, элементы которой соответствуют переходу марковского процесса из состояния i в состояние j. Повышение надежности программ возможно за счет:
совершенствования технологии программирования;
применения алгоритмов, нечувствительных к разного рода нарушениям вычислительного процесса (использование алгоритмической избыточности);
резервирования программ;
диагностирования программ с последующей коррекцией.
Возможности повышения надежности программ технологическими мерами ограничены, поэтому применяют различные методы резервирования программ. Подготавливают две или несколько версий программ для решения одной и той же задачи. При этом стремятся использовать в них различные алгоритмы или, по крайней мере, выполнять их разными программистами. Совпадение возможных ошибок в текстах отдельных версий программ маловероятно, поэтому они могут быть обнаружены по расхождению результатов, полученных при одинаковых исходных данных при параллельном (одновременном) или последовательном по времени выполнении различных версий программ непосредственно в процессе эксплуатации. Программирование с двумя версиями называется дуальным, если число версий - N, то программирование называется N-вepcuонным.
Если расхождение обнаруживается в результатах основной и резервной программ, которые сравниваются аппаратурными или программными средствами, то с помощью дополнительных критериев определяется правильный результат, а другие результаты отбрасываются.
При дуальном или N-версионном программировании требуется в два или N раз больший объем труда программистов, во столько же раз требуется больше аппаратуры или больше времени для вычислений, если они выполняются последовательно. Поэтому такое резервирование целесообразно использовать в тех случаях, когда имеется соответствующий нагруженный резерв вычислительной аппаратуры, а значит, не требуется дополнительная аппаратура для вычислений по различным версиям программ.
Представляет интерес резервирование путем модифицированного дуального программирования, когда вместе с достаточно сложной основной программой используется менее точная, «о довольно простая резервная программа. Если при одинаковых исходных данных результаты работы программ отличаются на величину, большую, чем допустимая погрешность, то полагается, что отказала менее надежная основная программа, и правильным принимается результат резервной программы. В итоге несколько увеличивается средняя погрешность работы двух программ, но увеличивается и вероятность безотказной работы ПО. Такое резервирование эффективно, когда критерием эффективности является усредненная по времени погрешность. Если критерием эффективности является мгновенное максимальное значение погрешности, то такое резервирование не эффективно.
Рассмотренные методы резервирования применимы как для программ пользователя, так и для операционных систем.
При использовании одной ЭВМ несколькими пользователями (рис. 3.41, а) повысить надежность программ можно также созданием отдельных операционных систем ОС1...ОСn для каждого пользователя П1 ... Пn (рис.3.41, б), что с помощью монитора М (специальная программа или программно-операционная система) создает для каждого пользователя иллюзию работы на отдельной вычислительной машине. Если пользователи имеют общую операционную систему ОС (рис. 3.41, а), то ошибка в ОС выводит из строя всех пользователей. Когда пользователи имеют отдельные операционные системы (рис. 3.41,6) то-отказ какой-либо индивидуальной операционной системы ОС1 ... ОСn вызывает нарушение в работе только одного соответствующего пользователя, и только ошибка в сравнительно небольшой программе - мониторе М приведет к нарушению работы всех пользователей.
Рис. 3.41. Схемы использования-ЭВМ несколькими пользователями:
а - с общей операционной системой;
б - с отдельными операционными системами
В заключение следует отметить, что повышение надежности программ их резервированием связано с увеличением трудоемкости программирования, объема памяти для записи программ и машинного времени для их реализации