2

Lets say we have this piece of code:

int x = 3;
int y = 5;
int z = 0;

active proctype P(){
   if
      :: x > y -> z = x
      :: else -> z = y
   fi
}

active proctype Q(){
    x++
}

active proctype R(){
    y = y - x
}

I don't understand what interleavings are. What exactly are interleaving and where and how many are there in my example above?

Patrick Trentin
  • 7,126
  • 3
  • 23
  • 40
jdoe
  • 65
  • 4

1 Answers1

0

In Promela, a process with an executable instruction can be scheduled for execution at any given point in time, provided that no other process is currently executing a uninterruptible atomic sequence.

A single instruction, on its own, it is executed atomically. In order to have multiple instructions in the same atomic sequence, one can use either atomic { } or d_step { }. I refer you to this other question on the topic for learning the difference among the two.


In your case, a possible execution trace is:

x++           // Q(), x := 4
z = y         // P(), z := 5
y = y - x     // R(), y := 1

Another, totally admissible, possible execution trace is:

y = y - x     // R(), y := 2
x++           // Q(), x := 4
z = x         // P(), z := 4

The processes are interleaved with one another, meaning that after each instruction of some process P_i (which is not in an uninterruptible atomic sequence), the process P_i can be preempted and some other process P_j can be scheduled for execution (provided that it actually has to execute something).

It is is nothing different from what happens in a multi-tasking unix machine, in which processes are interleaved one another and compete for access to the CPU.

Patrick Trentin
  • 7,126
  • 3
  • 23
  • 40