SPIN Examples
SPIN Examples
SPIN Examples
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
flag0=1
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
flag0=1
turn=0
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
flag0=1
turn=0
flag1 == 0 || turn == 1
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
flag0=1
turn=0
flag1 == 0 || turn == 1
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
flag0=1
turn=0
flag1 == 0 || turn == 1
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
flag0=1
turn=0
flag1 == 0 || turn == 1
Critical
Section
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
flag0=1
turn=0 flag0=0
flag1 == 0 || turn == 1
Critical
Section
Mutual Exclusion
• Peterson’s solution to the mutual exclusion
problem
flag0=1
turn=0 flag0=0
flag1 == 0 || turn == 1
Critical
Section
proctype mutex0() {
flag0=1
turn=0 flag0=0
flag1 == 0 || turn == 1
Critical
Section
Bug Catching 12 15-398
Flavio Lerda Carnegie Mellon University SPIN Examples
proctype mutex0() {
flag0=1
turn=0 flag0=0
flag1 == 0 || turn == 1
Critical
Section
Bug Catching 13 15-398
Flavio Lerda Carnegie Mellon University SPIN Examples
flag0=1
turn=0 flag0=0
flag1 == 0 || turn == 1
Critical
Section
Bug Catching 14 15-398
Flavio Lerda Carnegie Mellon University SPIN Examples
flag[0] = 1;
flag0=1
turn=0 flag0=0
flag1 == 0 || turn == 1
Critical
Section
Bug Catching 15 15-398
Flavio Lerda Carnegie Mellon University SPIN Examples
flag[0] = 1;
flag0=1
turn = 0;
turn=0 flag0=0
flag1 == 0 || turn == 1
Critical
Section
Bug Catching 16 15-398
Flavio Lerda Carnegie Mellon University SPIN Examples
flag[0] = 1;
flag0=1
turn = 0;
(flag[1] == 0 || turn == 0);
turn=0 flag0=0
flag1 == 0 || turn == 1
Critical
Section
Bug Catching 17 15-398
Flavio Lerda Carnegie Mellon University SPIN Examples
flag[0] = 1;
flag0=1
turn = 0;
(flag[1] == 0 || turn == 0);
/* critical section */ turn=0 flag0=0
flag1 == 0 || turn == 1
Critical
Section
Bug Catching 18 15-398
Flavio Lerda Carnegie Mellon University SPIN Examples
flag[0] = 1;
flag0=1
turn = 0;
(flag[1] == 0 || turn == 0);
/* critical section */ turn=0 flag0=0
flag[0] = 0;
flag1 == 0 || turn == 1
Critical
Section
Bug Catching 19 15-398
Flavio Lerda Carnegie Mellon University SPIN Examples
Critical
Section
Bug Catching 20 15-398
Flavio Lerda Carnegie Mellon University SPIN Examples
flag[_pid] = 0;
goto again;
}
ncrit++;
assert(ncrit == 1); /* critical section */
ncrit--;
assert:
Checks that there are always
flag[_pid] = 0;
at most one process in the
goto again;
critical section
}
[] (critial[0] || critical[1])
active [2] proctype user()
{
[] <> (critical[0])
assert(_pid == 0 || __pid == 1);
[] <> (critical[1])
again:
flag[_pid] = 1;
[] (critical[0] ->
turn = _pid;
(critial[0] U
(flag[1 - _pid] == 0 || turn == 1 - _pid); (!critical[0] &&
((!critical[0] &&
critical[_pid] = 1; !critical[1]) U critical[1]))))
/* critical section */ [] (critical[1] ->
critical[_pid] = 0; (critial[1] U
(!critical[1] &&
flag[_pid] = 0; ((!critical[1] &&
goto again; !critical[0]) U critical[0]))))
}
msg0
ack0
msg1
ack1
msg0
ack0
msg1
msg0
ack1
msg0
ack0
msg0
msg0
ack0
msg1
ack1
Sender Process
active proctype Sender()
{
do
:: ::
if if
:: receiver?msg0; :: receiver?msg1;
:: skip :: skip
fi; fi;
do do
:: sender?ack0 -> break :: sender?ack1 -> break
:: sender?ack1 :: sender?ack0
:: timeout -> :: timeout ->
if if
:: receiver!msg0; :: receiver!msg1;
:: skip :: skip
fi; fi;
od; od;
od;
}
Receiver Process
active proctype Receiver() mtype = { msg0, msg1, ack0, ack1 }
{ chan sender = [1] of { mtype };
do chan receiver = [1] of { mtype };
::
do
:: receiver?msg0 ->
sender!ack0; break;
:: receiver?msg1 ->
server!ack1
od
do
:: receiver?msg1 ->
sender!ack1; break;
:: receiver?msg0 ->
server!ack0
od
od
}