Little_hobbit

модель 1 глобальный ассерт

May 7th, 2021
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.98 KB | None | 0 0
  1. #define N 5
  2.  
  3. int enter_queue[N] = N; // Запросы на вход
  4. bool on[N]; // Разрешения на вход
  5.  
  6. int queue_index;
  7.  
  8. byte counter;
  9.  
  10. // Макрос для указания готовности КС
  11. inline enter(n)
  12. {
  13. /* Используется детерминированный шаг для того
  14. * чтобы избавиться от недерминизма: если процессы переключатся
  15. * перед сдвигом указателя - будет перетёрта запись от пред. процесса
  16. */
  17. d_step {
  18. enter_queue[queue_index] = n;
  19. queue_index = (queue_index + 1) % N;
  20. }
  21. }
  22.  
  23. active [N] proctype P()
  24. {
  25. do
  26. ::
  27. skip;
  28.  
  29. entry: // Готовность зайти в критическуб зону
  30. enter(_pid);
  31. on[_pid] -> skip; // Вход в крит. зону
  32.  
  33. // Критическая зона
  34. crit: counter++;
  35. // assert(counter == 1);
  36. counter--;
  37.  
  38. exit:
  39. // Освобождение критической зоны
  40. on[_pid] = false;
  41.  
  42. // Цикл может прерваться
  43. if
  44. :: skip
  45. :: break
  46. fi
  47. od
  48. }
  49.  
  50. active proctype coordinator()
  51. {
  52. byte iter; // Итератор по enter_queue
  53. end:do
  54. ::
  55. /* Просмотр enter_queue можно реализовать по кольцу
  56. * чтобы обеспечить FIFO справедливость
  57. */
  58.  
  59. // Ждём номер процесса в enter_queue
  60. enter_queue[iter] != N;
  61.  
  62. // Получаем номер процесса
  63. int proc_num = enter_queue[iter];
  64.  
  65. // Помечаем использованный элемент очереди
  66. enter_queue[iter] = N;
  67.  
  68. // Допускаем процесс и ждем, пока освободится
  69. on[proc_num] = true -> !on[proc_num];
  70.  
  71. // Идем к след. запрос
  72. iter = (iter + 1) % N;
  73. od
  74. }
  75.  
  76. active proctype invariant()
  77. {
  78. d_step {
  79. !(counter <= 1) -> assert(counter <= 1)
  80. }
  81. }
  82.  
Advertisement
Add Comment
Please, Sign In to add comment