concurrency important and difficult (ada slides copied from ed schonberg)

36
Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Upload: marley-woolson

Post on 14-Dec-2015

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Concurrency

Important and difficult

(Ada slides copied from Ed Schonberg)

Page 2: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Asynchronous concurrency

Two threads of computation proceed “simultaneously”. Don’t know the relative timing in advance.

Threads must communicate, and they must sometimes synchronize.

Page 3: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Difficulties

• Non-deterministic. What happens may depend on the relative timing. A program is correct only if it is correct for all possible interleavings of steps. For 2 thread each with N steps there are C(2N,N) ≈ 2N interleavings.

• Interaction with multi-process OS (or not?). Scott has a detailed account.

Page 4: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Architectures

• Low-level architecture and peripherals. Universal, but below the PL level.

• Multiple CPUs. Not uncommon, but rarely enough for all the threads you want.

• Pseudo-parallelism. “Time sharing”. CPU executes some of one thread, then changes to another.

• Computers on a network. Languages for distributed system are different, reflecting the high cost of communication.

Page 5: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Common forms of synchronization

• Mutual exclusion.

• Condition synchronization.

• Barriers

Page 6: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Mutual exclusion

Only one thread at a time can enter its critical section.

• Shared resources: e.g. printer, terminal, speaker.

• Shared memory.

Page 7: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Race condition

Thread A: Thread B:

X = X+10; X = X+20;

Assembly

A1: LOAD R1, X B1: LOAD R2,X

A2: ADD R1, 10 B2: ADD R2, 20

A3: STORE R1, X B3: STORE R2,X

Page 8: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Race condition (cntd)

X = 10 R1 R2

A1: LOAD R1,X 10

B1: LOAD R2,X 10

A2: ADD R1, 10 20

B2: ADD R2, 20 30

B3: STORE R2, X 30

A3: STORE R1,X 20

Page 9: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Condition synchronization

Suspend the thread until some condition is met.

• In a complex calculation, thread A may have to wait for the result of B in order to continue.

• In a web search engine, a thread requests a web page from a server, then waits until the page arrives

Page 10: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Barriers

Make sure that all the threads have reached a “barrier point” before any proceed past it.

E.g. in simulation of a physical system, have a thread for each physical part, compute behavior over a time step. Make sure that all parts finish one time step before any proceed to the next.

Page 11: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Tasks in Ada

Individual tasks and task types.

Task declaration

task boss;

task body boss is begin … end

Task type declaration

type task worker;

type Worker_id is access worker;

task body worker is begin … end

Page 12: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Task Declarations

• Individual tasks and task types• A task can be a component of a composite• The number of tasks in a program is not fixed

at compile time.

W1, W2: worker;

type Crew is array (integer range <>)

of worker;

First_Shift: Crew(1 .. 10);

Page 13: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Task Activation: When does a task start running?

• Individual task at start of program.• If statically allocated, at next begin.• If dynamically allocated, at the point of allocation.declare W1, W2: Worker; Joe: Worker_ID := new Worker; // starts working at once. Third_Shift: Crew(1..N) of Worker begin \\ start W1, W2, Third_Shift … end ; \\ wait for W1, W2, Third_Shift, to complete \\ (not Joe).

Page 14: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Task Services

• A task can perform some actions (entries) on request from another task.

• The declaration of the task specifies the available entries.

• A task can also execute actions on its own behalf.

task type Device is entry Read (X: out Integer); entry Write(X: Integer); end Device;

Page 15: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Synchronization: Rendezvous

• Caller makes explicit request: entry call.• Callee (server) states its availability; accept

statement.• If server is not available, caller blocks and

queues up on the entry for later service.• If both present and ready, parameters are

transmitted to server.• Server performs body of entry• Out parameters are transmitted to caller.• Both caller and server continue execution.

Page 16: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Example: 1 item shared buffer

task Buffer is entry Put(X: in Item); entry Get(X: out Item);end;task body Buffer is V: Item;begin loop accept Put(X: in Item) do V := X; end Put; accept Get(X: in Item) do X := V; end Get; end loop;end Buffer:To call: Buffer.Put(…), Buffer.Get(…)

Page 17: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Example: Mutual Exclusion

