29
1 Chair of Software Engineering Concurrent Object-Oriented Programming Arnaud Bailly, Bertrand Meyer and Volkan Arslan

Concurrent Object-Oriented Programming

  • Upload
    nancy

  • View
    28

  • Download
    0

Embed Size (px)

DESCRIPTION

Concurrent Object-Oriented Programming. Arnaud Bailly, Bertrand Meyer and Volkan Arslan. Lecture 3: Coordination Primitives. Coordination. Objects have a state . The set of available routines may depend on the current state. The Queue exhibits such a non-uniform service. - PowerPoint PPT Presentation

Citation preview

Page 1: Concurrent Object-Oriented Programming

1

Chair of Software Engineering

Concurrent Object-Oriented Programming

Arnaud Bailly, Bertrand Meyer and Volkan Arslan

Page 2: Concurrent Object-Oriented Programming

2

Chair of Software Engineering

Lecture 3: Coordination Primitives

Page 3: Concurrent Object-Oriented Programming

3

Chair of Software Engineering

Coordination

Objects have a state. The set of available routines may depend on the

current state. The Queue exhibits such a non-uniform service. Activity-centered coordination:

clients coordinate to prevent interfering actions. Invocations are never delayed. Objects are input-enabled.

Boundary coordination: the supplier may delay the acceptance of a call.

Introduction of synchronization code.

Page 4: Concurrent Object-Oriented Programming

4

Chair of Software Engineering

Issues about Synchronization code

How to write it?

Where to place it?

Can it be re-used?

Page 5: Concurrent Object-Oriented Programming

5

Chair of Software Engineering

Activity-Centered Coordination

Multiple Clients to 1 supplier: the goal is avoiding interference!

1 client accessing the supplier at a time. This is mutual exclusion. One can use “traditional” mechanisms:

polling on a shared variable (busy-wait), using semaphores, using conditional critical regions, and exchanging messages among clients.

The synchronization code is on the client side.

Page 6: Concurrent Object-Oriented Programming

6

Chair of Software Engineering

Semaphores [Dijkstra 68]

A semaphore s has: an integer value val, two atomic operations wait and signal, a queue of waiting calls.

When calling s.wait: if val>0 then do val := val -1 and return, else suspend and queue this call.

When calling s.signal: if there is a queued call resume it, else do val := val + 1.

Page 7: Concurrent Object-Oriented Programming

7

Chair of Software Engineering

Semaphore Implemented in Java

