concurrency 7 - safety & liveness properties

67
Concurrency: safety & liveness properties ©Magee/Kramer Concurrency 7 - Safety & Liveness Properties

Upload: others

Post on 18-Apr-2022

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Concurrency

7 - Safety & Liveness Properties

��������� ��������� ��������

��������������������������������������������������������� ��

Page 2: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Repetition - Deadlock

���� �!��

� ������ � "�����������!�������#

� $���� �����%���������� ����� ���������

�������

� ������������� ������"����%������������������!������� �#

�&�� �� �

� ��� �����������

��� � �������� ������

�������������������������������������

Page 3: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Repetition - Necessary and Sufficient Conditions

������������������������������

����!�� ������������������������� ���'�� �����%����������� �������� �������

���� �����������!���������

!�� ����������������������� ���������%����� ����������� �'�����'����������� (���������������������� ���

"���#�$�����$�����

�� ��� (�������%���!�� ���)������� ��� ����������!��*� !����"��� ���%�'������'�#������������%�������������������%�

%���&����'�������

�� �� ����� �����"��� % ��#����!�� ��������������� ��������� ��!�� ������������������ ��'�� �������� ������������� % ������'����������� (�����

Page 4: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

���� �!��

Repetition - Dining Philosophers

phil[4]:PHIL

phil[1]:PHIL

phil[3]:PHIL

phil[0]:PHIL

phil[2]:PHIL

FORK FORK

FORK

FORK FORK

lef tright

right

right

right

lef t

lef t

right

lef t

lef t0

1

23

40

1

2

3

4

Applet

Diners

Thread

Philosopher1 n

Fork

1

n

PhilCanvas

display

controller

view

display

�������

�&�� �� �

Page 5: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Safety & Liveness Properties

��� �!���&��!��������������������%�!����������� �����+����%�����������������������!!���,�������������� ��������������������% ��!!���

�������+����%��������������� ������-../.0+1/& �����&��������� ���� ����������������% ��� ����

"����� ��� ������� �����!������%#

&�� �� ��1����������� �������

�� � !��!���%�������� ������� � !��!���%�������� �����

Page 6: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

♦ STOP��������� ����������"�����������������������#

♦ ERROR!�� ����"*2#�������� ��������������������

7.1 Safety

ACTUATOR=(command->ACTION),

ACTION=(respond->ACTUATOR

|command-> ERROR).

Trace to ERROR:commandcommand

♦ ����%����������,1+��"������������ �#

����'����$�$���� �������������������� ��� ��!!����

command

command

respond

-1 0 1

Page 7: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Safety - Property Specification

♦ERROR ����������������'��������� ��(������"3��� �!�����#�

♦ 4�� � !�����%��� �)�������������%������������!� ��%��'��� $�$������ �%������������� ��%�'������ ��(�������

property SAFE_ACTUATOR = (command ->

respond ->SAFE_ACTUATOR).

command

respond

command

respond

-1 0 1ACTUATOR =

(command ->(respond -> ACTUATOR|command -> ERROR)

|respond -> ERROR).

Page 8: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Safety Properties

property POLITE = (knock -> enter -> POLITE).

&��!���% �����������!������������ ����������������������� �

#��� 4����� ������)���� ����� ���������������!�����������!��!���%�������������� ��� ����

knock

enter

knock

enter

-1 0 1

1�� ����knock->enter ����

enter ����

knock->knock ����

Page 9: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Safety Properties

1���)����P ��� � !�����'����S)��������� ������� ��������������!����� αααα(S) ∩∩∩∩ αααα(P) �������������������� �� ���P)������'����ERROR������ �������

1����!���� %���������%�!��!�������

+�� ������� ���������������!�����������!��!���%�������������� ��� ��56� � !��������'����+���������''�� ���� ���� � ��������

7�'���)����������������� ���� ���"������������������%�!��!���%#)������ERROR ������ �������

+����%�property P �����������������������$���������������� �������%���� ���� �������� ����������������!���������P)����� �!�����%�P�

Page 10: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Safety Properties

♦ 7�'� ���'���!� ��%�������� ��� ����)�disaster )������� ���8

property CALM = STOP + { disaster }.

disaster

-1 0

�������%�!��!���%� ��������!� ����������������� �������������� �!�����)�������������� ���������!������

Page 11: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Safety Property – How to See Them

�1��� ������������������$����������

