"Валерий Аджиев "Мифы о безопасном ПО: уроки знаменитых катастроф" [V]" - читать интересную книгу автора

лечили от электрошока (он умер через пять месяцев). Позднейшее
моделирование ситуации показало, что пациент получил менее чем за 1 сек.
на участок позвоночника в
1 кв. см. дозу в диапазоне от 16500 до 25000 рад (в то время, как ему
было предписано принять в этом сеансе 180 рад, а всего 6000 рад за шесть с
половиной недель).

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


Особенности ПО как предпосылки для инцидентов

В комплексе не использовалась какая-либо стандартная операционная
система: была разработана специальная мультизадачная ОС реального времени,
для компьютера PDP-11/23 с 32Kбайт и написанная на языке ассемблера.
Специальный планировщик координировал деятельность всех одновременно
исполняющихся процессов. Задачи, запускавшиеся каждые 0.1 сек., разделялись
на "критические", исполнявшиеся первыми, и "некритические". К критическим
отнесены три приоритетных задачи (рис. 1):

* "Servo", ответственная за все операции, связанные с эмиссией
радиационных пучков и доставкой их к месту назначения; * "Housekeeper",
выполнявшая верификацию всех параметров и ответственная за блокировку
работы в случае возникновения нештатной ситуации, а также за сообщения о
таких ситуациях; * "Treat", управлявшая самим процессом лечения, который
был разделен на 8 операционных фаз. В зависимости от значения переменной
Tphase вызывалась одна из восьми подпрограмм, по окончании работы которой
Treat в зависимости от значений нескольких разделяемых с другими
критическими и некритическими задачами переменных, вырабатывала план на
новый цикл.

[Рис. 1] Рис. 1. Взаимодействие задач и подпрограмм в ПО для Therac-25.

Одна из вызываемых Treat подпрограмм Datent (Data entry) через
разделяемую "флаговую" переменную Data_entry_complete взаимодействует с
"некритической"
задачей Keyboard Handler, которая управляет вводом информации с
клавиатуры, исполняясь параллельно с Treat. Keyboard Handler распознает
момент окончания ввода и сигнализирует об этом, изменяя значение
Data_entry_complete. В свою очередь, Datent проверяет значение этой
переменной. Если оно не изменилось, то значение Tphase остается равным "1",
и на следующем цикле Treat опять запустит Datent; если же значение
Data_entry_complete изменилось, то Datent меняет значение Tphase с "1" на