Модуль III·Статья III·~5 мин чтения

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

Теория надёжности систем

Превратить статью в подкаст

Выберите голоса, формат и длину — AI запишет аудио

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

ПО становится критическим компонентом современных систем — самолёты Boeing 787 имеют ~10 млн строк кода, Tesla Model S — ~100 млн, F-35 — ~25 млн. Надёжность ПО принципиально отличается от аппаратной: ошибки детерминированы (одни и те же входы дают одну и ту же ошибку), не случайны, и ПО не «изнашивается» физически. Системная безопасность (safety) фокусируется на предотвращении катастрофических последствий вне зависимости от типа отказа. Стандарты IEC 61508 (общий), DO-178C (авиация), ISO 26262 (авто), IEC 62304 (медицина) определяют процессы разработки safety-critical ПО.

Особенности надёжности ПО

Принципиальные отличия от железа:

  • Отказы детерминированы: одни входные данные → одна и та же ошибка. «Случайность» отказов ПО — это случайность входных данных и состояний.
  • Нет физического износа: ПО не стареет в аппаратном смысле.
  • Нет «кривой ванны»: после введения в эксплуатацию число дефектов снижается со временем (за счёт исправлений).
  • Дефекты вносятся при разработке: bugs — в код, design flaws — в архитектуру.

Mean Time To Failure (MTTF) для ПО имеет смысл только при стабильном профиле использования. Если паттерны входов меняются — MTTF меняется.

Модели надёжности ПО

NHPP-модели (Non-Homogeneous Poisson Process). Кумулятивное число обнаруженных дефектов N(t) — NHPP с переменной интенсивностью λ(t). При обнаружении и исправлении дефектов λ(t) убывает.

1. Jelinski-Moranda (1972). Изначально N_0 дефектов. Интенсивность отказа в момент t: λ(t) = φ·(N_0 − n(t)), где n(t) — число обнаруженных к t. Каждый исправленный bug снижает λ на φ. Классическая модель, но переоценивает оставшиеся дефекты.

2. Goel-Okumoto (1979). N(t) ~ Poisson(a·(1 − e^{−b·t})). Параметры: a — общее число дефектов, b — скорость обнаружения. Пример: a = 200, b = 0.05 → за первые 50 дней находим ~84% дефектов.

3. Musa-Okumoto (1984). μ(t) = (1/θ)·ln(λ_0·θ·t + 1). Логарифмическая модель — медленное снижение интенсивности.

4. S-shaped Yamada (1984). μ(t) = a·(1 − (1 + b·t)·e^{−b·t}). S-образная кривая обнаружения дефектов: сначала медленный старт (тестировщики осваиваются), затем быстро, затем плато.

Калибровка моделей: методом максимального правдоподобия по данным тестирования (число дефектов в каждом интервале).

Численный пример

Команда тестировала ПО в течение 100 дней; обнаружено 80 дефектов. По данным подобрана Goel-Okumoto: a = 95, b = 0.04. Это означает: всего ~95 дефектов, на 100-й день обнаружено 95·(1 − e^{−4}) = 95·0.9817 = 93.3 (немного завышено относительно фактических 80, нужна доработка модели).

Прогноз на следующие 30 дней: μ(130) − μ(100) = 95·(e^{−4} − e^{−5.2}) = 95·(0.0183 − 0.0055) = 1.22 — ожидаем найти ещё ~1 дефект.

Решение о выпуске: если интенсивность дефектов λ(t) ≤ 0.01/день — релиз. Текущая λ(100) = a·b·e^{−b·100} = 95·0.04·e^{−4} ≈ 0.07/день — рано релизить.

Функциональная безопасность (IEC 61508)

Стандарт безопасности для электронных систем. Определяет 4 уровня SIL (Safety Integrity Level):

SILPFD (low demand)PFH (high demand)Требуемое снижение риска
110⁻² – 10⁻¹10⁻⁶ – 10⁻⁵10–100×
210⁻³ – 10⁻²10⁻⁷ – 10⁻⁶100–1000×
310⁻⁴ – 10⁻³10⁻⁸ – 10⁻⁷1000–10000×
410⁻⁵ – 10⁻⁴10⁻⁹ – 10⁻⁸10000–100000×