task type Mutex is entry Lock(); entry Unlock();end;task body Mutex isbegin loop accept Lock() do ; end Lock; accept Unlock() do ; end Unlock; end loop; end Mutex;

Page 18: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

task XMutex: Mutex;

Thread A Thread B

XMutex.Lock(); XMutex.Lock();

X := X+10; X := X+20;

XMutex.Unlock(); XMutex.Unlock();

Page 19: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Delays and Time

• A delay statement can be executed anywhere at any time to make current task quiescent for a stated duration or until a specified time:

delay 0.2; -- unit is seconds

-- type is Duration.

delay until Noon;

Page 20: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Conditional communication

• Need to protect against excessive delays, deadlock, starvation, caused by missing or malfunctioning task

• Timed entry: Caller waits for rendezvous a stated amount of time:

select D.Write(997); -- D is a task or delay 0.2 end select

Page 21: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Conditional communication (ii)

Conditional entry call: Caller ready for rendezvous only if no one else is queued and rendezvous can begin at once.

select D.Write(997); else Put_Line(“Device busy”);end select;

Print message if call cannot be accepted immediately.

Page 22: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Conditional communication (iii)

The server may accept a call only if the internal state of the task is appropriate:

select when not full => accept Write(V: integer); or when not empty => accept Read(V: integer); or delay 0.2;end select

If several guards are satisfied and callers are present, then any one of the calls may be accepted: Non-determinism.

Page 23: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Readers/Writers problem

Problem: Various tasks want to read and write to the same data (a chunk of data of some size).

Writers must be mutually exclusive with one another and with readers, but readers need not be.

Page 24: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

accept with and without body

accept Write do V := X; end

-- caller must wait until “end”

accept Start;

-- caller must synchronize but need not wait after acceptance.

Page 25: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Common barrier

Problem: N threads must move through iterations of a loop in lock-step.

Controller:loop for I in 1 .. NThreads) loop accept finish; end loop; for I in 1 .. NThreads) loop accept continue; end loop;end loop;

Page 26: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Common barrier (cntd)

Each of the computational threads has the following form:

for I in 1 .. NumIterations loop

… body of iteration …

Controller.finish();

Controller.continue();

end loop;

Page 27: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Protected variables

Built-in mechanism for mutual exclusion and readers/writers on data.

Page 28: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Concurrency in Java

• A thread is an object.

• Two ways to define a class of threads– extend class Thread and override run();– implement interface runnable and define

run();

interface runnable {

public void run (); };

Page 29: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Creating a thread by extending Thread.

class plum extends Thread {

public void run() { … } }

plum P = new plum(); // creates thread P

P.start(); // starts P running. • The start method is inherited from Thread and

calls the “run” method.• Alternatively, you can write

new Plum().start();

Page 30: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Creating a thread by implementing Runnable

class Pear implements Runnable {

public void run() { … }

Thread t1 = new Thread(new Pear());

t1.start();

or

new Thread (new Pear()).start();

Page 31: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Pros and Cons of implementing Runnable

• Advantage: You can derive the new Thread class from a non-Thread class.

• Disadvantage: You cannot directly access Thread methods in the run method.

• But there is a workaround: class of I implements Runnable { public void run { Thread t = Thread.currentThread(); try { t.sleep(1000); } catch (InterruptedException ie) {return;} } }

Page 32: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Example of non-interacting threads

Finding primality of N by dividing the range of potential factors into intervals and assigning each interval to a thread

(primality.java).

Page 33: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Mutual exclusion in Java

Static methods:

static synchronized void IncrX(int I)

{ X = X+I; }

Only one such method can run at a time.

Mutual exclusion on an object;

static object XMutex = new object();

synchronized(XMutex) { X = X+I; }

Static class members: 1 instance per class.

Page 34: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Mutual exclusion over a method

Declaring a method “synchronized” means that calls to this method for a particular object of the class are mutually exclusive.

Page 35: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Mutual exclusion over a method (example)

class account { int Value = 0; synchronized void deposit(int D) { X = X+D; } } account Fred, George;Fred.deposit(10) and Fred.deposit(20) are

mutually exclusive.Fred.deposit(10) and George.deposit(20) are

not.

Page 36: Concurrency Important and difficult (Ada slides copied from Ed Schonberg)

Wait/notify in Java

analogous to Ada rendezvous.