stringtranslate.com

Надежность (информатика)

В информатике надежность — это способность компьютерной системы справляться с ошибками во время выполнения [1] [2] и справляться с ошибочным вводом. [2] Надежность может охватывать многие области информатики, такие как надежное программирование , надежное машинное обучение и надежная сеть безопасности . Формальные методы, такие как тестирование методом нечетких ошибок , необходимы для демонстрации надежности, поскольку этот тип тестирования включает недопустимые или неожиданные входные данные. В качестве альтернативы для проверки надежности можно использовать инъекцию неисправностей . Различные коммерческие продукты выполняют тестирование надежности анализа программного обеспечения. [3]

Введение

В целом, создание надежных систем, охватывающих каждую точку возможного отказа, затруднено из-за огромного количества возможных входов и комбинаций входов. [4] Поскольку все входы и комбинации входов потребуют слишком много времени для тестирования, разработчики не могут полностью перебрать все случаи. Вместо этого разработчик попытается обобщить такие случаи. [5] Например, представьте, что вы вводите некоторые целочисленные значения . Некоторые выбранные входы могут состоять из отрицательного числа, нуля и положительного числа. При использовании этих чисел для тестирования программного обеспечения таким образом разработчик обобщает набор всех действительных чисел в три числа. Это более эффективный и управляемый метод, но более подверженный сбоям. Обобщение тестовых случаев является примером всего лишь одного метода борьбы со сбоями, в частности, сбоями из-за недопустимого ввода данных пользователем. Системы, как правило, также могут выходить из строя по другим причинам, таким как отключение от сети.

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

Вызовы

Программы и программное обеспечение являются инструментами, ориентированными на очень конкретную задачу, и поэтому не являются обобщенными и гибкими. [4] Однако наблюдения в таких системах, как Интернет или биологические системы, демонстрируют адаптацию к окружающей среде. Одним из способов адаптации биологических систем к окружающей среде является использование избыточности . [4] Многие органы избыточны у людей. Почка является одним из таких примеров. Людям обычно нужна только одна почка, но наличие второй почки оставляет место для отказа. Этот же принцип можно применить к программному обеспечению, но есть некоторые проблемы. При применении принципа избыточности к компьютерной науке не рекомендуется слепое добавление кода. Слепое добавление кода вносит больше ошибок, делает систему более сложной и затрудняет ее понимание. [6] Код, который не обеспечивает никакого подкрепления уже существующего кода, нежелателен. Новый код должен вместо этого обладать эквивалентной функциональностью , так что если функция сломана, другой, предоставляющий ту же функцию, может заменить ее, используя ручное или автоматизированное разнообразие программного обеспечения . Для этого новый код должен знать, как и когда приспособиться к точке отказа. [4] Это означает, что в систему нужно добавить больше логики . Но по мере того, как система добавляет больше логики, компонентов и увеличивается в размерах, она становится сложнее. Таким образом, при создании более избыточной системы, система также становится сложнее, и разработчики должны учитывать баланс между избыточностью и сложностью.

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

Районы

Надежное программирование

Надежное программирование — это стиль программирования, который фокусируется на обработке неожиданного завершения и неожиданных действий. [7] Он требует, чтобы код корректно обрабатывал эти завершения и действия, отображая точные и недвусмысленные сообщения об ошибках . Эти сообщения об ошибках позволяют пользователю легче отлаживать программу.

Принципы

