48639 (588587), страница 8
Текст из файла (страница 8)
и N – число первоначально присутствующих в ПО ошибок.
Эта модель построена на следующих допущениях:
время до следующего отказа распределено экспоненциально;
интенсивность отказов пропорционально оставшимся в ПО ошибкам.
Тогда вероятность безотказной работы ПО:
, (А.1)
где
i=CD * ( N0–(i–1) ), (А.2)
CD – коэффициент пропорциональности,
N0 – первоначальное число ошибок в ПО.
В (А.1) отчет времени начинается от момента последнего (i–1)–го отказа.
Если известны все моменты обнаружения ошибок ti и каждый раз в этот момент устраняется одна ошибка, то, используя метод максимального правдоподобия, можно получить уравнение для определения значения начального количества ошибок N0.
По методу максимального правдоподобия находим CD и N0. Функция правдоподобия имеет вид:
.
Откуда получаем условия для нахождения экстремумов:
,
Отсюда получаем решение для CD и N0:
,(А.3)
.(А.4)
Уравнение (А.4) решается методом перебора.
Пусть в ходе отладки зафиксированы интервалы времени между отказами ПО t1=10, t2=20, t3=25 ч. Определим по вышеприведенным формулам вероятность отсутствия 4–го отказа, начиная с момента устранения 3–го отказа.
Решаем (А.4) методом перебора и получаем N=4. Следовательно, из (А.3) имеем CD=0,02. Тогда из (А.1, А.2) получаем P(t4)=exp(0,02*t4) и, следовательно, 4=0,02 и среднее время до следующего отказа программы составляет =1/4=50 ч.
Это одна из первых и простых моделей. Модель использована при разработке весьма ответственных проектов (например, для программы Apollo). В ее основу положены следующие допущения:
интенсивность обнаружения ошибки R(t) пропорциональна текущему числу ошибок в программе;
все ошибки равно вероятны и их появления независимы друг от друга;
время до следующего отказа распределено экспоненциально;
ошибки постоянно исправляются без внесения новых ошибок;
R(t) = const на интервале между двумя соседними ошибками;
В соответствии с этими допущениями функцию распределения (риска) интенсивности ошибок между (i–1) и i–ой ошибками можно представить как:
R(t) = K[N0 – (i–1)],
где K – коэффициент пропорциональности; N0 – исходное число ошибок в ПО.
Все интервалы времени
ti = ti – ti–1
имеют экспоненциальное распределение:
P(ti) = exp{– K[N0 – (i–1)] ti }.
Из принципа максимального правдоподобия для K и N0 получают следующие оценки:
,(А.5)
.(А.6)
Нелинейное уравнение (А.6) достаточно сложно для решения численными методами, так как оно имеет локальные экстремумы и не всегда имеет решение.
Модель позволяет найти время до обнаружения следующей ошибки tn+1 и время необходимое для обнаружения всех ошибок T:
,
.
Можно посчитать n – количество ошибок, которое следует обнаружить и устранить для повышения наработки между обнаружениями ошибок от T1 до T2:
n = N0 · T0 · ( 1/T1 – 1/T2).(А.7)
Также можно получить затраты времени t на проведение тестирования, которые позволяют устранить n ошибок и соответственно повысить наработку от T1 до T2:
t = N0 · T0 · ln( T2 / T1 ) / K .(А.8)
Коэффициент готовности:
,
Коэффициент простоя КП = 1 – КГ, где t' – период проверок, t1 – время затрат ресурсов на проверки, tВ – длительность восстановления работоспособности программы.
Относительная длительность отладки в этой модели:
,
где H – количество систем, в которых функционирует программа; tЭ – длительность эксплуатации программы; ‑ коэффициент увеличения затрат ресурсов на единицу машинного времени.
Средняя наработка на отказ:
Тср = 1/.
Следует подчеркнуть статистический характер приведенных соотношений.
Из (А.8) видно, что время, затрачиваемое на тестирование, пропорционально квадрату первоначального количества ошибок T0 в программе. Приведем пример: пусть N0 = 1000; T0 = 1 час. Требуется повысить надежность программы с T1 =1 час до T2 = 1 месяц = 720 часов. Тогда из (А.7) n = 999, что фактически означает, что нужно обнаружить все ошибки для получения устойчивой работы ПО в 1 месяц. И на это будет затрачено время t ~ 60 дней (при расчете K по формуле (А.5) было сделано предположение о неизменности , в этом случае
K=n*T0/(сумма ар. прогрессии)).
На практике же будет затрачено гораздо меньше времени и найдено гораздо меньше ошибок, так как предположение о равномерности использования всего текста программы в процессе эксплуатации не верно. И, скорее всего, будет за меньшее время обнаружено 99% ошибок в той части программы, которая исполняется чаще, чем другая. В малоэксплуатируемой части останется не обнаруженными до 99% ошибок. Отсюда следует вывод о большой важности точного подбора входных данных при тестировании как можно более соответствующих режиму эксплуатации и вывод о необходимости сокращать время тестирования за счет меньшего тестирования малоиспользуемых ветвей программы. При этом важно не забывать о различных режимах эксплуатации ПО: нормальном, аварийном, ждущем и т.п.
Постулат, что программа не меняется за исключением исправления ошибки, а новые ошибки не вносятся, является спорным. Желание выразить надежность ПО некоторой функцией времени вполне логично, однако в действительности она от времени не зависит. Надежность ПО является функцией числа ошибок, их серьезности и расположения, а также того, насколько интенсивно система используется (интенсивность входного потока данных).
Статистическая модель Миллса
Описана в [11] и [20]. Программа специально "засоряется" некоторым количеством заранее известных ошибок. Эти ошибки вносятся в программу случайным образом, а затем делается предположение, что для ее собственных и искусственно внесенных ошибок вероятность обнаружения при последующем тестировании одинакова и зависит только от их количества. Тестируя программу в течении некоторого времени и отсортировывая собственные и внесенные ошибки можно оценить N – первоначальное число ошибок в программе.
Пусть: S – число специально внесенных ошибок; n – число найденных собственных ошибок в программе; – число найденных внесенных ошибок; n+ – количество обнаруженных ошибок при тестировании.
Тогда по методу максимального правдоподобия имеем: N = S · n / .
Основное допущение модели – распределение «посеянных» ошибок совпадает с распределением по программе собственных ошибок, и, следовательно, обнаружение, как тех, так и других ошибок равновероятно – что является существенным недостатком этой модели.
При этом можно выдвигать и проверять гипотезы об N. Пусть в программе не более k собственных ошибок и внесли нее еще S ошибок. Теперь программа тестируется, пока не будут обнаружены все специально внесенные ошибки. Причем в этот момент подсчитывается число обнаруженных собственных ошибок (обозначим его, как и раньше, как n). Введем уровень значимости C:
(А.9)
С – мера доверия к модели, то есть мера правильности нашего предположения о количестве k собственных ошибок и дает оценку для количества ошибок
,
которое нужно внести в программу, чтобы проверить гипотезу с заданным уровнем значимости.
Например, если мы утверждаем, что в программе нет ошибок (k = 0), и внося в программу 4 ошибки, все их обнаруживаем, не встретив ни одной собственной ошибки, то C = 0.80. А чтобы достичь уровня 95 %, надо было бы внести в программу 19 ошибок.
Этот метод не очень эффективен в случае применения его в реальной практике, так как если предположить что в программе своих ошибок n = 1000 (что более реально, чем n = 0), то для достижения уровня правдоподобия 0,95 в программу придется ввести 19019 ошибок, что само по себе уже тяжелая задача.
Формулу (А.9) можно модифицировать так, чтобы устранить недостаток, заключающийся в том, что C нельзя предсказать до тех пор, пока не будут обнаружены все искусственно внесенные ошибки (а это может и не произойти за ограниченное время, отведенное на тестирование). Модифицированной формулой можно пользоваться уже после того, как найдено j внесенных ошибок:
(А.10)
Это математически очень простая и интуитивно понятная модель. Процесс внесения ошибок – само слабое звено модели, так как должны вноситься "типичные" для данной программы ошибки (то есть искусственно внесенные ошибки должны иметь то же распределение вероятности, что и собственные ошибки). Кроме того, эта модель не учитывает системных ошибок, то есть ошибок вносимых на этапе проектирования, а не самого кодирования.
Модель Бейзина
Пусть ПО содержит Nk команд [20]. Случайным образом из них выбирается n команд, в которые вводятся ошибки. Затем для тестирования случайным образом выбирается r команд. Если в ходе тестирования будет обнаружено собственных и m привнесенных («посеянных») ошибок, то полное число N0 ошибок содержащихся в программе перед началом тестирования (следует из метода максимального правдоподобия) можно определить как:
.
Простая экспоненциальная модель
В отличие от модели Джелинского–Моранды R(t) const [20].
Пусть N(t) – число обнаруженных к моменту времени t ошибок и пусть функция риска пропорциональна числу оставшихся к моменту t в программе ошибок: R(t) = K(N(0) – N(t)).
Продифференцируем обе части этого уравнения по времени:
.
Учитывая, что dN(t)/dt есть R(t) (число ошибок, обнаруженных в единицу времени), получим дифференциальное уравнение:
с начальными условиями N(0) = 0, R(0) = KN0.
Решением этого уравнения является функция:
R(t) = KN0exp(–Kt).(А.11)
Для K и N0 получают следующие оценки (с применением МНК) для первых n ошибок:
,
,
где
.
Используя (А.11) можно определить время необходимое для снижения интенсивности появления ошибок с R1(t) до R2(t):
.
Дискретная модель Шика–Уолвертона
Эта модель рассмотрена в работах [12, 20, 21]. Применяется при следующих допущениях:
предполагается, что частота проявления ошибок (интенсивность отказов) линейно зависит от времени испытаний ti между моментами обнаружения последовательных i–й и (i–1)–й ошибок;
появление ошибок равновероятно и независимо;
ошибки корректируются без введения новых.
Тогда:
,
где k – коэффициент пропорциональности, обеспечивающий равенство единице площади под кривой вероятности обнаружения ошибок.
В этом случае для оценки вероятности безотказной работы получается выражение, соответствующее распределению Релея:
,
где P(ti) = P(Tti).
Отсюда плотность распределения времени наработки на отказ:
.
Использовав функцию максимального правдоподобия, получим оценку для N0 и K:
,
.