SlideShare a Scribd company logo
1 of 63
Download to read offline
Моделирование и верификация
  распределенных систем в
        среде SPIN

            И.В. Шошмина
              Ю.Г. Карпов
              А.Б. Беляев
      ishoshmina@dcn.ftk.spbstu.ru
          РВКС, ФТК, СПбГПУ
                 2012
                                     1
SPIN
• разрабатывается Bell Labs с 1996
   – строить параллельные модели
     систем,
   – выразить требования на языке LTL
   – автоматически верифицировать
     выполнение требования на модели
• премия ACM System Award в 2001



Использовался при верификации:
• АТС PathStar (Lucent)
• системы управления шлюзами в Роттердаме
• аэрокосмические системы Mars Exploration Rovers (NASA)
• и в других проектах
                                                           2
Средство верификации SPIN

                                 Свойства
 Система                         системы


Спецификация системы      Спецификация требований
 (формальная модель)         (формальный язык)

Состояния и переходы             Автомат
 (структура Крипке)               Бюхи


                     Процедура
                      проверки
    Не выполняется           Выполняется

     Контрпример
                                                    3
Средство верификации SPIN
                                        Свойства
  Система                               системы


Модель системы на               Формула темпоральной
языке Promela                   логики LТL

Состояния и переходы            Процесс
(структура Крипке)              never claim
                                                  SPIN (= Simple Promela Interpreter )
                                                  • средство верификации протоколов,
                    Процедура                       параллельных программ и широкого
SPIN                проверки                        класса дискретных систем
                                                  • язык описания моделей Promela
       Не выполняется               Выполняется
                                                  Promela (= Protocol Meta Language)
        Контрпример                               • язык для создания моделей
                           Слишком                  взаимодействующих процессов
                           большое число          • модели с конечным числом
                           состояний в              состояний
                           модели
                                                  Редактор LTL формул
Promela входной язык SPIN
               Модели, создаваемые на языке Promela

   абстракция реальной системы, содержащая характеристики, которые
    значимы для описания взаимодействия процессов
   модель не является программной реализацией системы
   модель может содержать части, которые важны только для
    верификации протоколов


   Promela включает примитивы для создания процессов и описания
    межпроцессного взаимодействия
   НО! в нем отсутствует ряд средств, которые есть в языках
    программирования высокого уровня
        Например, указатели на данные и функции, не включено понятие
         времени или часов, отсутствуют операции с плавающей точкой и пр.
                                                                        5
Чередование процессов. Светофоры

                                   TrLight:
                                                  red

                                                 green



   TrLight1 || TrLight2:          Количество состояний
                                  общей системы переходов:
            red red
                                    TrLight1  TrLight2 
green red             red green      2 2  4
        green green

                                                            6
Модель двух светофоров на языке
                   Promela
 • Процесс – основная структурная единица языка Promela
    • в Promela нет функций
 • В программе должен быть хотя бы один процесс

 тело процесса   proctype TrLight()    объявление процесса
                 {
                 }

                       • Основной процесс init (ключевое
 init()
 { run TrLight();
                         слово)
   run TrLight()          • основной процесс может
 }                          отсутствовать в программе


• Процесс может запускаться при помощи оператора run
  или непосредственно в начале работы
                                                          7
Модель двух светофоров на языке
                   Promela

            proctype TrLight()
            {
цикл
              do                                   разделитель
              :: printf(“MSC: REDn”);             команд
                 printf(“MSC: GREEN n”)
              od
            }                                   вывод строки

•   процессы в Promela выполняются асинхронно
•   в распределенных системах отсутствуют предположения о скорости
    процессов




                                                               8
Запуск оболочки XSpin
$ /bin/spin/xspin.tcl   запуск оболочки XSpin из Cygwin



                                        Основное окно
                                        редактора XSpin




                                                     10
Загрузка файла с моделью на Promela




                                      11
Запуск симуляции




                   12
Окно параметров симуляции




                            13
Симуляция модели двух светофоров
             Глобальное состояние системы:
             <метка состояния светофора 1,
             метка состояния светофора 2>

                                red red

                    green red         red green


                     red red         green green


                    green red             red green




              Развертка системы                       14
Симуляция модели двух светофоров

                             red red

                 green red         red green


                 red red          green green


                 green red             red green




                                                   15
Автомат напитков и студент
Автомат напитков:                                    Студент:
                             refill
                 ready                                          ask
nc>0: cget                            nb>0: bget
                                                                               bget
       nc=0 & nb=0:
             recoin      incoin                            recoin     incoin
                                                    cget

                  give                                          wait
 • nc – количество банок колы в автомате
 • nb – количество банок пива в автомате
 Сообщения в системе:
 • incoin – в автомат бросили монету               Взаимодействия в системе
 • recoin – автомат вернул монету                  синхронные
 • cget – автомат выдал колу
 • bget – автомат выдал пива                                                   16
Синхронные взаимодействия
 Процесс 1    Процесс 2

отправить
сообщение




время




                                    17
Синхронные взаимодействия
 Процесс 1          Процесс 2    Процесс 1        Процесс 2
                                                  готов
отправить                                         получить
сообщение                                         сообщение




                    получить
                    сообщение

        взаимодействие
время
                                отправить
                                сообщение

             Синхронное взаимодействие называют        18
                 рукопожатием (handshaking)
Система переходов с синхронным
             взаимодействием
Сколько состояний в системе переходов                    Зависит от числа
    «автомат напитков – студент» ?                      банок колы и пива!
      Модели на языке Promela должны быть конечны
      Ограничим: 0  nb  1  0  nc  1
                                               refill
             refill                                               refill
                         ra nc=1 nb=1
                                    incoin
              cget                                         bget
                         gw nc=1 nb=1

      ra nc=0 nb=1                                ra nc=1 nb=0
             incoin                                         incoin
                      bget              cget
      gw nc=0 nb=1                               gw nc=1 nb=0

                         ra nc=0 nb=0                       2х2х2=8
                        recoin    incoin
                                                                           19
                         gw nc=0 nb=0
Автомат напитков и студент.
               Модель на Promela
• Поведение автомата напитков и студента моделируем
  процессами
• Ограничиваем количество банок напитков в автомате
• Синхронные взаимодействия – рандеву-каналы

#define NMAX   1           максимальное количество бутылок в автомате

mtype = {incoin, cget, bget, recoin};         сообщения системы

                   перечислимый тип, удобен для задания сообщений
chan mcch = [0] of {mtype};          объявление канала сообщений,
                                     исходящих от автомата напитков
  емкость канала           формат сообщения

chan stch = [0] of {mtype};          объявление канала сообщений,
                                     исходящих от студента


                                                                20
