1 concurrent programming. 2 outline concurrent programming –processes –threads suggested...

43
1 Concurrent Programming

Upload: myron-martin

Post on 04-Jan-2016

256 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

1

Concurrent Programming

Page 2: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

2

Outline

• Concurrent programming – Processes

– Threads

• Suggested reading:– 12.1, 12.3

Page 3: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

3

Concurrency

• Concurrency is a general phenomenon

– Hardware exception handlers

– Processes

– Unix signal handlers

Page 4: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

4

Concurrency

• Application-level concurrency is useful

– Responding to asynchronous events

– Computing in parallel on multiprocessor

– Accessing slow I/O devices

– Interacting with humans

– Reducing latency by deferring work

– Servicing multiple network clients

Page 5: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

5

Concurrency

• Concurrent programming

– Applications that use application-level concurrency

• Three basic approaches for concurrent

programming

– Processes

– Threads

– I/O multiplexing

Page 6: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

6

Concurrency

• Concurrent programming is hard

– The human mind trends to be sequentialsequential

– Thinking about all possible all possible sequences of

events in a computer system is at least error

prone and frequently impossible

– Classical problem classes of concurrent

programs

• Data races, deadlock, and livelock/starvation

Page 7: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Client / ServerSession

Iterative Echo ServerClient Server

socket socket

bind

listen

rio_readlineb

rio_writenrio_readlineb

rio_writen

Connectionrequest

rio_readlineb

close

closeEOF

Await connectionrequest fromnext client

open_listenfd

open_clientfd

acceptconnect

7

Page 8: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Review: Iterative Echo Server

int main(int argc, char **argv) { int listenfd, connfd, port = atoi(argv[1]); struct sockaddr_in clientaddr; int clientlen = sizeof(clientaddr);

listenfd = Open_listenfd(port); while (1) { connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen); echo(connfd); Close(connfd); } exit(0);}

– Accept a connection request– Handle echo requests until client terminates

8

Page 9: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Iterative Servers

• Iterative servers process one request at a time

client 1 server client 2

connect

accept connect

write read

call read

close

accept

write

read

close

Wait for Client 1

call read

write

ret read

writeret read

9

Page 10: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Where Does Second Client Block?

• Second client attempts to connect to iterative server

• Call to connect returns– Even though connection not

yet accepted– Server side TCP manager

queues request– Feature known as “TCP listen

backlog”

• Call to rio_writen returns– Server side TCP manager

buffers input data

• Call to rio_readlineb blocks– Server hasn’t written

anything for it to read yet.

Client

socket

rio_readlineb

rio_writen

Connectionrequest

open_clientfd

connect

10

Page 11: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Fundamental Flaw of Iterative Servers

• Solution: use concurrent servers instead– Concurrent servers use multiple concurrent flows to serve

multiple clients at the same time

Client 1 blockswaiting for

userto type in data

Client 2 blockswaiting to read from server

Server blockswaiting fordata from

Client 1

client 1 server client 2

connect

accept connect

write read

call readwrite

call readwriteret read

11

Page 12: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Concurrent Programming with processes

Client-1

clientfd

Connectionrequest

listenfd

Server

12

Page 13: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Concurrent Programming with processes

Client-1

clientfd

Data transfer

listenfd

Server

ServerChild-1

connfd

13

Page 14: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Concurrent Programming with processes

Connectionrequest

listenfd

Client-2

clientfd

Server

Client-1

clientfd

Data transfer ServerChild-1

connfd

14

Page 15: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Concurrent Programming with processes

listenfd

Client-2

clientfd

Server

ServerChild-2

connfd

Client-1

clientfd

Data transfer ServerChild-1

connfd

Data transfer

15

Page 16: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Concurrent Programming with processes

listenfd

Client1. Server blocks in accept, waiting for connection request on listening descriptor listenfd

clientfd

Server

listenfd

Client

clientfd

Server2. Client makes connection request by calling and blocking in connect

Connectionrequest

listenfd

Client

clientfd

Server3. Server returns connfd from accept. Forks child to handle client. Client returns from connect. Connection is now established between clientfd and connfdServer

Childconnfd

16

Page 17: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

17

Concurrent Programming with Processes

• Kernel provides multiple control flows with

separate address spaces.

• Standard Unix process control and signals.

• Explicit interprocess communication

