Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Надежность и диагностика компонентов инфокоммуникационных и информационно-управляющих систем.-1

.pdf
Скачиваний:
1
Добавлен:
20.11.2023
Размер:
3.78 Mб
Скачать

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

λ(t)

NK

K

 

t

Рис. 3.6. Предполагаемая интенсивность отказов

Первое существенное предположение состоит в том, что λ(t) постоянно до обнаружения и исправления ошибки, после чего λ(t) опять становится константой, но уже с другим, меньшим, значением. Это означает, что λ(t) пропорционально числу оставшихся ошибок. Второе предположение состоит в том, что λ(t) прямо пропорционально числу оставшихся ошибок, т.е.

λ(t) = – K(N i),

(3.1)

где N – неизвестное первоначальное число ошибок; i – число обнаруженных ошибок; K – некоторая неизвестная константа. Каждый раз, когда ошибка обнаруживается (модель предполагает, что задержка между обнаружением ошибки и ее исправлением отсутствует), λ(t) уменьшается на некоторую величину K. На оси времени может быть представлено календарное время или время работы программы (последнее может быть масштабировано с учетом интенсивности использования программы).

251

Параметры N и K можно оценить, если некоторое количество ошибок уже обнаружено (например, если фаза тестирования уже частично пройдена). Предположим, что обнаружено п ошибок, а х:[1], х[2], ..., х[n] – интервалы времени между этими ошибками. В предположении, что λ(t) постоянно между ошибками, плотность вероятности для x[i]

p(x[i]) = K (N i)eK (N i)x[i] .

(3.2)

Полагая Т равным сумме х-ов и используя функцию максимального правдоподобия для этого уравнения, получаем второе уравнение:

n

1

 

 

 

n

 

 

 

 

= KT.

(3.3)

 

 

 

 

N i

 

1

n

i=1

 

N

x[i] i

 

 

 

 

 

t

 

 

 

 

 

 

i=1

 

 

 

 

 

 

 

 

 

K и N в этих уравнениях – приближения для рассмотренных выше K и N. Получилось два уравнения с двумя неизвестными N и K. Зная, что обнаружено п ошибок с интервалами x[i] между ними, эти уравнения можно решить относительно N и K с помощью простой программы численного анализа. Значение N дает основной результат – оценку полного числа ошибок. Знание параметра K позволяет использовать уравнения для предсказания времени до появления

(n+1)-й ошибки, (n+2)-й и т.д.

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

Чтобы очертить границы применимости этой модели, требуется понимать лежащие в ее основе допущения (упрощения).

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

252

исключением исправления ошибок). Второе допущение – при всех исправлениях найденные ошибки устраняются, и новых ошибок не вносится.

Третье, основное, допущение – это то, что функция λ(t) носит одинаковый характер для всех программ. Тем самым предполагается, что каждая ошибка уменьшает λ(t) на постоянную величину K – на практике это, вероятно, нереально, однако, по-видимому, с такого предположения вполне разумно начать. Хотя желание выразить надежность программного обеспечения некоторой функцией времени вполне разумно, следует понимать, что в действительности она от времени не зависит. Надежность программного обеспечения является функцией числа ошибок, их серьезности и их расположения, а также того, как система используется.

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

Отметим, наконец, что описанная выше модель кажется чересчур оптимистичной. Например, при п = 10 (десять обнаруженных ошибок) с интервалами между отказами (в минутах)

9, 17, 21, 54, 32, 78, 82, 33, 57, 82

модель предсказывает, что осталось 3,3 ошибки (т.е. изначально в программе было N = 13,3 ошибки). При этом интервалы времени между 10, 11, 12 и 13 ошибками оцениваются в 135, 245 и 1265 минут.

3.4.2. Другие вероятностные модели

Кроме обсуждавшейся в предыдущем разделе основной модели было построено несколько других. Предлагалась байесова модель, учитывающая возможность того, что λ(t) может не уменьшаться при каждом исправлении ошибки из-за возможного внесения при этом новых ошибок [3]. В [3] отказываются от предположения, что исправления выполняются сразу после обнаружения, и предлагается

253