Модель автомата напитков на Promela
   active proctype Machine() {
        int nc = NMAX,                                                 refill
            nb = NMAX,                nc>0: cget        ready
            state = 0;                                                          nb>0: bget
                                             nc=0 & nb=0:          incoin
объявление локальных переменных                    recoin
                                                            give
       guard – защита, условие

       do
       ::   (state   ==   0)   ->   /*...*/
       ::   (state   ==   0)   ->   /*...*/
       ::   (state   ==   1)   &&   (nc == 0) && (nb == 0) -> /*...*/
       ::   (state   ==   1)   &&   (nc > 0) -> /*...*/
       ::   (state   ==   1)   &&   (nb > 0) -> /*...*/
       od

             цикл
   }
                                                                                     21
Цикл в Promela
•   Promela предоставляет
    простые механизмы                                                 refill
    обеспечения
    недетерминизма                   nc>0: cget        ready
•   Если не выполняется ни                                                     nb>0: bget
    одно из условий, процесс                nc=0 & nb=0:          incoin
    блокируется                                   recoin
•   Операторы в Promela                                    give
    являются блокирующими
      guard – защита, условие

      do
      ::   (state   ==   0)   ->   /*...*/
      ::   (state   ==   0)   ->   /*...*/
      ::   (state   ==   1)   &&   (nc == 0) && (nb == 0) -> /*...*/
      ::   (state   ==   1)   &&   (nc > 0) -> /*...*/
      ::   (state   ==   1)   &&   (nb > 0) -> /*...*/
      od

            цикл                                                                    22
Операции получения и отправки
            сообщений в канал
active proctype Machine() {
   int nc = NMAX, nb = NMAX, state = 0;
   do
   :: (state == 0) ->
        nc = NMAX; nb = NMAX; printf(“MSC: refilledn”)
   :: (state == 0) ->
       mcch ? incoin; state = 1            получить сообщение
   :: (state == 1) && (nc == 0) && (nb == 0) ->
       stch ! recoin; state = 0
   :: (state == 1) && (nc > 0) ->
       stch ! cget; state = 0        отправить сообщение
   :: (state == 1) && (nb > 0) ->
       stch ! bget ; state = 0
   od
}

                                                            23
Структура выбора в Promela

Модель на Promela поведения студента
active proctype Student() {
   mtype msg;
   int state = 0;
   do
   :: (state == 0) -> mcch ! incoin; state = 1
   :: (state == 1) -> stch ? msg;       guard – защита, условие
       if
       :: (msg == recoin) -> printf(“MSC: try againn”)
       :: (msg == cget) -> printf(“MSC: get colan”)
       :: (msg == bget) -> printf(“MSC: get beern”);
       fi;
       state = 0
   od         структура выбора
}


                                                             24
Редактор LTL формул
При любом ли поведении системы когда-нибудь в будущем
             студент получит банку пива?

getbeer - атомарный предикат
F getbeer – на всех путях когда-нибудь в будущем студент
   получит банку пива

 Запись LTL формул в SPIN:
 <> F когда-нибудь в будущем на каком-нибудь пути будет
       выполняться свойство
 [] G всегда в будущем на всех путях будет выполняться
       заданное свойство
 !   ¬ отрицание

В строке редактора формул в SPIN запишем:
<> getbeer

                                                           25
Окно
редактора
LTL формул
 Запись формулы

       Предикат

 Процесс never claim
 • Отрицание LTL
   формулы на языке
   Promela
 • При верификации
   строится
   синхронная
   композиция
   процесса never
   claim и модели
 Результат
 верификации      26
Окно диаграммы взаимодействия




                                27
Задача выбора лидера
                           0
                                         Дано: однонаправленное кольцо
                                                     количество узлов N
                     w0
                                                     веса узлов wi (i=0..N-1) уникальны
      N-1
             wN-1              w1
                                    1                узлы взаимодействуют только с
                                                      соседями
                                                     количество узлов фиксировано

N-2   wN-2                          w2   2   Требуется построить протокол:
                                             набор ЛОКАЛЬНЫХ правил для
                                             каждого узла, которые позволят
                                             получить ГЛОБАЛЬНЫЙ результат -
                     ...
                                             каждому узлу определить лидера
                                                    например, узел с наибольшим весом


      Эффективный алгоритм выбора лидера (Dolev-Klawe-Rodeh, Peterson)

                    количество сообщений – 2Nlog2N+O(N)                                  28
Алгоритм выбора лидера Петерсена
Цель: каждый узел должен определить максимальный вес в кольце
     В начале узел знает только свой вес
                                                                  пассивный
                                            2-ой сосед
     Каждый узел или активный,
       или пассивный                                 1-ый сосед

  Активный узел                                   активный

  характеризуется текущим весом
  обрабатывает текущие веса двух ближайших
   активных соседей слева
  текущий вес – это максимальный известный узлу вес в сети
  формирует и отправляет сообщения (об известных ему
   текущих весах)

 Пассивный узел
  не имеет текущего веса
  пропускает через себя сообщения, не обрабатывая
                                                                      29
Набор локальных правил алгоритма
              Петерсона
                      активного узла
  max – локальный максимум – свой текущий вес

  left – текущий вес активного соседа слева

A0. max = wi
    послать сообщение one(max)
A1. получить сообщение one(q)
    если (q != max) то
       left := q
       послать сообщение two(left)
    иначе послать сообщение winner(max)
     max является глобальным максимумом
A2. получить сообщение two(q)
    если (left > q) и (left > max) то
       max:=left
       послать сообщение one(max)
    иначе узел становится пассивным
А3. фаза сообщения о лидере
                                                              30
 Фазы А1, А2 сменяют друг друга, пока не будет найден лидер
Пример. A0. Начальная фаза
                 w=3
                 left ?
                 max
                   ?

  w = 12 max                 max w = 6
  left ? ?                    ? left ?



     w = 1 max            max w = 5
     left ? ?              ? left ?

                                         31
Пример. A0. Начальная фаза
                                       Назначаем текущий вес
                         w=3
                            3
    out ! one(12)                        out ! one(3)




 w = 12 12                                   6      w=6

  out ! one(1)                               out ! one6)




      w=1           1   out ! one(5)
                                        5     w=5

                                          Отправляем текущий вес
                                                               32
Пример. Фаза А1
                                                   Получаем вес активного соседа
                                      w=3
Проверяем: найден ли
 максимальный вес?                       3
                  in ? one(12)                       in ? one(3)




            w = 12 12                                    6         w=6

               in ? one(1)                               in ? one(6)




                 w=1             1   in ? one(5)
                                                    5     w=5

 if (q != max) -> (left := q; send two(left))
                                                                           33
 else победитель найден
Пример. Фаза A1
                    w=3           Сохраняем вес активного
                  left = 12       соседа слева

                     3


w = 12                                    w =6
         12                         6
left = 1                                  left = 3



   w= 1                             w =5
              1               5
   left = 5                         left = 6

                                                       34
Пример. Фаза A1
                           w=3              Отправляем вес активного
                         left = 12          соседа слева

                              3
      out ! two(1)                      out ! two(12)



w = 12                                              w=6
         12                                  6
