Little_hobbit

модель 1 обязанность

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