�1���!��!���%�������������$��'�����

�1���� !�� ��������� ���� ���������!� ��� �����

� 4������,1+����������� ����������!��!�������������� ������������9+&�

� 1��%�'��������� ������� ��������%����������������� ������ �����������������%����������!������������� ��������

� 4�������� !������ !���)������!� ��� �������������� !����������� �%����������������� ���������� !�� ���������: ���;�������������%������

� <�� ���%�� �����5�� !�� ��������)���� ����5��!� ��� ������=������� �> ������%������;��� !�� ���������!� ��� �����?

Page 12: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Safety - Mutual Exclusion

LOOP =(mutex.down-> enter -> exit ->mutex.up->LOOP).

||SEMADEMO = (p[1..3]:LOOP ||{p[1..3]}::mutex:SEMAPHORE(1)).

7�'����'�� �� ������������������������������� �������� �������������� ���� ����� ����8

property MUTEX =(p[ i :1..3]. enter -> p[ i ]. exit -> MUTEX).

||CHECK = (SEMADEMO || MUTEX).

��� �������%�������()��? @�������SEMAPHORE(2)8

Page 13: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

7.2 Single Lane Bridge Problem

��������������������������%�'��������������!�� �������������������������� �������(�����%)� ���� ������%� ��� �� �������%�������%����� �������������� ������ �������������%����������� ��������'�� ���� ���������������������� �������������������������������� ���� ��

Page 14: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - Model

♦ -��������� �����������������8

��������������

♦ 4������%�!�� �����8

��������������

♦ 4������%�!��!������8

=���'�%> red[ID].{enter,exit}

blue[ID].{enter,exit}

BRIDGE

propertyONEWAY

CARS

SingleLaneBridge

+��� ����������� �

Page 15: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - CARSmodel

const N = 3 // number of each type of carrange T = 0..N // type of car countrange ID= 1..N // car identities

CAR = ( enter -> exit ->CAR).

1�� ����������� ������� ���� ������!������ ���������������������)�'�� �������CONVOY��� ������������� ������ ������@��'������������� ���������� ���%�����!����<� ���������� ������ ������

||CARS = ( red :CONVOY || blue :CONVOY).

Page 16: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - CONVOYmodel

NOPASS1 = C[1], //preserves entry orderC[i:ID] = ([i]. enter -> C[i%N+1]).NOPASS2 = C[1], //preserves exit orderC[i:ID] = ([i]. exit -> C[i%N+1]).

||CONVOY = ([ID]:CAR||NOPASS1||NOPASS2).

&�� ��� 1.enter ���� 2.enter ���� 1.exit ���� 2.exit������� 1.enter ���� 2.enter ���� 2.exit ���� 1.exit

������ ���������

1.enter 2.enter

3.enter

0 1 2

1.exit 2.exit

3.exit

0 1 2

Page 17: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - BRIDGEModel

BRIDGE = BRIDGE[ 0][ 0], // initially empty bridgeBRIDGE[nr :T][ nb:T] = // nr: #red; nb: #blue

(when ( nb==0 ) red [ID]. enter -> BRIDGE[ nr+1 ][ nb]| red [ID]. exit -> BRIDGE[ nr-1 ][ nb]|when ( nr==0 ) blue [ID]. enter -> BRIDGE[ nr ][ nb+1 ]| blue [ID]. exit -> BRIDGE[ nr ][ nb-1 ]).

����� ��� ��� �� �������%����������)��������%��������� ������ �����

1���������� ����������� ������������ ������� ����������

.�� �����������%�����'������������'������������ ��������A"����� �*����#�

Page 18: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - BRIDGEModel

Warning - BRIDGE.-1.0 defined to be ERRORWarning - BRIDGE.0.-1 defined to be ERRORWarning - BRIDGE.-1.1 defined to be ERRORWarning - BRIDGE.-1.2 defined to be ERRORWarning - BRIDGE.-1.3 defined to be ERRORWarning - BRIDGE.0.4 defined to be ERRORWarning - BRIDGE.1.-1 defined to be ERRORWarning - BRIDGE.2.-1 defined to be ERRORWarning - BRIDGE.4.0 defined to be ERRORWarning - BRIDGE.3.-1 defined to be ERRORCompiled: BRIDGE

-���'����A)�exit � ������!�� ������� ��� �������������� �� ������

.� ���������()�� �!���� ����������� ������ ���ERROR�

Page 19: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - Safety Property “ONEWAY”

property ONEWAY = (red [ID]. enter -> RED[1]| blue [ID]. enter -> BLUE[1]),

RED[i:ID] = ( red [ID]. enter -> RED[i+1]|when (i==1) red [ID]. exit -> ONEWAY|when (i>1) red [ID]. exit -> RED[i-1]),

BLUE[j:ID]= ( blue [ID]. enter -> BLUE[j+1]|when (j==1) blue [ID]. exit -> ONEWAY|when (j>1) blue [ID]. exit -> BLUE[j-1]).

@����'��!� ��%�����'����$�$���� ��� �� ������� ����������� ������?�

@������������������� !�%)������������� ��������� ��� �%��������@�������� �������������������������%���� ���� ��������B��� �����%��������� ����

Page 20: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - Model Analysis

4�����������%�!��!���%�“ONEWAY”�������8

||SingleLaneBridge = (CARS||BRIDGE||ONEWAY).

No deadlocks/errors

Trace to property violation in ONEWAY:

red.1.enterblue.1.enter

||SingleLaneBridge = (CARS || ONEWAY).

4�����������%�!��!���%�“ONEWAY”�������8

C���������� �����.4D-�

Page 21: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Implementation/Property?

BRIDGE = BRIDGE[ 0][ 0], // initially empty bridgeBRIDGE[nr :T][ nb:T] = // nr: #red; nb: #blue

(when ( nb==0 ) red [ID]. enter -> BRIDGE[ nr+1 ][ 0]| red [ID]. exit -> BRIDGE[ nr-1 ][ nb]|when ( nr==0 ) blue [ID]. enter -> BRIDGE[ 0][ nb+1 ]| blue [ID]. exit -> BRIDGE[ nr ][ nb-1 ]).

property ONEWAY = (red [ID]. enter -> RED[1]| blue [ID]. enter -> BLUE[1]),

RED[i:ID] = ( red [ID]. enter -> RED[i+1]|when (i==1) red [ID]. exit -> ONEWAY|when (i>1) red [ID]. exit -> RED[i-1]),

BLUE[j:ID]= ( blue [ID]. enter -> BLUE[j+1]|when (j==1) blue [ID]. exit -> ONEWAY|when (j>1) blue [ID]. exit -> BLUE[j-1]).

Page 22: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Implementation/Property?

������������� !�� ������������� �����=�����>)�'������'�� ������

�&��!���%�����������!� ��%�������������������������������(��� ������� ��������� ���� �

�/��� ���������� ����������!� ��� ������"������������������!!%#�

�E��� ������ ���������������������� �������������%�����!� ��� ������"����!��!���%#��� ������������'��'����������������1���'�������������� �������� ����� �����'����������� �����1����!� ��� ��������� �������������������� �����������������������������

Page 23: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - Implementation in Java (UML)

����������� ����� ����������������"3�-<1-.F+-G#�

Runnable

RedCar BlueCar

BridgeCanvas

controlcontrol

Bridge

SafeBridge

displaydisplay

ThreadApplet

SingleLaneBridge

blue,red

��.�"� ����56�������#�B��.4D-�"!������56� ������#

Page 24: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - BridgeCanvas

��������� �����BridgeCanvas �������� ��������%�����+�����,��������� �!!����

class BridgeCanvas extends Canvas {public void init(int ncars) {…} // set #cars

public boolean moveRed(int i) throws Int’Exc’{…}// moves red car #i a step (if possible)// returns true if on bridge

public boolean moveBlue(int i) throws Int’Exc’{…}// moves blue car #i a step (if possible)// returns true if on bridge

public synchronized void freeze() {…}public synchronized void thaw() {…}

}

-� ��������H� �����!��������������� ���������������������

Page 25: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - RedCar

class RedCar implements Runnable {Bridge control; BridgeCanvas display; int id;

RedCar(Bridge b, BridgeCanvas d, int i) {control = b; display = d; id = i;

}

public void run() {try {

while ( true ) {while (!display.moveRed(id)) ; // not on br.control.redEnter(); // req access to br.while (display.moveRed(id)) ; // move on brcontrol.redExit(); // release access to br.

}} catch (InterruptedException _) {}

}}

+� �����%���������BlueCar ���+� �����%���������BlueCar ���

Page 26: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - Class Bridge

class Bridge {synchronized void redEnter() throws Int’Exc’ {…}synchronized void redExit() {…}synchronized void blueEnter() throws Int’Exc’ {…}synchronized void blueExit() {…}

}

������Bridge !��������������� !�� ��������� �������� ���� ��������������� ������������������� �������������������

*�����++++ ,

Page 27: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge

1��������������%)�����=����> �� ������ ������� ���������������������� ������SafeBridge � !�� ����������

Page 28: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Single Lane Bridge - SafeBridge

class SafeBridge extends Bridge {protected int nred = 0; // #red cars on br.protected int nblue = 0; // #blue cars on br.

// monitor invariant: nred �0 ∧∧∧∧ nblue �0 ∧∧∧∧// ¬¬¬¬(nred>0 ∧∧∧∧ nblue>0)

synchronized void redEnter() throws Int’Exc’ {while (nblue>0) wait (); ++nred;

}

synchronized void redExit() {--nred; if (nred==0) notifyAll ();

}}

1������������� ����������������� �����BRIDGE �����

1������������� ����������������� �����BRIDGE �����

Page 29: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

synchronized void blueEnter() throws Int’Exc’ {while (nred>0) wait ();++nblue;

}

synchronized void blueExit() {--nblue; if (nblue==0) notifyAll ();

}

Single Lane Bridge - SafeBridge

1����������� �����%���������'�� ���)�'������ ����������������� ����� ���'�����!�'������������������%�'���������� ������� ���������������������I����"����)�'������������� �������������������#�

������������%� ���� �������� ��������!!�������%���� ���������������8�1����������� ����� !��!���%�

Page 30: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

7.3 Liveness

����'��� !��!���%�������� ������������ ��� ��!!����

� �� ����� !��!���%�������� ������� ������ ����� �������� ��!!����

�������%� �����������% ��������!!�������%���� ����������������"����)� ����$������#8

��!��������!��!���% ������� �������������'�%� ���� ������������� ����������������% ��� �����

&������� ��������!!������������������ 5������� ������������ �� �������!����� �����������������'�� ������ ���������������� �����

Page 31: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress Properties - Fair Choice

COIN = (toss->heads->COIN|toss->tails->COIN).

toss

toss

heads

tails

0 1 2

-����.���� 4���� ��� �������������������������� ������ ��������������%������)���������%�����������������������'���������� ��������������%�������

7�'����������'�� ����toss "2#�2AA�AAA�B����toss "J#�2�B�����toss "2#�2AA�AAA�B�����toss "J#�2�B������C

-���,

Page 32: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress Properties

progress HEADS = {heads} ?

progress TAILS = {tails} ?

()�� �� ��!�������� No progress violations detected

progress P = {a 1, a 2, …, a n}

1��������������$�������$�$����)�P)�'�� ��������� ����������������������� �����)���������������������� ������a1)�a2)�C)�an '���������� ��������������%�������

COIN = (toss->heads->COIN | toss->tails->COIN).

����

����

Page 33: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

pick

pick toss

heads

toss

toss

tails

heads

0 1 2 3 4 5

Progress Properties

+�!!���������������'������ !�������� ���������� ��������!� �����!������������ ��������������� ���

TWOCOIN = (pick->COIN | pick->TRICK),COIN = (toss->heads->COIN | toss->tails->COIN).TRICK = (toss->heads->TRICK),

progress HEADS = {heads} ?

progress TAILS = {tails} ?

����

����

Page 34: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress Properties

progress HEADSorTails = {heads,tails} ?

progress HEADS = {heads}

progress TAILS = {tails}

Progress violation: TAILSPath to terminal set of states:

pickActions in terminal set:{toss, heads}

pick

pick toss

heads

toss

toss

tails

heads

0 1 2 3 4 5

����

Page 35: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress Analysis

����� ������������������ ����������'�� �����%������������� ��������� ����%���������������������������������� ���������������)������������������������������� �'�������������������%������������������������

1�� ��������� ����1@/�/4<�

K2)JL ����KM)$)NL

D��������� ��� �)��� ����� �����������!�������������� ���������'�� ���� ��� ������������������������������������������� ��������������%��������

+�� ������������������������������������� ��������)���%�� �������������������������������� ������� ������������%����������������� ���������������%��� �* ������� ����!����������!���������!����������������?