left = 1                                           left = 3

   out ! two(5)                             out ! two(3)



    w=1                                       w=5
                     1                  5
   left = 5              out ! two(6)        left = 6

                                                               35
Пример. Фаза A2
 Проверяем: соблюдены                w=3              Получаем вес
  ли условия активности
                                   left = 12          активного соседа слева
  узла?
                                       3
                 in ? two(1)                     in ? two(12)



          w = 12                                             w=6
                   12                                6
          left = 1                                          left = 3

              in ? two(5)                            in ? two(3)



               w=1                                     w=5
                               1                 5
              left = 5             in ? two(6)        left = 6
if((left>max) && (left>q)) -> (max:=left; send one(max))
                                                                         36
else узел стал пассивным
Пример. Фаза A2
                         w=3
                                       Сохраняем текущий вес
                       left = 12
Переходим в
пассивное состояние
                         12



            w = 12                          w=6




                                         w=5
                 w=1               6
                                        left = 6

                                                          37
Пример. Фаза A2
                w=3              Отправляем текущий вес
              left = 12
                 12
                             out ! one(12)




w = 12                                   w=6




                                    w=5
    w=1                      6
              out ! one(6)         left = 6

                                                    38
Пример. Фаза A1
                     w=3
                   left = 12
                     12
     in ? one(6)



w = 12                                    w=6

                                   in ? one(12)



                                     w=5
    w=1                        6
                                    left = 6

                                                  39
Пример. Фаза A1
           w=3
          left = 6
             12
                          out ! two(6)




w = 12                                   w=6




                                 w=5
    w=1                   6
          out ! two(12)        left = 12

                                               40
Пример. Фаза A2
                     w=3
                    left = 6
                      12
     in ? two(12)




w = 12                                    w=6

                                   in ? two(6)



                                      w=5
    w=1                        6
                                    left = 12

                                                 41
Пример. Фаза A2
               w=3




w = 12                       w=6




                     12   w=5
    w=1
                        left = 12

                                    42
Пример. Фаза A2
                w=3




w = 12                                w=6




                                   w=5
    w=1                       12
              out ! one(12)      left = 12

                                             43
Пример. Фаза A1

              w=3




w = 12                          w=6

                         in ? one(12)



                           w=5
    w=1             12
                         left = 12

                                        44
Пример. Фаза A3. Лидер найден

             w=3




  w = 12                    w=6




                            w=5
      w=1      out !
            winner(12)   winner = 12

                                       45
Глобальные свойства, обеспечивающие
        корректность алгоритма

• На любой фазе в кольце есть только один процесс с
  максимальным весом

• На любой фазе процесс или характеризуется текущим
  весом, который является наибольшим из двух активных
  соседей слева, или не распространяет свой текущий вес


 Эти два правила являются глобальными инвариантами

   Формулировка глобальных инвариант и формальное
                   доказательство
            требуют понимания алгоритма


                                                          46
Асинхронные взаимодействия
 Процесс 1           Процесс 2        • Порядок получения
отправить                               сообщений зависит от
сообщение                               дисциплины
                                        обслуживания канала
                        получает
продолжает              сообщение     • В Promela дисциплина
работу                  из канала       обслуживания FIFO
                                      • Каналы имеют конечную
                                        емкость
Сообщения алгоритма выбора лидера     • Сообщение может быть
 one(q) – сообщение со своим текущим   записано в канал, если
  весом
                                        емкость канала не
 two(q) – сообщение с текущим весом
  своего соседа слева                   исчерпана
 winner(q) - сообщение «лидер-       • Процесс может прочитать
  найден»                               сообщение из канала,
 q – один из весов, хранимых узлом
                                        если канал не пуст
                                                           47
Модель задачи о выборе лидера на языке
                  Promela
                                      Ограничения модели:
                w=3
                                      •     Количество узлов фиксировано и ограничено
                                      •     Все узлы вступают одновременно
                                      •     Количество узлов не меняется в процессе работы
w = 12                       w=6          # define N         5
                                                                              количество узлов
                                          Каждый узел – независимый процесс:
                                          proctype node (...)                объявление процесса
    w=1                  w=5

                             Узлы обмениваются сообщениями трех типов:
                                                       mtype = {one, two, winner};

  Узлы обмениваются сообщениями по каналам:
    # define L           2                               емкость канала

    chan p[N] = [L] of {mtype, byte};                            формат сообщения,
                                                                 например, one(q)
                                                                 то же, что и one, q

         объявление массива каналов
                                                                                                 48
Структура программы на Promela
                        // Число процессов
                        # define N      5
                                                                                    w=3
                        // Ограничение глубины канала
Глобальные переменные




                        # define L      2

                        // Типы сообщений                                 w = 12               w=6
                        mtype = {one, two, winner};

                        // Объявление N каналов глубиной L
                                                                              w=1         w=5
                        chan p[N] = [L] of {mtype, byte};

                        // Количество лидеров
                        byte nr_leaders = 0;

                        // Объявления процессов-узлов
                        proctype node (chan in, out; byte my_number) {
                        /* . . . */
                        }

                        // Главный процесс, запуск всех процессов узлов
                        init {
                        /* . . . */
                                                                                          49
                        }
Описание алгоритма работы узла
  proctype node (chan in, out; byte my_number)
  { bit Active = 1,
          know_winner = 0; // флаг знаю-лидера
     byte        q,
          max = my_number,
          left;
     out ! one(my_number);    // А0. отправить свой параметр
end: do
     :: in ? one(q)     -> /*…*/    // А1. получено сообщение one

    :: in ? two(q)      -> /*…*/     // А2. получено сообщение two

                           А0. Начальная фаза
    :: in ? winner(q) -> /*…*/     // А3. получено сообщение winner
                           A1. Получить сообщение one(q).
           break;              Обработать сообщение. Отправить
    od                         сообщение two(q)
  }                        A2. Получить сообщение two(q).
                               Обработать сообщения. Отправить
                               сообщения one(q)
                           А3. Обработка сообщения о лидере
                               winner(q)
                                                                 51
Конструкции языка Promela, связанные с
             верификацией

• Утверждение assert(любое_булево_условие)
   – Если условие не всегда соблюдается, то оператор
     вызовет сообщение об ошибке в процессе
     симуляции и верификации с помощью Spin
• Метка конечного состояния (end)
   – указывает верификатору, чтобы тот не считал
     определенные операторы некорректным
     завершением программы
• Метка активного состояния (progress)
   – помечает операторы, которые для корректного
     продолжения работы протокола должны встретиться
     хотя бы раз на любой бесконечной трассе


                                                       52
w=3
                                                                                3
                                                         in ? one(12)                     in ? one(3)




                        Фаза A1                     w = 12 12

                                                      in ? one(1)
                                                                                              6         w=6

                                                                                              in ? one(6)