модель, в которой распределение исправлений пропорционально распределению обнаружений ошибок, но отстает во времени. Было предложено несколько моделей на основе марковского процесса, состояния которого изменяются при всяком обнаружении или исправлении ошибки, а вероятности переходов представлены частотами обнаружения и исправления ошибок [3]. Более общий подход был предложен в [3]. В этих работах был выполнен статистический анализ данных об ошибках в 19 программах, при этом было обнаружено, что эти данные не соответствовали какому-либо единственному распределению вероятностей. Анализ проверки дисперсии среднего времени между обнаружениями ошибки одной программы в семи различных условиях показал, что средние значения были не одинаковы, из чего следует, что среда (т.е. условия, в которых программа используется) – более существенный фактор, чем число оставшихся ошибок. Это привело к выводу, что модель надежности должна быть своей для каждой программы и конкретных условий ее использования. Для этого нужно собрать некоторые данные об ошибках, выработать на основе данных о частоте ошибок гипотезы о функции надежности, оценить параметры модели и выполнить тесты, показывающие, насколько эта модель подходит.

3.4.3. Статистическая модель Миллса

Модель совершенно другого типа разработал Миллс [3]. В ней не используется никаких предположений о поведении интенсивности отказов λ(t), эта модель строится на твердом статистическом фундаменте. Сначала программа «засоряется» некоторым количеством известных ошибок. Эти ошибки вносятся в программу случайным образом, а затем делается предположение, что для исходных и внесенных в программу ошибок вероятность обнаружения при последующем тестировании одинакова и зависит только от их количества. Тестируя программу в течение некоторого времени и сравнивая количество обнаруженных исходных и внесенных в программу ошибок, можно оценить N – первоначальное число ошибок в программе.

254

Предположим, что в программу было внесено s ошибок, после чего решено начать тестирование. Пусть при тестировании обнаружено n+v ошибок, причем п – число найденных исходных ошибок, a v – число найденных внесенных ошибок. Тогда оценка для N по методу максимального правдоподобия будет следующей:

N = sn .

(3.4)

ν

 

Например, если в программу внесено 20 ошибок и к некоторому моменту тестирования обнаружено 15 исходных и 5 внесенных ошибок, значение N можно оценить в 60. В действительности N можно оценивать после обнаружения каждой ошибки; Миллс предлагает во время всего периода тестирования отмечать на графике число найденных ошибок и текущие оценки для N.

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

1

 

 

при

n > k,

 

С =

s

при

n k.

(3.5)

 

 

 

 

 

 

 

 

 

s +k +1

 

 

 

Величина С является мерой доверия к модели; это вероятность того, что число исходных ошибок будет не больше k. Например, если мы утверждаем, что в программе нет ошибок (k = 0), и, внеся в программу 4 ошибки, все их обнаруживаем, не встретив ни одной исходной ошибки, то С = 0,80. Чтобы достичь уровня 95 %, нам надо было бы внести в программу 19 ошибок. Если мы утверждаем, что в программе не более трех исходных ошибок, и, внеся шесть ошибок, обнаруживаем их все и не более трех исходных, уровень значимости равен 60 %. Формула для С имеет под собой прочные статистические основания; выведена она Миллсом [3].

255

Эти две формулы для N и С образуют полезную модель ошибок; первая предсказывает число ошибок, а вторая может использоваться для установления доверительного уровня прогноза. Слабость этой формулы в том, что С нельзя предсказать до тех пор, пока не будут обнаружены все внесенные ошибки (а это, конечно, может не произойти до самого конца этапа тестирования). Чтобы справиться с этой трудностью, можно модифицировать формулу для С так, чтобы С можно было оценить после того, как найдено j внесенных ошибок (j s) [14]:

1

 

 

 

 

s

 

 

C =

 

j 1

 

 

 

s

+ k +1

 

 

k + j

 

 

 

 

 

 

при n > k,

(3.6)

при n k.

В предыдущем примере, где k = 3, a s = 6, если найдены 5 из 6 внесенных ошибок, С опускается с 60 до 33 %. Еще один график, который полезно строить во время тестирования, – текущее значение верхней границы k для некоторого фиксированного доверительного уровня, например 90 %.

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

Процесс внесения ошибок в настоящее время является самым слабым местом модели, поскольку предполагается, что для исходных и внесенных ошибок вероятность обнаружения одинакова (но неизвестна). Из этого следует, что внесенные ошибки должны быть «типичными» образцами ошибок, но мы еще недостаточно хорошо понимаем программирование, чтобы сказать, какими именно должны

