Pull to refresh

Самовосстанавливающиеся системы

Цель этой статьи — дать небольшой обзор современным техникам построения самовосстанавливающихся систем (Self-healing systems). Это маленькая свежая (в активном рисерче) тема в области разработки ПО, направленная на построение более устойчивых систем, что важно когда любой виртуальный баг стоит реальных $.

Здесь я опишу, какие техники существуют и так сказать обозначу последующие посты на эту тему. Серия будет продолжена с вопроса, который вы сами же можете и поднять в комментах.

Понеслась!



Первая часть техник включает в себя таймеры, проверки ввода/вывода, проверки диапазонов. Все просто. Более интересные проверки: проверки условий выполнения (pre/post- conditions), утверждения (assertion). Управление обработкой исключений — важная техника, современные программные языки позволяют сделать здесь многое (в Java у каждого исключения есть тип) — например существует определенный подход при обработке исключений, позволяющий сохранять возможность восстановления системы.

Вторая часть техник позволяет усилить код использованием:
  • обертки (Wrappers)
  • обновление программ (Software Rejuvenation), на уровне приложения, кода ассемблера, либо на уровне «железа»
  • использование многообразия данных
  • т.н. SIHFT (Software Implemented Hardware Fault Tolerance)


К примеру, использование разнообразия данных позволяет составить базу знаний по определенному предмету и обучить алгоритм избегать подозрительных данных. Звучит сложно, но исследователи из MIT разработали фреймворк, который почти со стопроцентной вероятностью позволяет избегать таким образом ошибок переполнения буфера — одной из самых распространенных ошибок безопасности в мире («Automatic Input Rectification», people.csail.mit.edu/rinard/paper/icse12.pdf)

Третья часть техник называется N-версионное программирование, идея заключается в том, чтобы писать несколько версий приложения разными командами программистов, исходя из одной спецификации. Эти версии должны быть наиболее разнообразными, насколько можно: разные языки, компиляторы, компании (разные офисы мультикорпорации), менталитеты (добавить индусов) и пр. Используя разные части алгоритмов и статический анализ, можно построить стабильную программу (некий идеальный конечный автомат), исключив слабые места. Слегка измененным подходом было бы всегда запускать одну из N версий программы, подгружая на лету альтернативные алгоритмы при обнаружении проблемы (например по пойманному исключению).

Есть также и другие подходы, такие например как «генетическое программирование», вдохновленное концепцией эволюции, когда построение более устойчивой программы осуществляется путем управляемых мутаций («Automatically Finding Patches Using Genetic Programming», http://www.cs.virginia.edu/~weimer/p/weimer-icse2009-genprog-preprint.pdf)

Не смотря на то, что большинство техник кажутся не практичными, эти техники на самом деле используются уже сейчас, и активно — в твоей (моей) операционной системе, критичных местах веб-сервисов и многих других местах, включая исправление кривой HTML-разметки браузером.

По всем перечисленным темам, как вы понимаете, публикуются научные статьи в соответствующих журналах (поэтому тем, кому не хочется ждать следующего поста, предлагается пройти сюда). Тематика очень свежая, самая старая статья — за 2005 год.

Список публикаций:
  1. Fault-Tolerant Systems. Israel Koren and C. Mani Krishna. 2007. Fault-Tolerant Systems. Morgan Kaufmann Publishers Inc., San Francisco, CA, USA (Part of the chapter on Software Fault Tolerance)
  2. Data structure repair using goal-directed reasoning. Brian Demsky and Martin Rinard. Data structure repair using goal-directed reasoning. In Proceedings of the 27th international conference on Software engineering (ICSE ’05).
  3. DSDSR: a tool that uses dynamic symbolic execution for data structure repair. Ishtiaque Hussain and Christoph Csallner. DSDSR: a tool that uses dynamic symbolic execution for data structure repair. In Proceedings of the Eighth International Workshop on Dynamic Analysis (WODA ’10).
  4. Automated Fixing of Programs with Contracts. Yi Wei, Yu Pei, Carlo A. Furia, Lucas S. Silva, Stefan Buchholz, Bertrand Meyer, Andreas Zeller. Automated Fixing of Programs with Contracts. In Proceedings of the International Symposium on Software Testing and Analysis 2010 (ISSTA’10)
  5. Automatically patching errors in deployed software. Jeff H. Perkins, Sunghun Kim, Sam Larsen, Saman Amarasinghe, Jonathan Bachrach, Michael Carbin,Carlos Pacheco, Frank Sherwood, Stelios Sidiroglou, Greg Sullivan, Weng-Fai Wong, Yoav Zibin, Michael D. Ernst, and Martin Rinard. 2009. Automatically patching errors in deployed software. In Proceedings of the ACM SIGOPS 22nd symposium on Operating systems principles (SOSP ’09).
  6. Automatic Input Rectification. Fan Long, Vijay Ganesh, Michael Carbin, Stelios Sidiroglou, and Martin Rinard. Automatic Input Rectification. International Conference on Software Engineering (ICSE), 2012.
  7. Automatic workarounds for web applications. Antonio Carzaniga, Alessandra Gorla, Nicol` Perino, and Mauro Pezz`. Automatic workarounds for web applications. In Proceedings of the eighteenth ACM SIGSOFT international symposium on Foundations of software engineering (FSE ’10).
  8. Automated Repair of HTML Generation Errors in PHP Applications using String Constraint Solving. H Samimi, M Schaefer, S Artzi, T Millstein, F Tip, L Hendren. Automated Repair of HTML Generation Errors in PHP Applications using String Constraint Solving. International Conference on SoftwareEngineering (ICSE), 2012.
  9. Automatic Finding Patches Using Genetic Programming. Westley Weimer, ThanVu Nguyen, Claire Le Goues, Stephanie Forrest: Automatically Finding Patches Using Genetic Programming. International Conference on Software Engineering (ICSE) 2009: 364-374
  10. In-field healing of integration problems with COTS components. Herve Chang, Leonardo Mariani, and Mauro Pezz`. 2009. In-field healing of integration problems with COTS components. In Proceedings of the 31st International Conference on Software Engineering (ICSE ’09).
  11. Detecting and escaping infinite loops with jolt. Michael Carbin, Sasa Misailovic, Michael Kling, and Martin C. Rinard. 2011. Detecting and escaping infinite loops with jolt. In Proceedings of the 25th European conference on Object-oriented programming (ECOOP’11), Mira Mezini (Ed.). Springer-Verlag, Berlin, Heidelberg, 609-633.
  12. Microreboot: A technique for cheap recovery. George Candea, Shinichi Kawamoto, Yuichi Fujiki, Greg Friedman, and Armando Fox. Microreboot: A technique for cheap recovery. In Proceedings of the 6th conference on Symposium on Opearting Systems Design & Implementation — Volume 6 (OSDI’04), Vol. 6. USENIX Association, Berkeley, CA, USA.
  13. Rx: treating bugs as allergies — a safe method to survive software failures. Feng Qin, Joseph Tucek, Jagadeesan Sundaresan, and Yuanyuan Zhou. Rx: treating bugs as allergies — a safe method to survive software failures. In Proceedings of the twentieth ACM symposium on Operating systems principles (SOSP ’05).


Итак. Что тебя заинтересовало, %username%?

P.S. Естественно, буду премного благодарен за инвайт на хабр.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.