pick

pick toss

heads

toss

toss

tails

heads

0 1 2 3 4 5

Page 36: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress Analysis

��!��������!��!���%����������� �������%��������������� ������������������ ���'�� ����� �������!������������� �������!!�����

progress TAILS

= {tails}

in {1,2} ����

��'�����$������� �������% � ��������������!�����)������� �����'���������� ��������������%��������1��������(������������!� ��%��������!������!��������!��!���%��������%�� ������

pick

pick toss

heads

toss

toss

tails

heads

0 1 2 3 4 5

Page 37: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress Analysis – Default Progress

Progress violation for actions: {pick}Path to terminal set of states:

pickActions in terminal set:{toss, heads, tails}

Progress violation for actions: {pick, tails}Path to terminal set of states:

pickActions in terminal set:{toss, heads}

#��� ��������������56����%�������!��������!��!���%������"����)����%�� ����������� ��������������%����������������%��� � ����������������������� ������������������#�

pick

pick toss

heads

toss

toss

tails

heads

0 1 2 3 4 5�������!��������

Page 38: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress – Return of the Single Lane Bridge

progress BLUECROSS = { blue [ID]. enter }progress REDCROSS = { red [ID]. enter }

4 !�� �����������������!������������������

9���� ��� � ������������������%����%�!����������� ������� ���)��� ����������������'�� �� ������������������1������ ��!��������!����� ��'�� ������$����$�� �� ��� ���������!��� % ����� �����)�'�� �� �����������������������'�� ���������������� ����������

No progress violations detected.

��'��)��� ��������� �����������!�������?

Page 39: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress - Action Priority

� �����!������%���!������������ ������ ���������!��!�������

||C = (P||Q) <<{a1,…,an} �!� �������� � !�����������'�� ������� ����� a1,..,an ���������� !������%��������%�������� ��������������!�������� P||Q�� ������������������� ���� tau � 4����%� ��� �����������%��� �'�� ������������� ������������ �����a1,..,an �������� ������������)������������������������ '������'���!������%�� ������������� ������

7���&������%�"=<<>#

||C = (P||Q) >>{a1,…,an} �!� �������� � !�����������'�� ������� ����� a1,..,an ������'�� !������%��������%�������� ��������������!�������� P||Q�� ������������������� ���� tau � 4����%� ��� �����������%��� �'�� ������������� ����������������������������% a1,..,an)������������������������ �%�a1,..,an������� ������

,�'&������%�"=>>>#

Page 40: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress - action priority

NORMAL =(work->play->NORMAL|sleep->play->NORMAL).

||HIGH =(NORMAL)<<{work}.

||LOW =(NORMAL)>>{work}.

work

sleep

play

play

0 1 2

work

play

0 1

sleep

play

0 1

� �����!������%��� !���������������������,1+��%���� ���������'���!������%�� ��������� � ��� ���

Page 41: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

7.4 Congested Single Lane Bridge

progress BLUECROSS = { blue [ID]. enter }progress REDCROSS = { red [ID]. enter }

BLUECROSS* ��������%���������������� ����'��������������������

REDCROSS� ��������%��������������� ����'��������������������

||CongestedBridge = (SingleLaneBridge)>>{red[ID].exit,blue[ID].exit}.

.�������������������$������,

������������� ����!������%��������� "���� ������#�8����������4��!�� �� ��������������!������%���������������

4�������'�� ����%��� ������� �����������%���'����������!������%�������������� �������������� ������� �������������

Page 42: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Congested Single Lane Bridge Model

Progress violation: BLUECROSSPath to terminal set of states:

red.1.enterred.2.enter

Actions in terminal set:{red.1.enter, red.1.exit, red.2.enter, red.2.exit, red.3.enter, red.3.exit}

Progress violation: REDCROSSPath to terminal set of states:

blue.1.enterblue.2.enter

Actions in terminal set:{blue.1.enter, blue.1.exit, blue.2.enter, blue.2.exit, blue.3.enter, blue.3.exit}

1���� �����!�����'�����������������������)�'��� ��������������)�������!�������������'�� ����� ���� ���������������������������'���� ����������%�� �!%������������!������������������� ���� ��� ����� ��������

Page 43: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Congested Single Lane Bridge Model

red.1.enter

blue.1.enterblue.2.enter blue.1.exit blue.1.enter

blue.2.exit