:: in ? one(q) ->                                       w=1             1   in ? one(5)
                                                                                          5    w=5


  if
  :: Active ->               // узел в активном состоянии

       if                    //   проверяем полученное значение
       :: q != max ->        //   если не равно лок. максимуму
              left = q;      //   то меняем параметр соседа
              out ! two(q)   //   передаем параметр далее

       :: else ->           // иначе – нашли глоб. максимум
              assert(q == N);
              know_winner = 1;     // лидер этому узлу известен
              out ! winner(q);     // сообщаем о выборе лидера
       fi

  :: else ->         // в пассивном состоянии
                         A1. Получить сообщение one(q):
      out ! one(q)   // передаем сообщение без то left:=q и
                            1. Если q != max, обработки
  fi                         послать сообщение two(left)
                             2. Иначе, max является глобальным
                                                             53
                             максимумом
Фаза A2
:: in ? two(q) ->

  if
  :: Active ->      // в активном состоянии

      if            // находимся за локальным максимумом
      :: left > q && left > max ->
             max = left; // меняем информацию о локальном
                           // максимуме
             out ! one(max) // передаем дальше

      :: else ->           // переход в пассивное состояние
                    Active = 0
      fi

  :: else -> // пассивны - передаем параметр без обработки
      out ! two(q)
                       A2. Пришло сообщение two(q):
  fi                      1 . Если left больше и q, и max, то
                              max:=left и
                              послать сообщение one(max)
                                                           54
                          2. Иначе, узел становится пассивным.
Фаза A3. Обработка сообщения о лидере
:: in ? winner(q) ->   // получено сообщение «лидер выбран»

  if                 // проверка: совпадает ли номером узла
  :: q != my_number ->
      printf("MSC: LOSTn"); // узел проиграл выборы

  :: else ->                   // узел выиграл выборы
      printf("MSC: LEADERn");
      nr_leaders++;
      assert(nr_leaders == 1)
  fi;

  if                 // проверка: был ли найден лидер?
  :: know_winner           // знал и уже посылал сообщение –
                           // «лидер выбран»
  :: else -> out ! winner(q) // посылает сообщение
  fi;

  break
Некоторые операторы языка Promela всегда выполнимы.
                                                               55
Например, break, skip, printf
Основная функция, запускающая процессы
init {
   byte proc;
   atomic {   // рассматривается верификатором,
              // как одно действие

        proc = 1;

        do
        :: proc <= N ->
               run node (p[proc-1], p[proc%N], (N+I-proc)%N+1);
               proc++

        :: proc > N ->
               break
        od
    }
}

Условие модели – одновременный запуск процессов!
                                                            56
Симуляция
  программы
выбора лидера
   в XSPIN




            57
Количество состояний с асинхронными
           взаимодействиями
     𝑛     •    количество процессов
  𝐶ℎ𝑎𝑛     •    множество каналов
 𝐿𝑎𝑏𝑒𝑙 𝑖   •    множество меток процесса i
   𝑉𝑎𝑟𝑖    •    множество переменных процесса i
𝑑𝑜𝑚(𝑥)     •    область определения переменной x
𝑑𝑜𝑚(с)     •    область определения канала c
 𝑐𝑎𝑝(с)    •    емкость канала с
             n                      
               Labeli   dom( x)    dom(c)
                                                  cap( c )

           i 1 
                                      cChan
                           xVari    
Использование асинхронных каналов
• увеличивает размер вектора глобального состояния системы
• увеличивает число состояний системы
                                                             58
Верификация алгоритма выбора лидера
Алгоритм нетривиальный. Основная цель алгоритма –
  эффективность на большом числе процессов.
Как можно проверить, что алгоритм корректный?
Строить LTL формулы и проверять их выполнение с помощью Spin
Проверяемые свойства:
    • лидер должен быть только один
         noMore: nr_leaders ≤ 1    // атомный предикат
        G noMore
    •   лидер в конце концов будет выбран
        elected: nr_leaders == 1   // атомный предикат
        FG elected
    •   номер выбранного лидера всегда будет максимальным
        nr == N                    // атомный предикат
        FG nr


   LTL-формула выполняется для любого пути, стартовавшего в
                допустимом начальном состоянии
                                                              59
61
Режимы верификации
• Основные режимы верификации SPIN:
  – Exhaustive – полный
  – Supertrace/Bitstate – супертрассы (с потерей состояний)
  – Hash-Compact – компактное хэширование

• В SPIN есть различные способы уменьшения размера
  модели при верификации
• Основные способы сокращения размеров модели:
   – Уменьшение затрат на хранение глобального состояния
   – Уменьшение числа состояний



                                                       62
Заключение

• SPIN успешно используется для построения моделей
  распределенных алгоритмов и систем
• SPIN работает в режиме симуляции и верификации
• SPIN позволяет верифицировать свойства линейной
  темпоральной логики
• SPIN строит контрпример нарушения свойства, анализ
  которого позволяет выявить ошибку
• SPIN строит синхронную композицию модели и отрицания
  заданной формулы
   – проводит верификацию методами с сжатием без потери состояний
     и с потерей



                                                                63
Заключение
• Основные типы объектов Promela
   – процессы определяют поведение
   – каналы используются для передачи сообщений между
     процессами
   – данные типов: bit(boolean), byte, short, int
• Основные конструкции Promela
   – присваивание, выражение, вывод на экран и т.п.
   – отправка и получение сообщения, skip,
   – недетерминированный выбор по условию, оператор цикла
   – любая конструкция языка или выполнимая, или
     блокирующая
   – специальные конструкции для поддержки верификации
• Promela работает только с моделями конечной размерности
                                                        64
СПАСИБО


          65
Задачи

• Найти ошибку в задаче про автомат
  напитков
• Изменить алгоритм выбора лидера в
  однонаправленном кольце так, чтобы
  верификация не проходила. Например,
  нарушим свойство «Всегда у лидера
  будет наибольший вес»
• Проверить свойство «На всех путях
  всегда общее число проголосовавших
  равно 100%»
                                        66

More Related Content

What's hot

Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel ComputingAndrii Rodionov
 
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")Tatyanazaxarova
 
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Tatyanazaxarova
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...Tatyanazaxarova
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью. Unguryan Vitaliy
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1921519
 
Равиль Губайдуллин - Annotation processing
Равиль Губайдуллин - Annotation processingРавиль Губайдуллин - Annotation processing
Равиль Губайдуллин - Annotation processingProvectus
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в javaUnguryan Vitaliy
 
32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++Tatyanazaxarova
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.Igor Shkulipa
 
20090721 hpc exercise2
20090721 hpc exercise220090721 hpc exercise2
20090721 hpc exercise2Michael Karpov
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Anton Moiseenko
 

What's hot (20)

Multi threads
Multi threadsMulti threads
Multi threads
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel Computing
 
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
 
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
VivaMP, система выявления ошибок в коде параллельных программ на языке С++, и...
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1
 
