В Promela процесс с исполняемой инструкцией может быть запланирован для выполнения в любой заданный момент времени при условии, что ни один другой процесс в данный момент не выполняет непрерывная атомарная последовательность.
Одна инструкция, сама по себе, она выполняется атомарно. Чтобы иметь несколько инструкций в одной и той же атомарной последовательности, можно использовать либо atomic { }
, либо d_step { }
. Я отсылаю вас к этот другой вопрос по теме для изучения разницы среди двух.
В вашем случае возможная трассировка выполнения:
x++ // Q(), x := 4
z = y // P(), z := 5
y = y - x // R(), y := 1
Другой, вполне допустимый, возможный след выполнения:
y = y - x // R(), y := 2
x++ // Q(), x := 4
z = x // P(), z := 4
Процессы перемежаются друг с другом, что означает, что после каждой инструкции некоторого процесса P_i
(который не находится в непрерывной атомарной последовательности) процесс P_i
может быть вытеснен, а какой-то другой процесс P_j
может быть запланирован для выполнения. выполнение (при условии, что он действительно должен что-то выполнить).
Это ничем не отличается от того, что происходит в многозадачной машине unix, в которой процессы чередуются друг с другом и конкурируют за доступ к процессору.
person
Patrick Trentin
schedule
10.12.2018