red.2.enter red.1.exit red.1.enter

red.2.exit

0 1 2 3 4 5 6 7 8

||CongestedBridge = (SingleLaneBridge)>>{red[ID].exit,blue[ID].exit}.

&�����������������������������'���������������������� ����������������������������� $������,

.���������������'��������������������� ������������������,

Page 44: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress - Revised Single Lane Bridge Model

1����������������������'�'�������������� ��������������� ��� ������

�����%�CAR�

CAR = ( request ->enter->exit->CAR).

�����%�BRIDGE�

.�� �����������%�����'������������������������������������������� ��������������������� ��������������������������������������������������

���� �����������%�����'������������������������������������������ ��������������������� ��������������������������� ��������������������

Page 45: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress - Revised Single Lane Bridge Model

// nr : #red cars on br.; wr: #red cars waiting to enter// nb: #blue cars on br.; wb: #blue cars waiting to enter

BRIDGE = BRIDGE[0][0][ 0][ 0],

BRIDGE[nr:T][nb:T][ wr :T][ wb:T] = (red [ID]. request -> BRIDGE[nr][nb][ wr+1 ][ wb]

|when (nb==0 && wb==0)

red [ID]. enter -> BRIDGE[nr+1][nb][ wr-1 ][ wb]

| red [ID]. exit -> BRIDGE[nr-1][nb][ wr ][ wb]

| blue [ID]. request -> BRIDGE[nr][nb][ wr ][ wb+1]|when (nr==0 && wr==0 )

blue [ID]. enter -> BRIDGE[nr][nb+1][ wr ][ wb-1 ]

| blue [ID]. exit -> BRIDGE[nr][nb-1][ wr ][ wb]

).

/0���,/0���,

Page 46: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress - Analysis of Revised Single Lane Bridge Model

Trace to DEADLOCK:red.1.requestred.2.requestred.3.requestblue.1.requestblue.2.requestblue.3.request

1��� ��� �� ��� ���� � ���������� '�� �� ������ ���� ����'������� ��� ����� ����)� ���� ����(�����%)� ���� ������������ ���� ����'� ������� ������������ �������������

������,

4������ ���� ����% ���% �������!����� �" ���������!������!����#�

1����������������� ������������� ��������"bt #�'�� ������������������� ���%����� ������'����������������������������� ���������� ������������������������

����������%���������I��bt ����������������%����������� ��������!�� ���� ���

Page 47: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Progress - 2 nd Revision of Single Lane Bridge Model

const True = 1 const False = 0 range B = False..True

// bt: true ~ blue turn; false ~ red turn

BRIDGE = BRIDGE[0][0][ 0][ 0][ True ], BRIDGE[nr:T][nb:T][ wr :T][ wb:T][ bt :B] = (

red [ID]. request -> BRIDGE[nr][nb][ wr+1 ][ wb][ bt ]

|when (nb==0 && ( wb==0|| !bt ))

red [ID]. enter -> BRIDGE[nr+1][nb][ wr-1 ][ wb][ bt ]| red [ID]. exit -> BRIDGE[nr-1][nb][ wr ][ wb][ True ]

| blue [ID]. request -> BRIDGE[nr][nb][ wr ][ wb+1][ bt ]

|when (nr==0 && ( wr==0 || bt ))

blue [ID]. enter -> BRIDGE[nr][nb+1][ wr ][ wb-1 ][ bt ]

| blue [ID]. exit -> BRIDGE[nr][nb-1][ wr ][ wb][ False ]).

���������,���������,

Page 48: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Revised Single Lane Bridge Implementation - FairBridge

class FairBridge extends Bridge {protected int nred, nblue, wblue, wred;protected boolean blueturn = true ;

synchronized void request() {++wred;

}

synchronized void redEnter() throws Int’Exc’ {while (!(nblue==0 && (waitblue==0 || ! blueturn )))

wait ();--wred; ++nred;

}}

1������������� ����������������� ����� �����

1������������� ����������������� ����� �����

Page 49: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Revised Single Lane Bridge Implementation - FairBridge

class FairBridge extends Bridge {

synchronized void redExit(){--nred; blueturn = true ;if (nred==0) notifyAll ();

}}

1������������� ����������������� ����� �����

1������������� ����������������� ����� �����

Page 50: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Revised single lane bridge implementation - FairBrid ge

