Advertisement
Little_hobbit

model1 первоначальная

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