Паранойя
При создании программного обеспечения программист предполагает, что пользователи намерены сломать его код. [7] Программист также предполагает, что его собственный написанный код может дать сбой или работать неправильно. [7]
Глупость
Программист предполагает, что пользователи попробуют ввести неверные, фиктивные и неправильно сформированные данные. [7] Как следствие, программист возвращает пользователю однозначное, интуитивно понятное сообщение об ошибке, которое не требует поиска кодов ошибок. Сообщение об ошибке должно быть максимально точным, не вводя пользователя в заблуждение, чтобы проблему можно было легко устранить.
Опасные орудия
Пользователи не должны получать доступ к библиотекам , структурам данных или указателям на структуры данных. [7] Эта информация должна быть скрыта от пользователя, чтобы пользователь случайно не изменил их и не внес ошибку в код. Когда такие интерфейсы построены правильно, пользователи используют их, не находя лазеек для изменения интерфейса. Интерфейс должен быть уже правильно реализован, поэтому пользователю не нужно вносить изменения. Таким образом, пользователь фокусируется исключительно на своем собственном коде.
Этого не может случиться.
Очень часто код модифицируется и может ввести возможность возникновения «невозможного» случая. Поэтому невозможные случаи, таким образом, считаются крайне маловероятными. [7] Разработчик думает о том, как обработать случай, который крайне маловероятен, и реализует обработку соответствующим образом.

Надежное машинное обучение

Надежное машинное обучение обычно относится к надежности алгоритмов машинного обучения. Для того чтобы алгоритм машинного обучения считался надежным, либо ошибка тестирования должна соответствовать ошибке обучения, либо производительность должна быть стабильной после добавления некоторого шума в набор данных. [8] В последнее время, в соответствии с ростом их популярности, наблюдается растущий интерес к надежности нейронных сетей. Это особенно связано с их уязвимостью к неблагоприятным атакам. [9]

Надежная сетевая конструкция

Надежное проектирование сетей — это изучение проектирования сетей в условиях изменчивых или неопределенных требований. [10] В некотором смысле надежность в проектировании сетей широка, как и надежность в проектировании программного обеспечения, из-за огромных возможностей изменений или входных данных.

Надежные алгоритмы

Существуют алгоритмы, допускающие ошибки во входных данных. [11]

Смотрите также

Ссылки

  1. ^ "Подход на основе моделей для тестирования надежности" (PDF) . Dl.ifip.org . Получено 13.11.2016 .
  2. ^ ab 1990. В стандарте IEEE Std 610.12-1990 терминология программной инженерии определяется как «степень, в которой система или компонент могут правильно функционировать при наличии недопустимых входных данных или стрессовых условий окружающей среды».
  3. ^ Бейкер, Джек В.; Шуберт, Маттиас; Фабер, Майкл Х. (2008). «Об оценке надежности» (PDF) . Structural Safety . 30 (3): 253–267. doi :10.1016/j.strusafe.2006.11.004 . Получено 13 ноября 2016 г. .
  4. ^ abcdefg Джеральд Джей Сассман (13 января 2007 г.). "Building Robust Systems an essay" (PDF) . Groups.csail.mit.edu . Получено 13 ноября 2016 г. .
  5. ^ Джозеф, Джоби (21.09.2009). «Важность создания обобщенных тестовых случаев — Клуб тестирования программного обеспечения — Онлайн-сообщество по тестированию программного обеспечения». Клуб тестирования программного обеспечения . Получено 13.11.2016 .
  6. ^ Агенты в сети: надежное программное обеспечение. "Создание надежных систем, эссе" (PDF) . Cse.sc.edu . Получено 13.11.2016 .
  7. ^ abcdef "Надежное программирование". Nob.cs.ucdavis.edu . Получено 13.11.2016 .
  8. ^ Эль Саид Махмуд. «Каково определение надежности алгоритма машинного обучения?» . Получено 13 ноября 2016 г.
  9. ^ Ли, Линьи; Сье, Тао; Ли, Бо (9 сентября 2022 г.). «SoK: Сертифицированная надежность для глубоких нейронных сетей». arXiv : 2009.04131 [cs.LG].
  10. ^ "Надежное проектирование сетей" (PDF) . Math.mit.edu . Получено 2016-11-13 .
  11. ^ Карбин, Майкл; Ринард, Мартин К. (12 июля 2010 г.). "Автоматическое определение критических областей ввода и кода в приложениях" (PDF) . Труды 19-го международного симпозиума по тестированию и анализу программного обеспечения - ISSTA '10 . ACM. стр. 37–48. doi :10.1145/1831708.1831713. ISBN 9781605588230. S2CID  1147058.