Надежность программного обеспечения

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

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

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

В связи с этим при анализе надежности МПС следует рас­сматривать как систему, состоящую из двух в смысле надежно­сти последовательно соединенных подсистем - аппаратурных средств и ПО.

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

В настоящее время накоплено достаточно большое количест­во данных об ошибках ПО и их причинах (табл.3.17).

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

Таблица 3.17.

Ошибки программного обеспечения

Причина ошибки Частота появления ошибки, %
Неполное или ошибочное задание
Отклонение от задания
Ошибочная логика или последовательность операций
Пренебрежение правилами программирования
Ошибочная выборка данных
Ошибочные арифметические операции
Неточная запись
Нехватка времени для решения
Неправильная обработка прерываний
Неправильные постоянные или исходные данные


Отказы могут возникнуть и в процессе функционирования ПО из-за неправильных действий пользователя или неправиль­ной интерпретации сообщений, ошибочных действий пользова­теля в процессе диалога с ЭВМ и т. п. Часто эти отказы — след­ствие некачественной программной документации (неверное описание возможностей программы, режимов работы, форматов входной и выходной информации, диагностических сообщений и т. д.).

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

Как видно, процессы, приводящие к отказу МПС из-за нали­чия ошибки в ПО, существенно отличаются от процессов в ап­паратурных средствах, также приводящих к отказу МПС. Вместе с тем при оценке надежности ПО могут быть использо­ваны основные положения и понятия теории надежности.

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

Надежность ПО или программы определяется в основном безотказностью и восстанавливаемостью (ремонтопригод­ностью).

Безотказность ПО - это свойство непрерывно сохранять ра­ботоспособность в течение заданного времени. Ее можно оце­нить вероятностью безотказной работы, а также средним вре­менем между моментами возникновения отказов в функциони­ровании программы. Вероятность безотказной работы ПО P(t) - вероятность того, что ошибки программы не проявятся на интервале времени от 0 до t при определенных условиях влияния среды

P(i) = Bep(t<t0),

где t0 - случайная величина времени работы ПО до отказа.

Под определенными условиями внешней среды понимают со­вокупность входных данных и характер состояния вычислитель­ной системы.

Безотказность может быть оценена и вероятностью Q(t) по­явления отказа ПО в течение времени t:

Q(t) = 1 - P(t).

Интенсивность отказов ПО λ(t) - это условная плотность вероятности возникновения отказа программы, определяемая для рассматриваемого момента t при условии, что до этого мо­мента отказа не было:

Надежность программного обеспечения - student2.ru

Среднее время между моментами возникновения отказов в функционировании программы есть средняя наработка на отказ То - математическое ожидание временного интер­вала между последовательными отказами ПО. При этом пред­полагается, что аппаратурные средства МПС находятся в рабо­тоспособном состоянии.

С точки зрения безотказности программное обеспечение принципиально отличается от аппаратурных средств. Так, программы не изнашиваются и не стареют, и их отказ по этим причинам невозможен. Характеристики безотказности ПО зави­сят от качества процесса его создания. Безотказность ПО зави­сит от наличия в нем ошибок, внесенных при программирова­нии. Проявляются эти ошибки тогда, когда в обработку посту­пают ранее не встречавшиеся совокупности входных данных, которые программа не может правильно обработать.

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

На рис. 3.40 показаны характерные зависимости интенсивно­сти отказов λ(t) для ПО и аппаратурных средств.

Надежность программного обеспечения - student2.ru

Рис. 3.40. Зависимости интенсивности отказов от времени эксплуатации

программного обеспечения (1) и ап­паратурных средств (2)

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

Восстанавливаемость программного обеспечения может оце­ниваться средним временем восстановления Tв.cp - математическое ожидание времени восстановления рабо­тоспособности программы, состоящее из времени на обнаруже­ние, поиск причины и устранение последствий отказа.

Статистически указанные показатели надежности ПО могут быть определены следующим образом.

Число N возможных наборов Е = (Еi, i = l, 2..., N) значе­ний входных данных, необходимых для выполнения прогона программы в МПС, может быть достаточно велико, но всегда конечно. При этом для некоторого множества значений вход­ных данных Ei Надежность программного обеспечения - student2.ru E выполнение программы приводит к получе­нию результата F(Ei), находящегося в допустимых пределах, а для всех остальных значений входных данных El Надежность программного обеспечения - student2.ru E выполне­ние программы не обеспечивает (отказ ПО) приемлемого ре­зультата, т. е. результат F(El) неприемлем. Под прогоном прог­раммы понимается совокупность действий, включающая ввод значений набора входных данных и выполнение программы, ко­торая заканчивается получением правильного результата F(Ei) или отказом F(El).

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

Q = nl/N,

