И. Соммервилл - Инженерия программного обеспечения (1133538), страница 95
Текст из файла (страница 95)
Спецификация требований сама может содержать ошибки или упущения, требования же мо~ут базироваться на неправильных предположениях о системном окружении. И конечно, никогда нельзя утверждать, что система полностью лишена ошибок. В системах, к которым предъявляются высочайшие требования безотказности и работоспо. собности, явно необходима поддержка устойчивости к отказам.
В проблеме безотказности выделяют четыре аспекта. 1. Обнаружение ошибок и сбоев. Система должна обнаруживать "сбойные" состояния, которые могут привести к ее отказу. 2. Локплиепиилейев. Определение той части системы, в которой возниклн сбои. 3. Вошппновпеииесиагжим. После возникновения сбоя система должна вернуться в работоспособное состояние. Этого можно достичь исправлением сбойного состояния (прямое устранение ошибки) или возвращением системы к "безопасному" состоянию (ретроспективное устранение ошибки). 4.
Уст)мнение причин сбоев. Система модифицируется таким образом, чтобы сбои не возобновлялись. Во многих случаях сбои программного обеспечения проявляются кратковременно, поскольку возникают из-за специфической комбинации данных на входе системы. Так как нормальное функционирование системы восстанавливается сразу после устранения сбоя, нет необходимости в немедленном устранении причин сбоев. В этом состоит важное отличие сбоев программного обеспечения от неисправности аппаратных средств, Существует два дополняющих друг друга подхода. которые используются для разработки ПО, устойчивого к сбоям. 1.
Беэояпсное яроерпммировпииа Это такой метод разработки программ, прн котором программисты допускают, что в их программах мо~уг быль необнар)оконные ошиб. ки или противоречия. В процессе изменения программы для проверки состояния системы включаются избыточные коды, чтобы гарантировать, что изменения не- противоречивы. Если противоречия обнаружены, от изменений отказываются или состояние восстанавливается до известного корректного состояния. 2. Откпзоустойчивие системные прхитекту~ы.
Это архитектуры аппаратных и про. граммных средств, обеспечивающие устойчивость к сбоям. Такие архитектуры включают резервирование аппаратных и программных средств и имеют блок анализа сбоев, который обнаруживает и устраняет ошибки.
Этот подход к обеспечению отказоустойчивости рассматривается в разделе 18.3. Безопасное программирование можно испольэовать при разработке любой системы, поскольку средства проверки и восстановления при сбоях следует использовать даже в тех программах, где появление ошибок маловероятно. Однако, прежде чем обсудить этот подход, рассмотрим обработку исключений, как необходимое средство обеспечения устойчивости к сбоям. 18. Разработка критических систем $69 18.2.1. Обработка исключений Исключением (или исключительной ситуацией) называется ситуация, когда во время выполнения программы возникают ошибки или непрсдвидснныс события.
Примерами исключительных ситуаций мотуг быть сбой в электропитании системы, попытка доступа к несуществующим элементам данных, числовые переполнения, исчезновение значащего ратршта и т.д. Исключительные ситуации могут быть вызваны несовершенством про. граммного обеспечения или оборудования. Когда возникает исключительная ситуация, она должна контролироваться и управляться системой. Это можно сделать непосредственно внутри самой программы либо лугом передачи управления механизму обработки исключений. В языках программирования, таких как С, чтобы обнаружить исключительную ситуацию и передать управление программе обработки исключительных ситуаций, используется оператор условного перехода (Е Такому подходу сопутствуют две проблемы. 1.
Искзючсния могут происходить в различных точках программы, и одно и то же исключение может произойти в разных местах. Это означает, что в программе должен быть контроль за болыпим количеством исключительных ситуаций. Зто увеличивает размср программы, усложняст ес и делает более трудной для понимания, что повышает вероятность появления в ней ошибок. 2. Когда исключительная ситуация возникает в последовательности вложенных функций или вызывающих процедур, нс существует простого способа передать ес от одной функции к другой, поскольку управление передается через последовательность процедур. Рассмотрите ситуацию, показанную на рис. 18.2, где функция А вызывает функцию В, которая, в свою очередь, вызывает функцию С.
Если исключительная шттуация произойдет во врсмя выполнения функции С, то это может сделать невозможным выполнение функции В. В этом случае нсобходии немедленный возврат от функции В к функции А с сообщением, что работа функции В завершилась неверно и что произошла исключительная ситуация.
Возврат сообщения сб нсглнмитевшов ситами Последтителывс вызовов йскяюнительнзя ситузция Ркс. И.2. Ипслючивилъялл снят)авил в ясгледовлэмльноапи вложгянмл Ятткттттй Если язык программирования имеет конструкции, поддерживающие обработку исключительных ситуаций, то дополнительные условные операторы для провсрки искнючительных ситуаций нс понадобятся. Для этого язык программирования должен поддсржинать специальный встроенный тип данных (часто называемый Ехсербоп (Исключение)) и 370 тХасть 1т', Критические системы должны быть объявлены различные исключительные ситуации зтого типа. Когда происходит исключительнал ситуация, генерируется сигнал об исключительной ситуации и управление передается обработчику исключений.
Подпрограмма обработчика определяет исключение и применяет соответствующие действия для его обработки. В языках Аба, С++ н )аиа предусмотрены специальные средства обработки исключительных ситуаций. В языке ~ага новые типы исключительных ситуаций можно объявить путем расширения встроенного класса Ехсерйоп. Для сообщения об исключительной сит)ации в языке )ача используется оператор (пгов/ (перемещать). Программа обработки исключительных ситуаций определяется ключевым словом са(сй (захват), за которым следует программный блок, обрабатывающий исключения. Листинг 18.3 иллюстрирует обработку исключений в языке )ача.
Зто часть программного обеспечения для системы инъекций инсулина, описанной в главе 16. Здесь про. граммный блок управляет датчиком, определяющим величину содержания сахара в крови. В листингс 18.3 сначала объявляется класс исключений путем расширения встроенного класса объектов Ехсербоп. Далее приведен код обработки исключительной ситуации. Листинг 18.3. Исключительные ситуации в языке )ача с1азв Яепвог1Раз1игеехсерсзоп ехсепс(в ехсерстоп ( яепзогРаз1игеехсерстоп (ясг1пд швд) ( вирек (швд); А1агш.асгзчаге (швд)г ) //ЯепзогРа1гцгеЕхсергтоп с1авв Яепзог ( Епс геадча1 () с)згомв яепвогРаз1нгеехсерстоп ( сгу < Епс спеча1ие = Оеч(се10.геаб1пседег (); ЕГ (спеЧа1ие < О) С)згом пем яепзогРа11цгеРхсергбоп (" Отказ датчика"); гегцгп СпеЧа1ие; ) сагсп Ыеч1се1ОЕхсергдоп е) ( Сйгои пеи яепвогРа11игеЕхсерСЯоп (" Ошибка датчика"); ) // геабча1 // Яепвог Класс Зепвог (Датчик)обеспечивает лгетод геабЧа)(чтение значения датчика), который содержит в объявлении оператор батову.
Это означает, что исключение ЗепвограНнгеЕхсерйоп (Исключение отказа датчика) можно передать из метода. Ключевое слово (гу (попытка) указывает, что исключение может быть передано в следующий блок программы. Исключение ЗепвограйцгеЕхсербоп передается, если значение. возвращаемое датчиком, меньше нуля, Метод Оеч)сеЮ.геаб)п(ейег передает исключение бек(сеЮЕхсер()оп (исключение ввода. вывода устройства) обработчику, расположенному после ключевого слова са(си Средства обработки исключительных ситуаций в языках программирования можно использовать не только для управления системными сбоями. Они мокнут также применяться для обработки ошибок невыполнения условий, хотя таковые обычно происходят очень редко.
Эта возможность показана в листинге 18.4. Здесь на языке )ага реализовано термо. реле морозильной камеры для пищевых продуктов. Температура может изменяться от -18 ло -40 градусов Цельсия. 18. Разработкакритических систем 371 Листинг 18.4. Исключительные ситуации управления морозильником с1авв Ртеезегеопгто11ет ( зепвог Сеюрзепвот = пен зепвот ()г Пеа1 Сенрпаа1 = пем 01а1 () 11оаг 1геезегтетр = Гежрзепвот.геас)уа1 ()г 11па1 11оаг с)апдегтежр= (11оаг) -18. 0 11па1 1опд соо11пдт1те= (1опд) 200000.0/ РпЫ1с чо1г) тип () Снгонв 1псеггпргедахсергтоп ( ггу ( Ршпр.вн1гс)з1с (Рнер.оп)г с)о ( 11 (1теегегтшпр > Геюрп1а1.вегг1пд ()) 11 (Ршпр.вгагпв == Ршпр.отг) ( Рижр.вм1сс)г1с (Ршпр.оп); т)згеаб.в1еер (соо11пдт1же) ) е1ве 11 (Риюр.вгагпв =- "Ршпр.оп) Ршпр.вн1сс)г1Г (Ршпр.огт) / 11 (1геегегтшпр > г)апдеттенр) с)згон пем Ргеезегтооноснхсерстоп ()г угеегегтетр = сетрзепаот.теаг)ча1 ()г нь11е (стае)г ) //блок сгу сассп (Ргеететтооносехсерсзоп й) ( л1апп.асстчаге() г ) сагсп (1пгеггнргебахсергеоп е) ( 5увгеж.опт.ргтпс1п("Потоковое исключение"); погон пен 1псеггпрсес)Ехсерс1оп()! ) ) // Ртеегетеопгто11ет Заморожснные продукты начинают рззмораживаться, а бактерии становятся активными при температуре выше -)8 градусов.