Равиль Губайдуллин - Annotation processing
Равиль Губайдуллин - Annotation processingРавиль Губайдуллин - Annotation processing
Равиль Губайдуллин - Annotation processing
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
лек11 5
лек11 5лек11 5
лек11 5
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++32 подводных камня OpenMP при программировании на Си++
32 подводных камня OpenMP при программировании на Си++
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
20090721 hpc exercise2
20090721 hpc exercise220090721 hpc exercise2
20090721 hpc exercise2
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 

Similar to 20120218 model checking_karpov_lecture02

Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPВебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPFlyElephant
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...yaevents
 
Сергей Еланцев - Troubleshooting
Сергей Еланцев - Troubleshooting   Сергей Еланцев - Troubleshooting
Сергей Еланцев - Troubleshooting Yandex
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)Mikhail Kurnosov
 
Александр Калугин - Простота тестирования маленького системного ПО
Александр Калугин - Простота тестирования маленького системного ПОАлександр Калугин - Простота тестирования маленького системного ПО
Александр Калугин - Простота тестирования маленького системного ПОSQALab
 
Создание и развитие отечественной платформы с открытым программным кодом для ...
Создание и развитие отечественной платформы с открытым программным кодом для ...Создание и развитие отечественной платформы с открытым программным кодом для ...
Создание и развитие отечественной платформы с открытым программным кодом для ...ARCCN
 
Pconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяныPconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяныSergey Xek
 
Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Ontico
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
S A P R 3 System Administration Liane Will Rus(1)
S A P  R 3  System  Administration   Liane  Will   Rus(1)S A P  R 3  System  Administration   Liane  Will   Rus(1)
S A P R 3 System Administration Liane Will Rus(1)rajankoli
 
Sap R 3 System Administration Liane Will Rus(1)
Sap R 3 System Administration  Liane Will  Rus(1)Sap R 3 System Administration  Liane Will  Rus(1)
Sap R 3 System Administration Liane Will Rus(1)rajankoli
 
Sap R 3 System Administration Liane Will Rus
Sap R 3 System Administration  Liane Will  RusSap R 3 System Administration  Liane Will  Rus
Sap R 3 System Administration Liane Will Rusguestc206c38b4
 
Sap R 3 System Administration Liane Will Rus(1)
Sap R 3 System Administration  Liane Will  Rus(1)Sap R 3 System Administration  Liane Will  Rus(1)
Sap R 3 System Administration Liane Will Rus(1)rajankoli
 
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Cisco Russia
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Нюансы запуска приложений в Kubernetes
Нюансы запуска приложений в KubernetesНюансы запуска приложений в Kubernetes
Нюансы запуска приложений в KubernetesАндрей Новиков
 

Similar to 20120218 model checking_karpov_lecture02 (20)

Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMPВебинар: Основы распараллеливания С++ программ при помощи OpenMP
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
 
Сергей Еланцев - Troubleshooting
Сергей Еланцев - Troubleshooting   Сергей Еланцев - Troubleshooting
Сергей Еланцев - Troubleshooting
 
Dev collaboration
Dev collaborationDev collaboration
Dev collaboration
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)Стандарт MPI (Message Passing Interface)
Стандарт MPI (Message Passing Interface)
 
Александр Калугин - Простота тестирования маленького системного ПО
Александр Калугин - Простота тестирования маленького системного ПОАлександр Калугин - Простота тестирования маленького системного ПО
Александр Калугин - Простота тестирования маленького системного ПО
 
Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...
Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...
Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...
 
Создание и развитие отечественной платформы с открытым программным кодом для ...
Создание и развитие отечественной платформы с открытым программным кодом для ...Создание и развитие отечественной платформы с открытым программным кодом для ...
Создание и развитие отечественной платформы с открытым программным кодом для ...
 
Pconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяныPconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяны
 
Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
S A P R 3 System Administration Liane Will Rus(1)
S A P  R 3  System  Administration   Liane  Will   Rus(1)S A P  R 3  System  Administration   Liane  Will   Rus(1)
S A P R 3 System Administration Liane Will Rus(1)
 
Sap R 3 System Administration Liane Will Rus(1)
Sap R 3 System Administration  Liane Will  Rus(1)Sap R 3 System Administration  Liane Will  Rus(1)
Sap R 3 System Administration Liane Will Rus(1)
 
Sap R 3 System Administration Liane Will Rus
Sap R 3 System Administration  Liane Will  RusSap R 3 System Administration  Liane Will  Rus
Sap R 3 System Administration Liane Will Rus
 
Sap R 3 System Administration Liane Will Rus(1)
Sap R 3 System Administration  Liane Will  Rus(1)Sap R 3 System Administration  Liane Will  Rus(1)
Sap R 3 System Administration Liane Will Rus(1)
 
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Нюансы запуска приложений в Kubernetes
Нюансы запуска приложений в KubernetesНюансы запуска приложений в Kubernetes
Нюансы запуска приложений в Kubernetes
 

More from Computer Science Club

20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugsComputer Science Club
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12Computer Science Club
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11Computer Science Club
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10Computer Science Club
 
20140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture0920140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture09Computer Science Club
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02Computer Science Club
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01Computer Science Club
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04Computer Science Club
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01Computer Science Club
 

More from Computer Science Club (20)

20141223 kuznetsov distributed
20141223 kuznetsov distributed20141223 kuznetsov distributed
20141223 kuznetsov distributed
 
Computer Vision
Computer VisionComputer Vision
Computer Vision
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10
 
20140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture0920140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture09
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04
 
20140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-0320140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-03
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01
 
20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 