#��� '������������������������� ������'���(���� ������� �������1������������������ ������� ������ ������������� �� ������'���� ��������������������'������������������ ������ ���� ����������������

O��FairBridge ������

Page 51: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

7.5 Readers and Writers

���������������������� �������%��'�����������!�� �������*��������� ���������� �������������� �����������������'�����&������ �������� ���������!���������������������@������ ���������� ������� �������������������B���%��� �������.������� �%� �� �������%�� ��������

,�������������� ��������������� ����

Page 52: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers and Writers Model

♦ -��������� �����������������8

� (����.���)��������.���)�� (����@����)��������@����

♦ 4������%�!�� ������

.������)�@�������������.@F,� �

♦ 4������%�!��!�������

.@F+����

.@F&�������

♦+��� ����������� �

writer[1..Nwrite]:WRITER

reader[1..Nread]:READER

READERS_WRITERS acquireRead acquireWrite

READWRITELOCK

releaseRead releaseWrite

Page 53: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Model - READER& WRITER

set Actions = {acquireRead,releaseRead,acquireWrite,releaseWrite}

READER = ( acquireRead ->examine-> releaseRead ->READER)+ Actions\ {examine}.

WRITER = ( acquireWrite ->modify-> releaseWrite ->WRITER)+ Actions\ {modify}.

��!��������������� ���������������������������������� ����� ������ ������� ��������%�������%�!�������������� ���������!�� ����"���������#�

� ����������� ������������ ������examine ����modify ��������������������� �����%� ������������

Page 54: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Model - RW_LOCK

const False = 0 const True = 1 range Bool = False..Trueconst Nread = 2 // #readersconst Nwrite= 2 // #writers

RW_LOCK = RW[0][ False ],RW[readers :0..Nread][ writing :Bool] = (

when ( !writing ) acquireRead -> RW[ readers+1 ][ writing ]|releaseRead -> RW[ readers-1 ][ writing ]|when ( readers==0 && !writing )

acquireWrite -> RW[ readers ][ True ]|releaseWrite -> RW[ readers ][ False ]

).

1����� �� ����������� �������������� ��������������)�������������� ��������'�������

Page 55: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Model - Safety

property SAFE_RW = ( acquireRead -> READING[ 1]| acquireWrite -> WRITING),

READING[i:1..Nread] = ( acquireRead -> READING[ i+1 ]|when ( i>1 ) releaseRead -> READING[ i-1 ]|when ( i==1 ) releaseRead -> SAFE_RW),

WRITING = ( releaseWrite -> SAFE_RW).

@�� ��� �� �������.@F,/����������������������%�!��!���%CC

||READWRITELOCK = (RW_LOCK || SAFE_RW).

Page 56: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Model

���ERROR� �������������������'�������������%��������"release �������acquire��� ����������'���������#�

@�� �����'� � !��������READWRITELOCK'����READER����WRITER!�� ������� ������������������ ����C

||READERS_WRITERS = (reader[1..Nread]:READER

|| writer[1..Nwrite]:WRITER || {reader[1..Nread],

writer[1..Nwrite]}::READWRITELOCK).

��'��������1����������������,

acquireRead

releaseRead

acquireWrite

releaseWrite

releaseRead

releaseWrite

acquireRead

releaseRead

releaseWrite

acquireRead

releaseRead

releaseWrite

-1 0 1 2 3

Page 57: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

progress WRITE = {writer[1..Nwrite].acquireWrite}progress READ = {reader[1..Nread].acquireRead}

Readers/Writers Model - Progress

WRITE* ��������%������������'������ '����� (����@����

READ - ��������%������������������� '����� (����.���

||RW_PROGRESS = READERS_WRITERS >>{reader[1..Nread].releaseRead,

writer[1..Nread].releaseWrite}.

1����������������,��()�,

�����$�������2������������������ �����3,

'����'�������!������%����������������� ���������������������� ����'��������

Page 58: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Model - Progress

Progress violation: WRITEPath to terminal set of states:

reader.1.acquireReadActions in terminal set:{reader.1.acquireRead, reader.1.releaseRead,

reader.2.acquireRead, reader.2.releaseRead}

&���������� ������1����� ����������������������!�����I�����

reader.1.acquireRead

reader.2.acquireRead

writer.1.acquireWrite

writer.2.acquireWrite

writer.2.releaseWrite

writer.1.releaseWrite

reader.1.acquireRead

reader.1.releaseRead

reader.2.releaseRead

reader.2.acquireRead

0 1 2 3 4 5

)��������$$���4

