Little_hobbit

модель 1 отсутсиве голодания

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