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

Надежность и диагностика автоматизированных систем. Курс лекций

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
В сложных объектах могут возникать дефекты, не приводящие к
ν−λµ+λγ
2
0
γ
0
ν
отказу. В этом случае такой объект может быть описан графом
(
рис. 4.13). Здесь состояний четыре:
1
λ
0
4
ν
λ
µ
3
λ
λ
0
Рис 4. 13. Граф работы сложного объекта:
интенсивность восстановления; λ
µ –
γ
– интенсивность восстановления при отказах объекта;
0
интенсивность возникновения эффектов, не приводящих к отказу;
λ –
ν –
интенсивность проведения диагностирования
1. В объекте отсутствуют дефекты.
2.
В объекте появились дефекты, не приводящие к отказу.
3. В специальном контрольном режиме диагностики возникшие
дефекты устраняются.
4.
Отказ объекта, идет его восстановление.
В этом случае коэффициент готовности определяется по формуле
– интенсивность отказов;
0
))((
=K
г
000
0000
,
))()((
ν+λ+λν+µ+λλ+γ
где µ – интенсивность восстановления;
λ
– интенсивность отказов;
0
γ
– интенсивность восстановления при отказе объекта;
0
λ –
интенсивность возникновения дефектов, не приводящих к от-
казу;
интенсивность проведения диагностики.
ν –
81
При λ
[
]
<< λ, т.е. в случае когда отказы возникают значительно
0
реже, чем дефекты, не приводящие к отказу,
K .
г
2
λ+νµλ++νµν= )/1()/1(
Задачи при проектировании систем диагностирования можно сформулировать следующим образом.
1.
Определить значение выбранного критерия при заданных пока­зателях, характеризующих свойства объекта диагностики, техниче­ских средств диагностики и процесса диагностирования и использо­вания объекта.
2.
Для заданного объекта и средств диагностики в предположе­нии, что использование объекта диагностирования строго регламен­тировано, определить значение показателей, характеризующих про­цесс диагностирования, которые обеспечивает заданный показатель организации объекта диагностирования.
3.
Для заданного объекта и технических средств диагностики наи-
лучшим образом (в определенном смысле) организовать процесс.
Для широкого класса технологических объектов целесообразно оценивать абсолютное приращение эффективности объекта, дости­гаемое диагностированием:
∆E(t) = E
(t) – E(t),
д
где E(t) – эффективность объекта при отсутствии диагностирования;
E
(t) – то же при наличии диагностирования.
д
Часто можно использовать для оценки диагностирования прира­щение надежности объекта диагностирования, т.е.
∆E
где R
(t) и R(t) – вероятность безотказной работы с учетом и без уче-
д
(t) = Rд(t) – R(t)
1
та диагностирования.
Возможность такой оценки определяется тем, что эффективность сложных систем определяется величиной R(t):
E(t) = E
(t)R(t), где E0(t) – эффективность объекта с идеальной на-
0
дежностью, R(t) – вероятность безотказной работы объекта.
Итак, вкратце разобраны основные вопросы организации диагно­стирования технологических систем. Более конкретно указанную методику можно рассмотреть лишь при глубоком знании объекта диагностирования, статистических данных о возникновении дефек­тов, приводящих и не приводящих к отказу объекта, а также эконо­мических данных об объекте, технических средствах диагностирова­ния и потерях, вызванных появлением дефектов и отказов.
82
5. НАДЕЖНОСТЬ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
5.1. Определение надежности программного обеспечения
В
настоящее время одной из самых серьезных проблем использо-
вания ЭВМ является программное обеспечение в отношении его тес­тирования после создания для выявления и устранения возможных ошибок. Но и после тестирования некоторые ошибки остаются необ­наруженными.
Что такое ошибки в программном обеспечении? Существует не­сколько определений этого понятия, наиболее разумное из которых дано в [10]. В программном обеспечении имеется ошибка, если оно не выполняет того, что пользователю разумно ожидать от него. Отказ программного обеспечения – это появление в нем ошибок. Слово
«разумное» вводится, чтобы исключить непредусмотренные про-
граммным обеспечением ситуации.
Второй термин, требующий определения, – это надежность про­граммного обеспечения. Различные ошибки далеко не одинаковы по их последствиям, поэтому надежность должна быть определена как функция части ошибок, а также оценена их серьезность для пользо­вателя. Определим надежность следующим образом: «Надежность программного обеспечения есть вероятность его работы без отказа в течение определенного периода времени, рассчитанная с учетом стоимости для пользователя каждого отказа». Иногда даже крупный просчет в проектировании может быть несуществен для пользовате­ля, а самые незначительные ошибки могут приводить к катастрофи­ческим последствиям.
Если рассматривать понятия надежности в отсутствие данных о том, к чему может привести ошибка, то целесообразно под надежно­стью понимать некоторую количественную меру отсутствия в про­грамме ошибок.
Имеется существенное различие в надежности аппаратуры и про­граммного обеспечения. Как отмечалось в п. 2, кривая интенсивно­сти отказов аппаратуры во времени имеет U-образную форму (при­работка – нормальная эксплуатация – износ), а интенсивность отка­зов программного обеспечения падает со временем вследствие уст­ранения ошибок (если программы не изнашиваются).
83
5.2. Тестирование программного обеспечения (ПО)
написании больших сложных программ неизбежно допуска-
При
ются ошибки независимо от того, насколько опытен программист. В сложных программах обычно бывает много ветвлений, и проверить правильность программы до внедрения ее в эксплуатацию при всех возможных значениях входных данных бывает крайне затруднительно или даже практически невозможно. Обеспечение надежности ПО – задача более сложная, чем обеспечение надежности технических средств. Ошибки в ПО обнаруживаются и исправляются как до начала его эксплуатации, так и во время. Разработка ПО включает в себя про­ектирование как самой программы, так и тестов для ее проверки. Тес­тирование – это процесс исполнения программы с целью обнаружения ошибок. Тестирование – процесс деструктивный, обратный созида­тельному процессу создания ПО (а большинство людей склонно к со­зидательному процессу). Следует также отметить, что к процессу тес­тирования нецелесообразно привлекать автора программы, так как
«свои» ошибки заметить значительно сложнее, чем «чужие».
В литературе по программированию можно встретить следующие
рекомендации для разработчиков программного обеспечения:
1. Программа должна быть легко читаемой людьми (а не ЭВМ).
2.
Следует использовать осмысленные имена переменных и ста-
раться избегать сходных имен.
3. Цифры в идентификаторах следует помещать только в конце и
избегать схожих по написанию цифр (О и 0, 1 и I, 2 и Z, 5 и S и т.п.).
4. Не использовать в идентификаторах ключевые слова.
5.
Избегать по возможности промежуточных переменных.
6.
Употреблять при написании выражений скобки даже в тех слу-
чаях, когда без них можно обойтись: например, не а/bc, a a/(bc).
7.
Не изменять значение параметра цикла в теле цикла.
8.
Не использовать метки, на которые нет ссылок.
9. Не писать «своих» программ вместо библиотечных.
10.
Не следует жертвовать легкостью чтения ради эффективности
программы.
11. Следует избегать различных «трюков» с целью упрощения
программ.
12. Не следует пренебрегать комментариями для переменных и
констант.
13.
Не следует использовать одно и то же имя переменной для
решения более чем одной задачи.
84
14. Проявлять осторожность с действиями над целыми (например,
I = 2*(I/2),
так как результат будет зависеть от четности или нечетно-
сти I).
15.
При сравнении чисел с плавающей запятой необходимо пом-
нить, что точность представления числа в ЭВМ конечна.
16. Следует избегать операторов типа GO TO, так как они ухуд-
шают осмысление программы.
Этот список рекомендаций может быть значительно расширен.
Язык программирования существенно влияет на надежность. Чем
«
выше» уровень языка, тем меньше можно сделать ошибок. Хотя программирование на Ассемблере позволяет сделать самые эконо­мичные программы (с точки зрения объема памяти и быстроты ис­полнения), при проектировании на Ассемблере программист тратит большую часть времени не на решение задачи, а на «возню» с осо­бенностями данной ЭВМ. Программы на языке высокого уровня лег­че понимать и видоизменять, количество операторов значительно меньше, они дешевле при написании программ.
Языки высокого уровня лучше, чем Ассемблер работают со слож­ными структурами данных, а современные компьютеры создают вы­сокие по эффективности объектные программы. В результате эффек­тивность достигается разумным выбором алгоритмов и структур дан­ных, а не за счет микроэффективности при использовании Ассембле­ра. В больших и сложных программах только небольшой процент операторов целесообразно писать на машинном языке. В настоящее время использование Ассемблера становится практически нецелесо­образным за исключением случаев создания компиляторов и в ряде других случаев.
В литературе по тестированию можно встретить несколько близ­ких по значению терминов.
1. Тестирование – это процесс выполнения программы с целью
нахождения ошибки.
2.
Контроль – попытка найти ошибку, выполняя программу в тес-
товой или моделируемой среде.
3.
Испытание – попытка найти ошибку, выполняя программу в ре-
альных эксплуатационных условиях.
4.
Отладка – установление точной природы ошибки и последую-
щее ее устранение.
Процесс тестирования упрощается, если программа разбита на модули. Рассмотрим, например, следующую программу:
85
X=(A+B)(C–D).
Данные A, B, C, D могут быть представлены в любом из четырех обычно используемых кодов. Фактически вычисления выполняются в «арифметике с плавающей запятой». Если программу тестировать как единое целое, возможное число комбинаций данных, т. е. мини­мальное число проверяемых случаев для «полной» проверки, было
4
бы 4
=256.
Если программу структурировать и разбить на три независимых модуля:
X
X
X
то как (1), так и (2) включают 2
=A+B; (1)
1
=C–D; (2)
2
3=X1X2
, (3)
2
= 4 комбинаций, а для (3) возможна
только одна комбинация данных. Таким образом, если сегменты про­верены, то после их объединения общее число различных случаев составит 16+16+1=33, что <<256 вариантов для неструктурированной программы, т.е. на тестирование будет затрачено значительно мень­ше времени.
Существуют два типа ошибок:
1) синтаксические (нарушение правил языка), которые легко уст-
раняются при трансляции;
2)
логические (семантические или смысловые), которые приводят к ошибкам вычислений. Их устранить можно только при тестирова­нии с тщательно подобранными проверочными данными, для кото­рых известны итоговые результаты, полученные при помощи либо ручного вычисления, либо иным проверенным способом.
При тестировании больших программ практически невозможно проверить все вероятные типы комбинаций данных и путей. Тести­рование таких программ может показать только наличие ошибок, но никогда не может служить доказательством их отсутствия.
Существуют два подхода к тестированию.
1.
Тестирование программы как «черного ящика», т.е. тестирова­ние с управлением по входу-выходу (выход, как указывалось выше, должен быть известен). Для входов используются все возможные для данной программы наборы. Практически быть уверенным, что в про­грамме нет ошибок при большом числе комбинаций входных дан­ных, нельзя.
86
2. Тестирование программы как «белого ящика», т.е. тестирование
логики, внутренней структуры программы. Если в программе много разветвлений, то исчерпывающее тестирование также практически невозможно.
Таким образом, оба пути не дают 100 %-ной гарантии. Возможно,
что лучшим способом является сочетание этих двух подходов.
Хорошая программа должна:
•
обеспечивать легкость тестирования;
• занимать возможно минимальный объем памяти;
•
быстро работать;
•
обеспечивать легкость внесения изменений;
• быть ясной для чтения человеком.
Для создания легко тестируемых программ и простоты нахожде­ния и исправления ошибок некоторые авторы считают целесообраз­ным пользоваться методами структурного программирования [11]. При использовании этого метода сложное программное обеспечение разрабатывается по принципу «сверху вниз», причем до создания программ более низкого уровня производится тестирование более высокого уровня. Так как в программы более высокого уровня по­ступают данные от программ более низкого уровня, используется метод «заглушки», при котором имитируется подача сигнала от про­грамм более низкого уровня.
5.3. Математические модели надежности программного обеспечения
Самым
важным критерием надежности является число ошибок,
оставшихся после тестирования программы (с учетом их важности для решаемой задачи).
Возможны также критерии, используемые в теории надежности, такие как вероятность того, что программа будет выполняться в те­чение данного интервала времени, прежде чем обнаружится ошибка заданной степени серьезности, или среднее время между отказами программы, вызванными наличием в ней ошибок.
По аналогии с определениями надежности технических средств можно ввести вероятность того, что в программе в интервале 0…t не будет обнаружено ни одной ошибки R(t). Тогда величина F(t)= 1–R(t)
– есть вероятность, что ошибка в этом интервале появится.
Можно ввести понятие функции риска Z(t), т.е. условную вероят­ность, что ошибка появится в интервале t…t+∆t, при условии, что в
87
интервале 0…t ошибки не было. Так как R(0) = 1, то в соответствии с
табл. 2.1
t
⎛ ⎜
−=
∫
⎜
0
⎝
⎞ ⎟
dttZtR
)(exp)( . Ясно, что Z(t) является аналогом λ(t)
⎟ ⎠
при рассмотрении отказов технических средств. По мере устранения ошибок будет наблюдаться рост надежности ПО. Напомним, что в аппаратной надежности обычно считается λ(t) = const.
Можно также предположить, что Z(t) пропорционально числу ос­тавшихся ошибок, т.е. Z(t) = K(N–i), где N – неизвестное число пер­воначальных ошибок ПО; i – число обнаруженных ошибок; К – неко­торая константа.
Модель надежности другого типа была предложена Майерсом [9]. Модель строится на статистическом материале. Перед тестированием программа случайным образом засоряется некоторым количеством известных ошибок. Далее делается предположение, что вероятность обнаружения любых (умышленно внесенных и незамеченных) оши­бок при тестировании одинакова и зависит только от их количества.
Тестируя и отсортировывая внесенные и незамеченные ранее ошибки, можно оценить первоначальное число ошибок. Пусть N – первоначальное число ошибок, а s – число внесенных ошибок и пусть при тестировании обнаружено n и v ошибок, где n – число соб­ственных, а v – число внесенных ошибок. Тогда оценка для N по ме-
sn
тоду максимума правдоподобия будет
N
= . Например, если
v
⋅
s = 20, n = 15, v = 5,
то 60
1520
=N .
=
5
Другая часть модели – проверка гипотезы о числе собственных ошибок n. Примем, что в программе не более k ошибок, внесем еще s ошибок и произведем тестирование, пока не обнаружим все s вне­сенных ошибок. При этом будет выявлено n собственных ошибок.
при1
>
1
при
kn
.
≤
kn
Уровень значимости:
⎧ ⎪
=
C
s
⎨ ⎪
ks
++
⎩
Величина С – это мера доверия, т.е. вероятность того, что модель будет правильно отклонять любые ложные предположения.
Если k = 0, n = 4, все внесенные ошибки обнаружены и ни одной исходной не встречено, то С = 0,8. Чтобы достичь уровня 95 %, надо
88
внести 19 ошибок. Напомним, что тестирование длилось до тех пор, пока все внесенные ошибки не были обнаружены.
Процесс внесения ошибок в этой модели надежности является, по-видимому, самым слабым местом, так как предполагается, что вероятность обнаружения внесенных и собственных ошибок про­граммы одинакова. Из этого следует, что вносить надо «типичные» для данной программы ошибки. Для оценки числа ошибок N в про­грамме может быть предложен следующий метод. Тестирование про­граммы производится двумя независимыми группами, использую­щими несовпадающие наборы тестов.
Пусть первая группа обнаружила N
N
обозначим чмсло ошибок, обнаруженных обеими группами. При-
12
ошибок, а вторая N2. Через
1
мем за показатель эффективности тестирования отношение числа обнаруженных ошибок к общему их числу, т.е.
E
= и
1
N
1
N
E
2
N
2
= .
N
Будем считать, что вероятность обнаружения любых ошибок одина­ково, а следовательно, каждое подмножество набора ошибок N ап-
проксимацией всего множества. Отсюда следует, что
N
Аналогично
N
12
=
N
. Например, если одна группа тестирующих нашла 10 оши-
EE
21
E
12
. Из приведенных равенств следует, что
=
2
N
1
бок, а вторая 20, и из них 5 ошибок общие, то E
Е
=5:10=0,5 и следовательно, N =
2
5
= 40. Такими оценками
5,025,0
⋅
N
E
1
N
=5:20=0,25 и
1
121
==
N
2
N
следует пользоваться осторожно, поскольку новые методы програм­мирования (например, структурное) дают значительно меньшее чис­ло ошибок. Следовательно, приведенные выше методы дают песси­мистическую оценку числа ошибок.
Существуют и другие модели надежности программного обеспе­чения, в частности с использованием понятия «сложности» програм­мы, поскольку между сложностью и надежностью программы суще­ствует тесная связь. Для знакомства с этими методами можно реко­мендовать работу Т. Тейера и др. [10].
В качестве упражнения на тестирование программного обеспече­ния предлагается составить программу и произвести тестирование ее для следующей задачи. При помощи генератора целых случайных чи-
89
.
сел с равномерным законом распределения (от 0 до 99) сгенерировать три числа. Составить и протестировать программу, определяющую:
1)
могут ли эти числа быть сторонами треугольника;
2) если да, то определить, является ли треугольник равносторон-
ним, равнобедренным, разносторонним и не является ли полученный треугольник прямоугольным.
При тестировании следует помнить, что стороны треугольника
могут быть только целыми числами.
Если эта задача окажется легкой, то составьте программу и тест
для решения квадратного уравнения Аx
2
+Вx+С= 0.
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]