Использование системы формальной верификации SPIN
в учебном процессе
В. А. Крищенко, к.т.н., доцент кафедры программного обеспечения и информационных технологий МГТУ им. Н. Э. Баумана [email protected], +7 926 2165641
При чтении учебного курса, посвященного протоколам вычислительных сетей и предназначенного для студентов старших курсов, возникла необходимость в формальном описании и проверке наиболее сложной составляющей протоколов -набора правил обмена сообщениями между взаимодействующими сторонами. Обнаружение ошибок в правилах обмена может быть затруднительно без программного средства, позволяющего выполнять их формальную верификацию по заданным критериям.
Для описания процедур обмена сообщениями обычно используются
и т-ч и
диаграммы временной последовательности. В настоящее время для этой цели применяются также диаграммы последовательностей UML, а для описания состояний сторон, участвующих в обмене - диаграммы состояния UML. Такое описание протокола имеет следующие недостатки:
- диаграммы не включают способа формального описания функциональности;
- подобные графические нотации не предполагают наличия средств задания критериев правильности и их формальной проверки.
Системы верификации моделей вычислительных систем также могут быть применены для описания сетевых протоколов. Хотя используемые ими языки описания модели не являются общепринятыми стандартами, подобными UML, они позволяют формально описывать и верифицировать обмен сообщениями. Из подобных средств наиболее широкое распространение в настоящее время получила система SPIN [1, 2], работающая с моделями на языке PROMELA (PROcess MEta LAnguage).
Система SPIN/PROMELA обладает широкими возможностями для построения моделей межпроцессного взаимодействия с конечным числом состояний системы. Она использует известный математический аппарат -расширение недетерминированных конечных автоматов [3]. Распространение системы по лицензии GPL позволяет свободно ее использовать. Система кросс-платформена, поставляется с исходными текстами и имеет умеренные системные требования, что позволяет применять ее в практически любых учебных
классах, причем при работе под Microsoft Windows не требуется инсталляция системы или наличие прав администратора.
SPIN осуществляет как имитацию работы модели, так и построение по модели ее верификатора, представляющего собой программу на ANSI C. Совместно со SPIN можно использовать свободно распространяемую графическую оболочку XSpin, использующую библиотеку Tcl/Tk.
Язык PROMELA позволяет описывать модели как синхронного, так и асинхронного взаимодействий параллельно выполняемых процессов, использующих каналы (обычно FIFO) для обмена сообщениями между собой. Для верификации таких моделей можно использовать различные формы критериев корректности: LTL-формулы [4], утверждения правильности, корректные последовательности операций с каналами обмена сообщениями и другие. В силу этого система SPIN нашла достаточно широкое применение как для практической проверки различных вычислительных систем, так при использовании в учебных целях.
В качестве простейшего применения системы SPIN пример рассмотрим ошибочного протокола с передачей подтверждения, работающего в окружении, не гарантирующем неизменность сообщения при передаче. На рис. 1 приведена модель такого протокола на PROMELA, содержащая условие корректности assert.
mtype = {msg, ack, nak, err} ; /* сообщения протокола */
chan s_r = [1] of {mtype, byte}; chan r_s = [1] of {mtype}; /* каналы обмена */
active proctype sender() {
byte num = 1; mtype some; repeat: do
:: s_r ! msg, num; /* отправка сообщения */ r_s ? some; /* прием ответа */ if
:: (some==ack) -> num++; /* подтверждение приема, следующее сообщение */ :: else -> goto repeat; /* ошибка при приеме, повторить посылку */ fi
od;
}
active proctype receiver() {
byte num, some, prev = 0; mtype last; do
:: s_r ? msg, some;
if /* возможны два случая */
:: last=err; /* имитация ошибки в сообщении */ :: num=some; /* прием сообщения */
assert((num==prev+1)||(prev==255 && num==0)); /* условие корректности */ prev = num; last=ack;
fi; if
:: r_s ! last;
:: r_s ! err; /* имитация ошибки при передачи ответа */ fi;
od;
}_
Рис. 1. Некорректный протокол
Проблема приведенной модели заключается в повторе сообщения передатчиком в любой ситуации, кроме неискаженного подтверждения приема. При верификации такой модели SPIN продемонстрирует кратчайший путь, приводящий к нарушению заданного в модели критерия корректности. Можно предложить измененный вариант протокола (рис. 2). В ходе верификации SPIN позволяет формально проверить выполнение критерия корректности приведенной модели при любых возможных ее прогонах.
mtype = {msg, ack, nak, err} ; /* сообщения протокола */
chan s_r = [1] of {mtype, byte}; chan r_s = [1] of {mtype}; /* каналы обмена */
active proctype sender() {
byte num = 1; repeat_s: do
:: s_r ! msg, num -> repeat_r: if
:: r_s ? ack -> num++; /* подтверждение приема, следующее сообщение */ :: r_s ? nak -> goto repeat_s; /* повторить посылку */ :: r_s ? err -> goto repeat_r; /* ждать повторного подтверждения */ fi od;
}
active proctype receiver() {
byte num, prev = 0; mtype last; do
:: s_r ? msg, _ -> last = nak; goto send; /*имитация ошибки при приеме*/ :: s_r ? msg, num -> /* прием сообщения */ /* условие корректности протокола: */ assert((num==prev+1) || (prev==255 && num==0)); prev = num; last = ack; goto send; :: timeout -> /* посылающая сторона ждет повтора */ send: if
:: r_s ! last; /* перепосылка подтверждения */ :: r_s ! err; /* имитация ошибки */ fi
od
J_
Рис. 2. Модификация протокола
Язык PROMELA обладает достаточной функциональностью для создания на нем, например, модели протокола маршрутизации типа "вектор-состояние" для заданной топологи сети. Подобная модель позволяет продемонстрировать проблемы подобных протоколов и такие методы их решения, как правило расщепленного горизонта, отложенные изменения и другие. Возможности системы
SPIN/PROMELA позволяют использовать ее в рамках курса протоколов вычислительных сетей для следующих задач:
- ознакомления студентов с формальным подходом к описанию правил сетевого протокола и верификации построенной модели вычислительной системы;
- работы с упрощенными моделями существующих протоколов;
- создания и проверки моделей разрабатываемых студентами протоколов.
Опыт применения SPIN/PROMELA в учебном процессе показывает, что студенты могут достаточно часто ошибаться как при построении модели протокола, так и при задании критериев правильности протокола. В худшем случае возможна двойная ошибка, когда ошибочная модель удовлетворяет ошибочным или даже вырожденным критериям. Поэтому важно разработать набор типовых критериев и рекомендации по последовательности их применения.
Поскольку система SPIN позволяет работать с различными моделями межпроцессного взаимодействия, то возможно применение системы в рамках курсов построения операционных систем и распределенных систем обработки информации при рассмотрении вопросов взаимной блокировки, критических секций, синхронизация процессов, организации менеджера процессов и других.
Список литературы
1. Gerard J. Holzmann. The Spin Model Checker: Primer and Reference Manual. -Addison-Wesley, 2003. - 608 p.
2. Gerard J. Holzmann. Design and Validation of Computer Protocols. - Prentice Hall, 1990. - 500 p.
3. Moshe Y. Vardi, Pierre Wolper. An automata-theoretic approach to automatic program verification // Procedings of First IEEE Symp. on Logic in Computer Science - 1986. -P. 322-331.
4. Amir Pnueli. The Temporal Logic of Programs // Proceedings of the 18th IEEE Symposium on Foundations of Computer Science - 1977. - P. 46-57.