20120218 model checking_karpov_lecture02

  • 1. Моделирование и верификация распределенных систем в среде SPIN И.В. Шошмина Ю.Г. Карпов А.Б. Беляев ishoshmina@dcn.ftk.spbstu.ru РВКС, ФТК, СПбГПУ 2012 1
  • 2. SPIN • разрабатывается Bell Labs с 1996 – строить параллельные модели систем, – выразить требования на языке LTL – автоматически верифицировать выполнение требования на модели • премия ACM System Award в 2001 Использовался при верификации: • АТС PathStar (Lucent) • системы управления шлюзами в Роттердаме • аэрокосмические системы Mars Exploration Rovers (NASA) • и в других проектах 2
  • 3. Средство верификации SPIN Свойства Система системы Спецификация системы Спецификация требований (формальная модель) (формальный язык) Состояния и переходы Автомат (структура Крипке) Бюхи Процедура проверки Не выполняется Выполняется Контрпример 3
  • 4. Средство верификации SPIN Свойства Система системы Модель системы на Формула темпоральной языке Promela логики LТL Состояния и переходы Процесс (структура Крипке) never claim SPIN (= Simple Promela Interpreter ) • средство верификации протоколов, Процедура параллельных программ и широкого SPIN проверки класса дискретных систем • язык описания моделей Promela Не выполняется Выполняется Promela (= Protocol Meta Language) Контрпример • язык для создания моделей Слишком взаимодействующих процессов большое число • модели с конечным числом состояний в состояний модели Редактор LTL формул
  • 5. Promela входной язык SPIN Модели, создаваемые на языке Promela  абстракция реальной системы, содержащая характеристики, которые значимы для описания взаимодействия процессов  модель не является программной реализацией системы  модель может содержать части, которые важны только для верификации протоколов  Promela включает примитивы для создания процессов и описания межпроцессного взаимодействия  НО! в нем отсутствует ряд средств, которые есть в языках программирования высокого уровня  Например, указатели на данные и функции, не включено понятие времени или часов, отсутствуют операции с плавающей точкой и пр. 5
  • 6. Чередование процессов. Светофоры TrLight: red green TrLight1 || TrLight2: Количество состояний общей системы переходов: red red TrLight1  TrLight2  green red red green  2 2  4 green green 6
  • 7. Модель двух светофоров на языке Promela • Процесс – основная структурная единица языка Promela • в Promela нет функций • В программе должен быть хотя бы один процесс тело процесса proctype TrLight() объявление процесса { } • Основной процесс init (ключевое init() { run TrLight(); слово) run TrLight() • основной процесс может } отсутствовать в программе • Процесс может запускаться при помощи оператора run или непосредственно в начале работы 7
  • 8. Модель двух светофоров на языке Promela proctype TrLight() { цикл do разделитель :: printf(“MSC: REDn”); команд printf(“MSC: GREEN n”) od } вывод строки • процессы в Promela выполняются асинхронно • в распределенных системах отсутствуют предположения о скорости процессов 8
  • 9. Запуск оболочки XSpin $ /bin/spin/xspin.tcl запуск оболочки XSpin из Cygwin Основное окно редактора XSpin 10
  • 10. Загрузка файла с моделью на Promela 11
  • 13. Симуляция модели двух светофоров Глобальное состояние системы: <метка состояния светофора 1, метка состояния светофора 2> red red green red red green red red green green green red red green Развертка системы 14
  • 14. Симуляция модели двух светофоров red red green red red green red red green green green red red green 15
  • 15. Автомат напитков и студент Автомат напитков: Студент: refill ready ask nc>0: cget nb>0: bget bget nc=0 & nb=0: recoin incoin recoin incoin cget give wait • nc – количество банок колы в автомате • nb – количество банок пива в автомате Сообщения в системе: • incoin – в автомат бросили монету Взаимодействия в системе • recoin – автомат вернул монету синхронные • cget – автомат выдал колу • bget – автомат выдал пива 16
  • 16. Синхронные взаимодействия Процесс 1 Процесс 2 отправить сообщение время 17
  • 17. Синхронные взаимодействия Процесс 1 Процесс 2 Процесс 1 Процесс 2 готов отправить получить сообщение сообщение получить сообщение взаимодействие время отправить сообщение Синхронное взаимодействие называют 18 рукопожатием (handshaking)
  • 18. Система переходов с синхронным взаимодействием Сколько состояний в системе переходов Зависит от числа «автомат напитков – студент» ? банок колы и пива! Модели на языке Promela должны быть конечны Ограничим: 0  nb  1 0  nc  1 refill refill refill ra nc=1 nb=1 incoin cget bget gw nc=1 nb=1 ra nc=0 nb=1 ra nc=1 nb=0 incoin incoin bget cget gw nc=0 nb=1 gw nc=1 nb=0 ra nc=0 nb=0 2х2х2=8 recoin incoin 19 gw nc=0 nb=0
  • 19. Автомат напитков и студент. Модель на Promela • Поведение автомата напитков и студента моделируем процессами • Ограничиваем количество банок напитков в автомате • Синхронные взаимодействия – рандеву-каналы #define NMAX 1 максимальное количество бутылок в автомате mtype = {incoin, cget, bget, recoin}; сообщения системы перечислимый тип, удобен для задания сообщений chan mcch = [0] of {mtype}; объявление канала сообщений, исходящих от автомата напитков емкость канала формат сообщения chan stch = [0] of {mtype}; объявление канала сообщений, исходящих от студента 20
  • 20. Модель автомата напитков на Promela active proctype Machine() { int nc = NMAX, refill nb = NMAX, nc>0: cget ready state = 0; nb>0: bget nc=0 & nb=0: incoin объявление локальных переменных recoin give guard – защита, условие do :: (state == 0) -> /*...*/ :: (state == 0) -> /*...*/ :: (state == 1) && (nc == 0) && (nb == 0) -> /*...*/ :: (state == 1) && (nc > 0) -> /*...*/ :: (state == 1) && (nb > 0) -> /*...*/ od цикл } 21
  • 21. Цикл в Promela • Promela предоставляет простые механизмы refill обеспечения недетерминизма nc>0: cget ready • Если не выполняется ни nb>0: bget одно из условий, процесс nc=0 & nb=0: incoin блокируется recoin • Операторы в Promela give являются блокирующими guard – защита, условие do :: (state == 0) -> /*...*/ :: (state == 0) -> /*...*/ :: (state == 1) && (nc == 0) && (nb == 0) -> /*...*/ :: (state == 1) && (nc > 0) -> /*...*/ :: (state == 1) && (nb > 0) -> /*...*/ od цикл 22
  • 22. Операции получения и отправки сообщений в канал active proctype Machine() { int nc = NMAX, nb = NMAX, state = 0; do :: (state == 0) -> nc = NMAX; nb = NMAX; printf(“MSC: refilledn”) :: (state == 0) -> mcch ? incoin; state = 1 получить сообщение :: (state == 1) && (nc == 0) && (nb == 0) -> stch ! recoin; state = 0 :: (state == 1) && (nc > 0) -> stch ! cget; state = 0 отправить сообщение :: (state == 1) && (nb > 0) -> stch ! bget ; state = 0 od } 23
  • 23. Структура выбора в Promela Модель на Promela поведения студента active proctype Student() { mtype msg; int state = 0; do :: (state == 0) -> mcch ! incoin; state = 1 :: (state == 1) -> stch ? msg; guard – защита, условие if :: (msg == recoin) -> printf(“MSC: try againn”) :: (msg == cget) -> printf(“MSC: get colan”) :: (msg == bget) -> printf(“MSC: get beern”); fi; state = 0 od структура выбора } 24
  • 24. Редактор LTL формул При любом ли поведении системы когда-нибудь в будущем студент получит банку пива? getbeer - атомарный предикат F getbeer – на всех путях когда-нибудь в будущем студент получит банку пива Запись LTL формул в SPIN: <> F когда-нибудь в будущем на каком-нибудь пути будет выполняться свойство [] G всегда в будущем на всех путях будет выполняться заданное свойство ! ¬ отрицание В строке редактора формул в SPIN запишем: <> getbeer 25
  • 25. Окно редактора LTL формул Запись формулы Предикат Процесс never claim • Отрицание LTL формулы на языке Promela • При верификации строится синхронная композиция процесса never claim и модели Результат верификации 26
  • 27. Задача выбора лидера 0 Дано: однонаправленное кольцо  количество узлов N w0  веса узлов wi (i=0..N-1) уникальны N-1 wN-1 w1 1  узлы взаимодействуют только с соседями  количество узлов фиксировано N-2 wN-2 w2 2 Требуется построить протокол: набор ЛОКАЛЬНЫХ правил для каждого узла, которые позволят получить ГЛОБАЛЬНЫЙ результат - ... каждому узлу определить лидера  например, узел с наибольшим весом Эффективный алгоритм выбора лидера (Dolev-Klawe-Rodeh, Peterson) количество сообщений – 2Nlog2N+O(N) 28
  • 28. Алгоритм выбора лидера Петерсена Цель: каждый узел должен определить максимальный вес в кольце  В начале узел знает только свой вес пассивный 2-ой сосед Каждый узел или активный, или пассивный 1-ый сосед Активный узел активный  характеризуется текущим весом  обрабатывает текущие веса двух ближайших активных соседей слева  текущий вес – это максимальный известный узлу вес в сети  формирует и отправляет сообщения (об известных ему текущих весах) Пассивный узел  не имеет текущего веса  пропускает через себя сообщения, не обрабатывая 29
  • 29. Набор локальных правил алгоритма Петерсона активного узла  max – локальный максимум – свой текущий вес  left – текущий вес активного соседа слева A0. max = wi послать сообщение one(max) A1. получить сообщение one(q) если (q != max) то left := q послать сообщение two(left) иначе послать сообщение winner(max) max является глобальным максимумом A2. получить сообщение two(q) если (left > q) и (left > max) то max:=left послать сообщение one(max) иначе узел становится пассивным А3. фаза сообщения о лидере 30 Фазы А1, А2 сменяют друг друга, пока не будет найден лидер
  • 30. Пример. A0. Начальная фаза w=3 left ? max ? w = 12 max max w = 6 left ? ? ? left ? w = 1 max max w = 5 left ? ? ? left ? 31
  • 31. Пример. A0. Начальная фаза Назначаем текущий вес w=3 3 out ! one(12) out ! one(3) w = 12 12 6 w=6 out ! one(1) out ! one6) w=1 1 out ! one(5) 5 w=5 Отправляем текущий вес 32
  • 32. Пример. Фаза А1 Получаем вес активного соседа w=3 Проверяем: найден ли максимальный вес? 3 in ? one(12) in ? one(3) w = 12 12 6 w=6 in ? one(1) in ? one(6) w=1 1 in ? one(5) 5 w=5 if (q != max) -> (left := q; send two(left)) 33 else победитель найден
  • 33. Пример. Фаза A1 w=3 Сохраняем вес активного left = 12 соседа слева 3 w = 12 w =6 12 6 left = 1 left = 3 w= 1 w =5 1 5 left = 5 left = 6 34
  • 34. Пример. Фаза A1 w=3 Отправляем вес активного left = 12 соседа слева 3 out ! two(1) out ! two(12) w = 12 w=6 12 6 left = 1 left = 3 out ! two(5) out ! two(3) w=1 w=5 1 5 left = 5 out ! two(6) left = 6 35
  • 35. Пример. Фаза A2 Проверяем: соблюдены w=3 Получаем вес ли условия активности left = 12 активного соседа слева узла? 3 in ? two(1) in ? two(12) w = 12 w=6 12 6 left = 1 left = 3 in ? two(5) in ? two(3) w=1 w=5 1 5 left = 5 in ? two(6) left = 6 if((left>max) && (left>q)) -> (max:=left; send one(max)) 36 else узел стал пассивным
  • 36. Пример. Фаза A2 w=3 Сохраняем текущий вес left = 12 Переходим в пассивное состояние 12 w = 12 w=6 w=5 w=1 6 left = 6 37
  • 37. Пример. Фаза A2 w=3 Отправляем текущий вес left = 12 12 out ! one(12) w = 12 w=6 w=5 w=1 6 out ! one(6) left = 6 38
  • 38. Пример. Фаза A1 w=3 left = 12 12 in ? one(6) w = 12 w=6 in ? one(12) w=5 w=1 6 left = 6 39
  • 39. Пример. Фаза A1 w=3 left = 6 12 out ! two(6) w = 12 w=6 w=5 w=1 6 out ! two(12) left = 12 40
  • 40. Пример. Фаза A2 w=3 left = 6 12 in ? two(12) w = 12 w=6 in ? two(6) w=5 w=1 6 left = 12 41
  • 41. Пример. Фаза A2 w=3 w = 12 w=6 12 w=5 w=1 left = 12 42
  • 42. Пример. Фаза A2 w=3 w = 12 w=6 w=5 w=1 12 out ! one(12) left = 12 43
  • 43. Пример. Фаза A1 w=3 w = 12 w=6 in ? one(12) w=5 w=1 12 left = 12 44
  • 44. Пример. Фаза A3. Лидер найден w=3 w = 12 w=6 w=5 w=1 out ! winner(12) winner = 12 45
  • 45. Глобальные свойства, обеспечивающие корректность алгоритма • На любой фазе в кольце есть только один процесс с максимальным весом • На любой фазе процесс или характеризуется текущим весом, который является наибольшим из двух активных соседей слева, или не распространяет свой текущий вес Эти два правила являются глобальными инвариантами Формулировка глобальных инвариант и формальное доказательство требуют понимания алгоритма 46
  • 46. Асинхронные взаимодействия Процесс 1 Процесс 2 • Порядок получения отправить сообщений зависит от сообщение дисциплины обслуживания канала получает продолжает сообщение • В Promela дисциплина работу из канала обслуживания FIFO • Каналы имеют конечную емкость Сообщения алгоритма выбора лидера • Сообщение может быть  one(q) – сообщение со своим текущим записано в канал, если весом емкость канала не  two(q) – сообщение с текущим весом своего соседа слева исчерпана  winner(q) - сообщение «лидер- • Процесс может прочитать найден» сообщение из канала,  q – один из весов, хранимых узлом если канал не пуст 47
  • 47. Модель задачи о выборе лидера на языке Promela Ограничения модели: w=3 • Количество узлов фиксировано и ограничено • Все узлы вступают одновременно • Количество узлов не меняется в процессе работы w = 12 w=6 # define N 5 количество узлов Каждый узел – независимый процесс: proctype node (...) объявление процесса w=1 w=5 Узлы обмениваются сообщениями трех типов: mtype = {one, two, winner}; Узлы обмениваются сообщениями по каналам: # define L 2 емкость канала chan p[N] = [L] of {mtype, byte}; формат сообщения, например, one(q) то же, что и one, q объявление массива каналов 48
  • 48. Структура программы на Promela // Число процессов # define N 5 w=3 // Ограничение глубины канала Глобальные переменные # define L 2 // Типы сообщений w = 12 w=6 mtype = {one, two, winner}; // Объявление N каналов глубиной L w=1 w=5 chan p[N] = [L] of {mtype, byte}; // Количество лидеров byte nr_leaders = 0; // Объявления процессов-узлов proctype node (chan in, out; byte my_number) { /* . . . */ } // Главный процесс, запуск всех процессов узлов init { /* . . . */ 49 }
  • 49. Описание алгоритма работы узла proctype node (chan in, out; byte my_number) { bit Active = 1, know_winner = 0; // флаг знаю-лидера byte q, max = my_number, left; out ! one(my_number); // А0. отправить свой параметр end: do :: in ? one(q) -> /*…*/ // А1. получено сообщение one :: in ? two(q) -> /*…*/ // А2. получено сообщение two А0. Начальная фаза :: in ? winner(q) -> /*…*/ // А3. получено сообщение winner A1. Получить сообщение one(q). break; Обработать сообщение. Отправить od сообщение two(q) } A2. Получить сообщение two(q). Обработать сообщения. Отправить сообщения one(q) А3. Обработка сообщения о лидере winner(q) 51
  • 50. Конструкции языка Promela, связанные с верификацией • Утверждение assert(любое_булево_условие) – Если условие не всегда соблюдается, то оператор вызовет сообщение об ошибке в процессе симуляции и верификации с помощью Spin • Метка конечного состояния (end) – указывает верификатору, чтобы тот не считал определенные операторы некорректным завершением программы • Метка активного состояния (progress) – помечает операторы, которые для корректного продолжения работы протокола должны встретиться хотя бы раз на любой бесконечной трассе 52
  • 51. w=3 3 in ? one(12) in ? one(3) Фаза A1 w = 12 12 in ? one(1) 6 w=6 in ? one(6) :: in ? one(q) -> w=1 1 in ? one(5) 5 w=5 if :: Active -> // узел в активном состоянии if // проверяем полученное значение :: q != max -> // если не равно лок. максимуму left = q; // то меняем параметр соседа out ! two(q) // передаем параметр далее :: else -> // иначе – нашли глоб. максимум assert(q == N); know_winner = 1; // лидер этому узлу известен out ! winner(q); // сообщаем о выборе лидера fi :: else -> // в пассивном состоянии A1. Получить сообщение one(q): out ! one(q) // передаем сообщение без то left:=q и 1. Если q != max, обработки fi послать сообщение two(left) 2. Иначе, max является глобальным 53 максимумом
  • 52. Фаза A2 :: in ? two(q) -> if :: Active -> // в активном состоянии if // находимся за локальным максимумом :: left > q && left > max -> max = left; // меняем информацию о локальном // максимуме out ! one(max) // передаем дальше :: else -> // переход в пассивное состояние Active = 0 fi :: else -> // пассивны - передаем параметр без обработки out ! two(q) A2. Пришло сообщение two(q): fi 1 . Если left больше и q, и max, то max:=left и послать сообщение one(max) 54 2. Иначе, узел становится пассивным.
  • 53. Фаза A3. Обработка сообщения о лидере :: in ? winner(q) -> // получено сообщение «лидер выбран» if // проверка: совпадает ли номером узла :: q != my_number -> printf("MSC: LOSTn"); // узел проиграл выборы :: else -> // узел выиграл выборы printf("MSC: LEADERn"); nr_leaders++; assert(nr_leaders == 1) fi; if // проверка: был ли найден лидер? :: know_winner // знал и уже посылал сообщение – // «лидер выбран» :: else -> out ! winner(q) // посылает сообщение fi; break Некоторые операторы языка Promela всегда выполнимы. 55 Например, break, skip, printf
  • 54. Основная функция, запускающая процессы init { byte proc; atomic { // рассматривается верификатором, // как одно действие proc = 1; do :: proc <= N -> run node (p[proc-1], p[proc%N], (N+I-proc)%N+1); proc++ :: proc > N -> break od } } Условие модели – одновременный запуск процессов! 56
  • 56. Количество состояний с асинхронными взаимодействиями 𝑛 • количество процессов 𝐶ℎ𝑎𝑛 • множество каналов 𝐿𝑎𝑏𝑒𝑙 𝑖 • множество меток процесса i 𝑉𝑎𝑟𝑖 • множество переменных процесса i 𝑑𝑜𝑚(𝑥) • область определения переменной x 𝑑𝑜𝑚(с) • область определения канала c 𝑐𝑎𝑝(с) • емкость канала с n     Labeli   dom( x)    dom(c) cap( c ) i 1   cChan xVari  Использование асинхронных каналов • увеличивает размер вектора глобального состояния системы • увеличивает число состояний системы 58
  • 57. Верификация алгоритма выбора лидера Алгоритм нетривиальный. Основная цель алгоритма – эффективность на большом числе процессов. Как можно проверить, что алгоритм корректный? Строить LTL формулы и проверять их выполнение с помощью Spin Проверяемые свойства: • лидер должен быть только один noMore: nr_leaders ≤ 1 // атомный предикат G noMore • лидер в конце концов будет выбран elected: nr_leaders == 1 // атомный предикат FG elected • номер выбранного лидера всегда будет максимальным nr == N // атомный предикат FG nr LTL-формула выполняется для любого пути, стартовавшего в допустимом начальном состоянии 59
  • 58. 61
  • 59. Режимы верификации • Основные режимы верификации SPIN: – Exhaustive – полный – Supertrace/Bitstate – супертрассы (с потерей состояний) – Hash-Compact – компактное хэширование • В SPIN есть различные способы уменьшения размера модели при верификации • Основные способы сокращения размеров модели: – Уменьшение затрат на хранение глобального состояния – Уменьшение числа состояний 62
  • 60. Заключение • SPIN успешно используется для построения моделей распределенных алгоритмов и систем • SPIN работает в режиме симуляции и верификации • SPIN позволяет верифицировать свойства линейной темпоральной логики • SPIN строит контрпример нарушения свойства, анализ которого позволяет выявить ошибку • SPIN строит синхронную композицию модели и отрицания заданной формулы – проводит верификацию методами с сжатием без потери состояний и с потерей 63
  • 61. Заключение • Основные типы объектов Promela – процессы определяют поведение – каналы используются для передачи сообщений между процессами – данные типов: bit(boolean), byte, short, int • Основные конструкции Promela – присваивание, выражение, вывод на экран и т.п. – отправка и получение сообщения, skip, – недетерминированный выбор по условию, оператор цикла – любая конструкция языка или выполнимая, или блокирующая – специальные конструкции для поддержки верификации • Promela работает только с моделями конечной размерности 64
  • 63. Задачи • Найти ошибку в задаче про автомат напитков • Изменить алгоритм выбора лидера в однонаправленном кольце так, чтобы верификация не проходила. Например, нарушим свойство «Всегда у лидера будет наибольший вес» • Проверить свойство «На всех путях всегда общее число проголосовавших равно 100%» 66