mechanism

Page 18: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

int main(int argc, char **argv) { int listenfd, connfd, port = atoi(argv[1]); struct sockaddr_in clientaddr; int clientlen = sizeof(clientaddr);

Signal(SIGCHLD, sigchld_handler); listenfd = Open_listenfd(port); while (1) { connfd = Accept(listenfd, (SA *) &clientaddr, &clientlen); if (Fork() == 0) { Close(listenfd); /* Child closes its listening socket */ echo(connfd); /* Child services client */ Close(connfd); /* Child closes connection with client */ exit(0); /* Child exits */ } Close(connfd); /* Parent closes connected socket (important!) */ }}

Process-Based Concurrent Server

Fork separate process for each client

Does not allow any communication between different client handlers

18

Page 19: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

19

Implementation issues with process

• Server should restart accept call if it is

interrupted by a transfer of control to the

SIGCHLD handler

• Server must reap zombie children

– to avoid fatal memory leakvoid sigchld_handler(int sig) { while (waitpid(-1, 0, WNOHANG) > 0)

; return;}

Page 20: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

20

Implementation issues with process

• Server must close its copy of connfd.

– Kernel keeps reference for each socket.

– After fork, refcnt(connfd) = 2.

– Connection will not be closed until

refcnt(connfd)=0.

Page 21: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Process Execution Model

– Each client handled by independent process– No shared state between them– Both parent & child have copies of listenfd and connfd

• Parent must close connfd• Child must close listenfd

Client 1ServerProcess

Client 2ServerProcess

ListeningServerProcess

Connection Requests

Client 1 data Client 2 data

21

Page 22: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

22

Pros and cons of process

• + Handles multiple connections

concurrently

• + Clean sharing model

– descriptors (no)

– file tables (yes)

– global variables (no)

• + Simple and straightforward.

Page 23: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

23

Pros and cons of process

• - Additional overhead for process control.

• - Nontrivial to share data between

processes.

– Requires IPC (inter-process communication)

mechanisms

• FIFO’s (named pipes), System V shared memory and

semaphores

Page 24: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

24

Traditional view of a process

• Process = process context + code, data, and stack

shared libraries

run-time heap

0

read/write data

Program context: Data registers Condition codes Stack pointer (SP) Program counter (PC)Kernel context: VM structures Descriptor table brk pointer

Code, data, and stack

read-only code/data

stackSP

PC

brk

Process context

Page 25: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

25

Alternate view of a process

• Process = thread + code, data, and kernel context

shared libraries

run-time heap

0

read/write dataThread context: Data registers Condition codes Stack pointer (SP) Program counter (PC)

Code and Data

read-only code/data

stackSP

PC

brk

Thread (main thread)

Kernel context: VM structures Descriptor table brk pointer

Page 26: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

26

A process with multiple threads

• Multiple threads can be associated with a process– Each thread has its own logical control flow

(sequence of PC values)

– Each thread shares the same code, data, and kernel context

– Each thread has its own thread id (TID)

Page 27: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

27

A process with multiple threads

shared libraries

run-time heap

0

read/write dataThread 1 context: Data registers Condition codes SP1 PC1

Shared code and data

read-only code/data

stack 1

Thread 1 (main thread)

Kernel context: VM structures Descriptor table brk pointer

Thread 2 context: Data registers Condition codes SP2 PC2

stack 2

Thread 2 (peer thread)

Page 28: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Logical View of Threads

• Threads associated with process form a pool of peers– Unlike processes which form a tree hierarchy

P1

sh sh sh

foo

bar

T1

Process hierarchyThreads associated with process foo

T2T4

T5 T3

shared code, dataand kernel context

P0

28

Page 29: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Thread Execution

• Single Core Processor– Simulate concurrency

by time slicing

• Multi-Core Processor– Can have true

concurrency

Time

Thread A Thread B Thread C Thread A Thread B Thread C

Run 3 threads on 2 cores29

Page 30: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Threads vs. Processes

• How threads and processes are similar– Each has its own logical control flow– Each can run concurrently with others (possibly

on different cores)– Each is context switched

30

Page 31: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Threads vs. Processes

• How threads and processes are different– Threads share code and some data

• Processes (typically) do not

– Threads are somewhat less expensive than processes

• Process control (creating and reaping) is twice as expensive as thread control