PFD = Probability of Failure on Demand (для редко срабатывающих защит). PFH = Probability of dangerous Failure per Hour (для непрерывно работающих).

Архитектуры с резервированием

Обозначения KooN: «K из N должны работать».

1oo1. Один канал. PFD ≈ λ_DU·T_test/2 (DU = dangerous undetected, T_test — интервал proof-test).

1oo2. Два канала, защита срабатывает, если хоть один. Снижает risk failure to act, но повышает spurious trips. PFD ≈ (λ_DU·T_test)²/3.

2oo2. Два канала, защита срабатывает, только если оба. Снижает spurious trips, но повышает PFD. Hardly used safety-critical.

2oo3 (TMR — Triple Modular Redundancy). Три канала, защита срабатывает по большинству. Балансирует. Используется в Boeing 777 fly-by-wire, NASA Space Shuttle.

Common Cause Failure (CCF). Все каналы могут отказать одновременно (одна ошибка ПО, общий энергопровод, температура). Учитывается β-фактором: PFD_total = (1 − β)²·PFD_independent + β·PFD_single. β обычно 1–10%.

HAZOP (Hazard and Operability Study)

Систематический качественный анализ отклонений от проектных параметров. «Guide words» (БОЛЕЕ, МЕНЕЕ, НИКАКОГО, ОБРАТНО, ВМЕСТО) применяются к параметрам (поток, температура, давление, концентрация). Для каждой комбинации:

  • Возможна ли причина?
  • Каковы последствия?
  • Существует ли защита?
  • Что рекомендуется?

Стандарт нефтехимии, фармацевтики, ядерной отрасли.

Численный пример: SIL для защитной системы

Защита реактора от перегрева: 2 датчика температуры + логика 1oo2 (срабатывание при сигнале хотя бы одного). λ_DU каждого датчика = 0.01/год = 1.14·10⁻⁶/час. Интервал proof-test T = 1 год = 8760 часов.

PFD одного канала = λ_DU·T/2 = 1.14·10⁻⁶·8760/2 = 5·10⁻³. 1oo2 (без CCF): PFD = PFD_A · PFD_B = (5·10⁻³)² = 2.5·10⁻⁵ → SIL3. С CCF (β = 0.1): PFD = (1 − 0.1)²·2.5·10⁻⁵ + 0.1·5·10⁻³ = 2.0·10⁻⁵ + 5·10⁻⁴ = 5.2·10⁻⁴ → только SIL2.

Урок: CCF доминирует. Снижение β (через diversity, разные производители) критично.

Для требуемого SIL3 в условиях CCF — нужна архитектура 2oo3 с разнотипными датчиками.

Реальные применения

  • Boeing 737 MAX MCAS катастрофы (2018-2019). Архитектура 1oo1 (один датчик угла атаки) для критичной функции — нарушение принципов IEC 61508. После переработки — 2oo2 с принципом отделения (раз. источник питания, ПО).
  • Tesla Autopilot. ASIL D компоненты (тормоза, рулевое) — TMR. Camera + radar + ultrasonic — sensor fusion для снижения CCF.
  • АЭС (ВВЭР, EPR). 4-х канальные защиты ректора. Diversity: разные принципы (механические + электронные).
  • Therac-25 (1985-1987). Линейный ускоритель медицинской облучательной терапии. Race condition в ПО → передозировка облучения, 6 смертей. Урок: software-only safety без hardware interlock — недопустимо.
  • Ariane 5 Flight 501 (1996). Переполнение 16-битного целого в навигации → потеря ракеты $370M. Reuse кода Ariane 4 без re-validation.

Задание. Защитная система реактора: два независимых датчика температуры + логика 1oo2. PFD каждого датчика 0.01 (с учётом proof-test). (а) Вычислите PFD системы без учёта CCF. К какому SIL это соответствует? (б) С учётом β = 0.1 (CCF) — пересчитайте PFD. Изменился ли SIL? (в) Какую архитектуру (1oo2, 2oo3) использовать для гарантированного SIL3 при β = 0.1? (г) Если стоимость одного датчика €5000, а CCF снижается до β = 0.05 при использовании датчиков двух разных производителей — стоит ли инвестировать в diversity?

§ Акт · что дальше