Page 59: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Implementation - Monitor Interface

interface ReadWrite {void acquireRead() throws Int’Exc’;void releaseRead();void acquireWrite() throws Int’Exc’;void releaseWrite();

}

@������������������� � �������������������� ������� ������������ �������� !�� �����)����������!����� ������������������� !�� ������������������������� ����

9�����%)�������'��READWRITELOCK.

@���� ���������� �������� !�� ���������

Page 60: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Implementation - ReadWriteSafe

class ReadWriteSafe implements ReadWrite {protected int readers = 0;protected boolean writing = false ;

synchronized void acquireRead() throws Int’Exc’ {while (writing) wait ();++readers;

}

synchronized void releaseRead() {--readers;if (readers==0) notify ();

}}

O���� ���������� '����� '������� ������������

Page 61: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Implementation - ReadWriteSafe

synchronized void acquireWrite() throws Int’Exc’ {while (readers>0 || writing) wait ();writing = true ;

}

synchronized void releaseWrite() {writing = false ;notifyAll ();

}

O���� ����� �������

7�'���)������ �������� !�� �������������������� �����@.41-�!��������!����� ��!������������������� �������������� �������������� ��������!�����I�����

������,

Page 62: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers - Writer Priority

����������5�� ����������������������'������'�������set Actions = {acquireRead,releaseRead,acquireWrite ,

releaseWrite, requestWrite }

WRITER = (acquireWrite ->

modify ->releaseWrite -> WRITER) +Actions

\{modify}.

requestWrite ->

Page 63: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Model - Writer Priority

RW_LOCK = RW[0][False][ 0],RW[readers:0..Nread][writing:Bool][ waitingW :0..Nwrite] = (

when (!writing && waitingW==0 ) acquireRead -> RW[readers+1][writing][waitingW]

|releaseRead -> RW[readers-1][writing][waitingW]

|when (readers==0 && !writing) acquireWrite -> RW[readers][True][ waitingW-1 ]

|releaseWrite -> RW[readers][False][waitingW]| requestWrite -> RW[readers][writing][ waitingW+1 ]

).

��'��������1����������������,�

|| RW_P = R_W >>{*.release*}. // simulate Intensive usage

Page 64: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Model - Writer Priority

Progress violation: READPath to terminal set of states:

writer.1.requestWritewriter.2.requestWrite

Actions in terminal set:{writer.1.requestWrite, writer.1.acquireWrite,

writer.1.releaseWrite, writer.2.requestWrite, writer.2.acquireWrite, writer.2.releaseWrite}

*��������� ������'���'�%����'�����'��������

No deadlocks/errors

$�$�����RW_SAFE�

$�������READ����WRITE�

��$������ ����� �%����������� ���%�������������%� ���������� ���������'����)���������������������%�'�������� �����!�������������� ������

Page 65: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Implementation - ReadWritePriority

class ReadWritePriority implements ReadWrite {protected int readers = 0;protected boolean writing = false ;protected int waitingW = 0 ; // #waiting writers

synchronized void acquireRead() throws Int’Exc’ {while (writing || waitingW>0 ) wait ();

++readers;}

synchronized void releaseRead() {--readers;if (readers==0) notify ();

}}

Page 66: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Readers/Writers Implementation - ReadWritePriority

synchronized void acquireWrite() throws Int’Exc’ {++waitingW ;while (readers>0 || writing) wait (); --waitingW ;writing = true ;

}

synchronized void releaseWrite() {writing = false ;notifyAll ();

}

���� *6�� ����&* )6 !��������!��!������� �����������������%�������� ���������� ������������������+������,�����������

Page 67: Concurrency 7 - Safety & Liveness Properties

Concurrency: safety & liveness properties ©Magee/Kramer

Summary

���� �!��� $�$�������� ������������%�!����������� �����

� ��'���� ��������������!!����

� �� ������� �� ��������������������% ��!!���

�������� ��'���� ������ ������-../.0+1/& �����

�$�����'����$�$�����������$$�$������������

� $�������� ���� ����������������%���� �����

����� ��� ������� �����!������%

�$$���$�����������������'�����������������������

�&�� �� �� ������������ ������� ���� $�$����������'����