256

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

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

3.4.4.Простые интуитивные модели

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

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

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

чим через N1 и N2 число ошибок, обнаруженных каждой из групп соответственно, а через N12 – число ошибок, обнаруженных дважды (т.е. обеими группами). Это отношение изображено на рис. 3.7.

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

групп: E1=N1/N, E2=N2/N. Предполагая, что возможность обнаружения для всех ошибок одинакова (что справедливо далеко не для всех программ), мы можем рассматривать каждое под множество пространства N как аппроксимацию всего пространства. Если первая

257

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

E1 = (N1/N) = (N12/N2).

Выполняя подстановку для N2, получаем

E1=N12/(E2·N)

и

N =

N12

 

.

(3.7)

E E

2

 

 

 

 

1

 

 

N12 известно, а Е1 и Е2 можно оценить как N12/N2 и N12/N1 соответственно, откуда мы получаем приближение для N.

N1 N12 N2

N

Рис. 3.7. Множества ошибок, обнаруженных на независимых тестах

Например, предположим, что две группы нашли по 20 и 30 ошибок соответственно, и, сравнивая их, мы замечаем, что восемь ошибок из них – общие. Имеем E1 = 0,27, E2 = 0,4, что дает, оценку N = 74 и примерно 32 необнаруженные ошибки (74 – 20 – 30 + 8).

Второй метод (вероятно, самый простой) – метод накопления статистики. Он строит оценки, основываясь на исторических данных, в частности на среднем числе ошибок, приходящемся на один опера-

258

тор в предыдущих проектах. В литературе сведения о частоте ошибок программистов довольно немногочисленны, но на основании имеющихся данных представляется, что в среднем по «отрасли» на каждую тысячу операторов программы после автономного тестирования остается примерно 10 ошибок. Таким образом, если нет более точных данных, можно предположить, что в программе из 32 000 операторов после автономного тестирования еще остается 320 ошибок. Интенсивность отказов из-за одной ошибки при непрерывном использовании программы составляет в среднем 10–4 1/ч [2].

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

Из-за неопределенностей во всех обсуждавшихся моделях пока самый разумный подход – воспользоваться несколькими моделями сразу и объединить их результаты. Если имеется возможность создать имитационную модель процесса, ее тоже следует использовать для уточнения результатов.

3.4.5. Объединение показателей надежности

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

В данном учебном пособии мы будем поступать следующим образом. Надежность ПО зависит как собственно от надежности программы, так и от надежности носителя программы, например, ОЗУ или ПЗУ. Надежность носителя учитывается при расчете аппаратной части.

259

В качестве примера рассмотрим типовой передающий полукомплект системы телемеханики (тракт телеизмерений – ТИ), структура которого приведена на рис. 3.8.

Датчик 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Датчик 2

 

 

 

 

 

 

 

 

 

 

 

Подсистема

 

Подсистема

 

 

 

 

 

 

 

 

 

 

 

 

сбора

 

передачи

 

 

 

 

 

 

 

 

 

 

 

информации

 

информации

 

 

 

 

 

 

 

 

Датчик N

Рис. 3.8. Структурная схема передающего полукомплекта системы телемеханики

Для расчета воспользуемся методикой, приведенной в подразд. 2.3.2 и подразд. 2.3.5. Система состоит из датчиков (N = 10), подсистемы сбора информации (ПСИ) и подсистемы передачи информации (ППИ). Никакой избыточности с точки зрения надежности (резервирования, встроенных схем контроля) в системе нет.

Предположим, что датчики не интеллектуальные, т.е. не содержат встроенных программных средств. Пусть датчики однотипные и имеют одинаковые интенсивности отказов λд = 4,5·10–5 1/ч и интенсивности восстановления µд = 2 1/ч.

ПСИ и ППИ реализованы с использованием промышленных контроллеров, т.е. наряду с аппаратной частью в них «зашито» программное обеспечение. Надежность носителей ПО (ОЗУ, ПЗУ и т.д.) учтена при определении надежностных характеристик аппаратной части. Примем, что интенсивность отказов аппаратуры ПСИ λап_пси =

=10–7 1/ч, интенсивность восстановления аппаратуры ПСИ µап пси =

=0,4 1/ч, λап_ппи, интенсивность отказов аппаратуры ППИ λап_ппи =

260