где m - число различных наборов значений входных данных, содержащихся в El.

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

P = 1 - nl/N.

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

P(n) = Pn = (1 - Q)n.

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

Надежность программного обеспечения - student2.ru

где - Надежность программного обеспечения - student2.ru число наборов входных данных, при которых произошли отказы.

С помощью соответствующих замен переменных и подстано­вок функцию Р (п) можно выразить через время функционирова­ния. Однако зависимость безотказности ПО от времени косвен­ная, так как частота появления отказов ПО определяется толь­ко входными данными.

Если за рассматриваемый срок эксплуатации ПО на устра­нение m отказов было затрачено время Тв1 Тв2, ..., Твт, то среднее время восстановления

_ Т в.ср = Надежность программного обеспечения - student2.ru .

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

С (tдиНадежность программного обеспечения - student2.ru ) = Cдиm (tди) + Сэ [m(Т Надежность программного обеспечения - student2.ru ) - m(tди) ] + Надежность программного обеспечения - student2.ru диtди ,

где Сди - средние затраты на устранение одной ошибки во вре­мя доработки и испытаний; Сэ - средние затраты на устранение одной ошибки во время эксплуатации; Надежность программного обеспечения - student2.ru ди - затраты в единицу времени на проведение доработки и испытаний ПО; tди - дли­тельность доработки и испытаний ПО; Т Надежность программного обеспечения - student2.ru - суммарная продол­жительность доработки, испытаний и эксплуатации ПО; m(tди), m(T Надежность программного обеспечения - student2.ru ) - количество ошибок в ПО, устраняемых в период до­работки и испытаний за время tm и за суммарное время T Надежность программного обеспечения - student2.ru со­ответственно.

На основе приведенного соотношения могут быть оптимизи­рованы затраты на доработку, испытания и эксплуатацию ПО, обеспечивающие требуемый уровень надежности, который соот­ветствует минимуму общих затрат C(tди/T Надежность программного обеспечения - student2.ru ).

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

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

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

В данной модели число оставшихся в программе ошибок 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/λ(τ)= Надежность программного обеспечения - student2.ru Т exp[τ/(MT)], (3.121)

где Т= 1/kМ - начальное значение средней наработки на от­каз перед тестированием.

Из (3.120) и (3.121) видно, что по мере выявления и устра­нения ошибок интенсивность отказов программы уменьшается, а средняя наработка на отказ увеличивается.

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

B = m/n = M/No,

где п - число обнаруженных отказов; No - число отказов, ко­торые должны произойти для выявления и устранения m соот­ветствующих ошибок.

Тогда среднюю наработку на отказ и количество обнаружен­ных отказов определяют по формулам

Tо = Надежность программного обеспечения - student2.ru = Тон exp [τ/(NoToн)]

n=N0[1—exp(—Bkτ)] = No{1—exp[—τ/(NоTон)]}.

Начальное значение средней наработки на отказ перед тести­рованием Toн= 1/(BkNo) — 1/(kM) остается таким же, как и в случае, когда при устранении выявленных ошибок новые ошиб­ки не создаются, а средняя наработка на отказ несколько уменьшается в соответствии с коэффициентом В.

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

С ростом числа обнаруженных и устраненных отказов без­отказность ПО увеличивается. На основе приведенных соотно­шений можно оценить число отказов An, которые должны быть обнаружены и устранены для увеличения средней наработки на отказ ПО от T01 до Т02:

Надежность программного обеспечения - student2.ru п = п2 — п1 = Надежность программного обеспечения - student2.ru

Соответственно дополнительное время работы ПО для тако­го увеличения средней наработки на отказ составит

Надежность программного обеспечения - student2.ru = τ2 - τ1 = NoToн ln(T02/Tон) - NoToн ln(To1/Toн) = NoTон ln(T02/T01).

Таким образом можно определить время доработки и испы­таний программ для достижения заданного уровня надежности и оценить количество оставшихся в программе ошибок. Количе­ство ошибок, имеющихся в программе перед тестированием М и величину No можно оценить по среднему числу ошибок на одну команду в начале тестирования. Для программ, написанных на языке Ассемблера, на 1000 команд число ошибок составляет 4...8.

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

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

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

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

При этих предположениях структура управления программы представляется в виде направленного графа, в котором каждая вершина Si(i = Надежность программного обеспечения - student2.ru ) соответствует подпрограмме 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 вызывает нарушение в работе только одного соответствую­щего пользователя, и только ошибка в сравнительно небольшой программе - мониторе М приведет к нарушению работы всех пользователей.

Надежность программного обеспечения - student2.ru

Рис. 3.41. Схемы использования-ЭВМ несколькими пользователя­ми:

а - с общей операционной си­стемой;

б - с отдельными опера­ционными системами

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

Наши рекомендации