class Semaphore {private int val;public Semaphore (int n) {val = n;}

public synchronized sem_wait () { // Pif (val <= 0)

this.wait ();val = val – 1;

}

public synchronized sem_signal () { // Vthis.notify (); //no effect if no thread is waitingval = val + 1;

}

Page 8: Concurrent Object-Oriented Programming

8

Chair of Software Engineering

Semaphore as a Mutex in Java

class TOOLBOX{private int resource, number;private Semaphore s;public Example (int n) {number = n; s=new Semaphore (1);}

private void ex1() { s.sem_wait(); // critical section resource = 10; resource += 1; s.sem_signal (); // end of critical section }

private void ex2() { s.sem_wait(); // critical section resource = 4; resource += 3; s.sem_signal (); // end of critical section }

public static void main () {new Example (1).ex1;new Thread (new Runnable (public void run() {ex2();}));

}

Page 9: Concurrent Object-Oriented Programming

9

Chair of Software Engineering

Conditional Critical Region

[Brinch Hansen 72] and [Hoare 72]. Group variables into resources:

resource r is v, w,…,z; The critical region instruction is:

region r when Conditionthen StatementList end

Executes StatementList only when: resources are available, Condition is verified.

Resources are held during execution and freed on termination.

Page 10: Concurrent Object-Oriented Programming

10

Chair of Software Engineering

Using CCR in SCOOP-Like Syntax

class TOOLBOX // producer-consumer variationcreate makefeature

make (aa, ab, ac: STREAM) is do a:=aa; b:=ab; c:=ac endmerge is

dofromuntil false loop

do_merge (a, b, c)end

end

do_merge (a, b, c: STREAM) isrequire

not a.empty and not b.emptydo

c.put_string (a)c.put_string (b)

end

Page 11: Concurrent Object-Oriented Programming

11

Chair of Software Engineering

Using Message-passing

Solving variants of the consensus problem. Implementing distributed mutual exclusion. Confere the DSM exercise. Many other solutions:

distributed semaphores, solutions tolerating faults…

Page 12: Concurrent Object-Oriented Programming

12

Chair of Software Engineering

Boundary Coordination

The synchronization code is in the supplier class. Possible solutions:

live routines (POOL, ABCL/1), monitors (Ada95), delay Queues (Hybrid [Nierstrasz 92]), behavior abstractions (ACT++[Kafura & Lee 89]), Enable Sets (Rosette [Tomlinson & Singh 89]), method guards (Guide [Hagimont & al. 94]), path expressions (Procol [Bos & Laffra 90]).

Along the way, find solutions to control intra-object concurrency.

Page 13: Concurrent Object-Oriented Programming

13

Chair of Software Engineering

Monitors

A monitor is a language unit. It exhibits entries that can be called from outside. Only one entry executes at any time. Operations to interrupt and resume execution. Not unlike Java monitors. This allows clients to synchronize. All the synchronization code is enclosed inside

the monitor. (A form of) modularity is obtained. Idea: chosen classes could yield monitor objects! Protected objects in Ada 95.

Page 14: Concurrent Object-Oriented Programming

14

Chair of Software Engineering

Semaphore in Ada 95protected type Semaphore (Initial : Natural :=0) is

entry Wait; -- also known as Pprocedure Signal; -- also known as V

privateValue : Natural := Initial;

end Semaphore;

protected body Semaphore isentry Wait when Value > 0 isbegin

Value := Value – 1;end Wait;

procedure Signal isbegin

Value := Value + 1;end Signal;

end Semaphore;

Page 15: Concurrent Object-Oriented Programming

15

Chair of Software Engineering

Differences with Java

Java uses condition variables. Ada uses conditional wait (no notify()!). Java allows non-synchronized methods. Ada enforces synchronization among all entries. Java has one waiting queue per object. Ada has one waiting queue per entry. Java’s are queues are unordered. Ada queues are FIFO. In Java, which object is notify’ed is unknown. In Ada, it is the head of the queue. In Java, re-entrant calls are allowed.

Page 16: Concurrent Object-Oriented Programming

16

Chair of Software Engineering

The Eggshell Model

In Ada, the notified task gets to be executed immediately (immediate resumption).

Tasks inside the eggshell have priority over the ones outside. There is a requeue statement (even between distinct objects).

Protected object

Entry1

Entry2

c1

c4c2c3

Page 17: Concurrent Object-Oriented Programming

17

Chair of Software Engineering

Delay Queues

Each Object executes one routine at a time. Explicit management of queues, with queue

objects. Each routine (entry) is linked to a queue. A queue Q can be either closed or open. There are methods Q.open() and Q.close(). Very similar to include/exclude primitives.

Page 18: Concurrent Object-Oriented Programming

18

Chair of Software Engineering

BBuffer Using Hybrid Primitives

class BBUFFER ispublic interface:

put (t: OBJECT);OBJECT get();

implementation:private putQ, getQ : DELAYQUEUE;Boolean isFull, isEmpty;put (t: OBJECT) link PutQ is …

getQ.open ();if (isFull) then PutQ.close();

end;

OBJECT: get () link getQ is …putQ.open ()if (isEmpty) then getQ.close ();

end;end BBUFFER;

Page 19: Concurrent Object-Oriented Programming

19

Chair of Software Engineering

Behavior Abstractions

Classes have a behavior section. behavior associates enabled routines to states. become give transitions between states. The state description is close to the interface. Related to Actor languages.

Page 20: Concurrent Object-Oriented Programming

20

Chair of Software Engineering

BBuffer using ACT++ Primitives

class BBUFFER ispublic interface: … // as beforebehavior:

empty = {put}partial = {put, get}full = {get}

implementation:Boolean isFull, isEmpty;put (t: OBJECT) is …

if (isFull) then become full;else become partial;

end;

OBJECT: get () is …if (isEmpty) then become empty;else become partial;

end;end BBUFFER;

Page 21: Concurrent Object-Oriented Programming

21

Chair of Software Engineering

Enable Sets

Enable sets are first-class objects. An enable set is a set of (allowed) method names. The both method allows combinations of sets.

class BBUFFER ispublic interface: … // as beforeimplementation:

Enable empty () {return enable(put);}Enable partial () {return both(full(),empty());}Enable full() {return enable(get)}Boolean isFull, isEmpty;// the rest is identical to the ACT++ code.

end BBUFFER;

Page 22: Concurrent Object-Oriented Programming

22

Chair of Software Engineering

Variation on Enable Sets

A become statement can call next of class EnableSet.

class BBUFFER ispublic interface: … // as beforeimplementation:

private static EnableSet: next() isif isFull() return new EnableSet(get);if isEmpty() return new EnableSet(put);return new EnableSet(put, get);

endput (t: OBJECT) is

…become next();

end;OBJECT: get () is

…become next();

end;end BBUFFER;

Page 23: Concurrent Object-Oriented Programming

23

Chair of Software Engineering

Method Guards (Guide)

Each method has a guard that enables/disables it. Guards define (implicitly) the possible states. After each method execution guards are

evaluated. There is no explicit transitions in the code!

class BBUFFER ispublic interface: … // as beforeguards:put: !isFull()get: !isEmpty()implementation:

put (t: OBJECT) is … /* no code for transitions */ end;OBJECT get is … /* no code for transitions */ end;

end BBUFFER;

Page 24: Concurrent Object-Oriented Programming

24

Chair of Software Engineering

Path Expressions (Procol)

A path expression is a regular expression. It defines a finite-state automaton. The disjunction represents non-determinism.

class BBUFFER3 ispublic interface: … // as beforepath: (put, get|(put,get|(put,get)*)*)*implementation:

put (t: OBJECT) is … /* no code for transitions */ end;OBJECT get is … /* no code for transitions */ end;

end BBUFFER;

Page 25: Concurrent Object-Oriented Programming

25

Chair of Software Engineering

Controlling intra-object concurrency

In GUIDE, for a method m the guards can feature: invoked (m), started (m), completed (m), current (m) = started (m) – completed (m) pending (m) = invoked (m) – started (m)

Compatibility annotations [Löhr 92] tag methods that can be executed in parallel with others.

In CEiffel: no annotation implies mutual exlusion, “foo is --|| bar-- …” foo and bar can execute in

parallel, “foo is --||-- …” no restriction in parallelism.

Page 26: Concurrent Object-Oriented Programming

26

Chair of Software Engineering

Achieving Modularity [OOSC, Chap 3]

A module is a programming artifact that is: autonomous, self-contained.

In O-O languages: a module is a class. Respects the Linguistic Modular Unit and Open-

Closed Principles. Respects the information hiding rule. Relevance can be assessed with criteria:

composability and decomposability, understandability, continuity.

If successful, obtain components.

Page 27: Concurrent Object-Oriented Programming

27

Chair of Software Engineering

Boundary Coordination

Tends to break encapsulation: clients aware of supplier’s state, supplier implementation details do matter.

Tends to make re-use harder.

class Client inherits Thread { private BBuffer b;… public void run() { b.notFull.sem_wait();

b.put(new Object());b.notEmpty.signal();

}}

class BBuffer { public Semaphore notFull, notEmpty; public void put(o: Object) { … } public Object get() { … }}

Page 28: Concurrent Object-Oriented Programming

28

Chair of Software Engineering

Activity-centered coordination

Makes supplier behavior Encapsulated. Convenience of re-use may vary. Synchronization code can be:

interwoven with functional code, or isolated from it.

Synchronization code should be Separable.

Page 29: Concurrent Object-Oriented Programming

29

Chair of Software Engineering

To be continued…

Inheritance anomaly Contracts for concurrent objects