• Linux numbers:– ~20K cycles to create and reap a process– ~10K cycles (or less) to create and reap a thread

31

Page 32: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

32

Posix threads (Pthreads) interface

• Pthreads: Standard interface for ~60 functions – Manipulate threads from C programs– Creating and reaping threads

• pthread_create• pthread_join

– Determining your thread ID• pthread_self

– Terminating threads• pthread_cancel• pthread_exit• exit [terminates all threads] • return [terminates current thread]

Page 33: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

The Pthreads "hello, world" Program

/* hello.c - Pthreads "hello, world" program */#include "csapp.h"

/* thread routine */void *thread(void *vargp) { printf("Hello, world!\n"); return NULL;}

int main() { pthread_t tid;

Pthread_create(&tid, NULL, thread, NULL); Pthread_join(tid, NULL); exit(0);}

Thread attributes (usually NULL)

Thread arguments(void *p)

return value(void **p)

33

Page 34: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Execution of Threaded“hello, world”

main thread

peer thread

return NULL;main thread waits for peer thread to terminate

exit() terminates

main thread and any peer threads

call Pthread_create()

call Pthread_join()

Pthread_join() returns

printf()

(peer threadterminates)

Pthread_create() returns

34

Page 35: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

35

Thread-based concurrent server (cont)

int main(int argc, char **argv){ int listenfd, *connfdp, port, clientlen; struct sockaddr_in clientaddr; pthread_t tid;

if (argc != 2) { fprintf(stderr, "usage: %s <port>\n", argv[0]); exit(0); } listenfd = open_listenfd(port); while (1) { clientlen = sizeof(clientaddr); connfdp = Malloc(sizeof(int)); *connfdp = Accept(listenfd, (SA *)&clientaddr, &clientlen); Pthread_create(&tid, NULL, thread, connfdp); }}

Page 36: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

36

Thread-based concurrent server (cont)

/* thread routine */void *thread(void *vargp){ int connfd = *((int *)vargp);

Pthread_detach(pthread_self()); Free(vargp);

echo_r(connfd); /* reentrant version of echo() */ Close(connfd); return NULL;}

Page 37: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

37

Issues with thread-based servers

• Must run “detached” to avoid memory

leak.

– At any point in time, a thread is either joinable

or detached

– joinable thread can be reaped and killed by

other threads.

• must be reaped (with pthread_join) to free memory

resources.

Page 38: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

38

Issues with thread-based servers

• Must run “detached” to avoid memory

leak.

– Detached thread cannot be reaped or killed by

other threads.

• resources are automatically reaped on termination.

– Default state is joinable.

• use pthread_detach(pthread_self()) to make

detached.

Page 39: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

39

Issues with thread-based servers

• Must be careful to avoid unintended

sharing.

– For example, what happens if we pass the

address

of connfd to the thread routine?

– Pthread_create(&tid,NULL,thread,(void *)&connfd);

Page 40: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Potential Form of Unintended Sharing

main thread

peer1

while (1) {int connfd = Accept(listenfd, (SA *) &clientaddr, &clientlen);Pthread_create(&tid, NULL, echo_thread, (void *) &connfd);

}}

connfd

Main thread stack

vargp

Peer1 stack

vargp

Peer2 stackpeer2

connfd = connfd1

connfd = *vargpconnfd = connfd2

connfd = *vargp

Race!

Why would both copies of vargp point to same location?40

Page 41: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

41

Pros and cons of thread-based designs

• + Easy to share data structures between threads– e.g., logging information, file cache.

• + Threads are more efficient than processes

• - Unintentional sharing can introduce subtle and hard-to-reproduce errors!– The ease with which data can be shared is

both the greatest strength and the greatest weakness of threads

– Hard to know which data shared & with private

Page 42: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Approaches to Concurrency

• ProcessesProcesses– Hard to share resources: Easy to avoid unintended

sharing– High overhead in adding/removing clients

• ThreadsThreads– Easy to share resources: Perhaps too easy– Medium overhead– Not much control over scheduling policies– Difficult to debug: event orderings not repeatable

42

Page 43: 1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3

Next

• Concurrency with I/O multiplexing

• Synchronization– Shared variables

– Synchronizing with semaphores

• Suggested reading:– 12.2, 12.4, 12.5.1~3

43