Operang)Systems) CMPSCI377) Processes)&)Threads)emery/classes/cmpsci... · Operang)Systems)...
Transcript of Operang)Systems) CMPSCI377) Processes)&)Threads)emery/classes/cmpsci... · Operang)Systems)...
Opera&ng Systems CMPSCI 377
Processes & Threads
Emery Berger and Mark Corner University of Massachuse9s
Amherst
2
Outline
Processes Threads Basic synchroniza&on Bake-‐off
What is a Process?
One or more threads running in an address space
3
What is an address space?
The collec&on of data and code for the program organized in an organized (addressable) region.
4
Why do we need processes?
A process (with a single thread) supports a serial flow of execu&on
Is that good enough?
What if something goes wrong?
What if something takes a long &me?
What if we have more than one user?
5
6
Processes vs. Threads…
Both useful – parallel programming & concurrency
– Hide latency – Maximize CPU u&liza&on – Handle mul&ple, asynchronous events
But: different programming styles, performance characteris&cs, and more
7
Processes Process: execu&on context (PC, registers) + address space, files, etc.
Basic unit of execu&on
8
Process API
UNIX: – fork() – create copy of current process
• Different return value • Copy-‐on-‐write
– exec() – replace process w/ executable
Windows: – CreateProcess (…)
• 10 arguments
9
TranslaFon Lookaside Buffer TLB: fast, fully associa&ve memory – Stores page numbers (key), frame (value) in which they are stored
Copy-‐on-‐write: protect pages, copy on first write
10
Processes Example
Do we need the sleep?
11
Quick AcFvity
Print out fib(0) … fib(100), in parallel – Main loop should fork off children (returns pid of child) • int pid; • pid = fork(); • if (pid == 0) { • // I’m child process • } else { • // I’m parent process • }
– Wait for children (waitpid(pid,0,0))
12
Exercise // Print fib(0) ... fib(100) in parallel. int main() { int cids[101]; // Saved child pids. for (int i = 0; i < 101; i++) { // Fork off a bunch of processes to run fib(i). int cid = fork(); if (cid == 0) { // I am the child. cout << "Fib(" << i << ") = " << fib(i) << endl; return 0; // Now the child is done, so exit (IMPORTANT!). } else { // I am the parent. Store the child’s pid somewhere. cids[i] = cid; } } // Wait for all the children. for (int i = 0; i < 101; i++) { waitpid (cids[i], 0, 0); // Wait for the ith child. } return 0; }
13
CommunicaFon
Processes: – Input = state before fork() – Output = return value
• argument to exit()
But: how can processes communicate during execu&on?
14
IPC signals
– Processes can send & receive ints associated with par&cular signal numbers • Process must set up signal handlers
– Best for rare events (SIGSEGV) • Not terribly useful for parallel or concurrent programming
pipes – Communica&on channels – easy & fast
– Just like UNIX command line • ls | wc -‐l
15
int main() { int pfds[2]; pipe(pfds); if (!fork()) { close(1); /* close normal stdout */ dup(pfds[1]); /* make stdout same as pfds[1] */ close(pfds[0]); /* we don't need this */ execlp("ls", "ls", NULL); } else { close(0); /* close normal stdin */ dup(pfds[0]); /* make stdin same as pfds[0] */ close(pfds[1]); /* we don't need this */ execlp("wc", "wc", "-l", NULL); } }
Pipe example
16
IPC, conFnued
sockets – Explicit message passing
– Can distribute processes anywhere mmap (common and aws0m hack)
– All processes map same file into fixed memory loca&on
– Objects in region shared across processes – Use process-‐level synchroniza&on
• Much more expensive than threads…
17
Threads Processes -‐ everything in dis&nct address space
Threads – same address space (& files, sockets, etc.)
18
Threads API
UNIX (POSIX): – pthread_create() – start separate thread execu&ng func&on
– pthread_join() – wait for thread to complete
Windows: – CreateThread (…)
• only 6 arguments!
19
Threads example #include <pthread.h>
void * run (void * d) { int q = ((int) d); int v = 0; for (int i = 0; i < q; i++) {
v = v + expensiveComputa&on(i);
} return (void *) v;
} main() { pthread_t t1, t2; int *r1, *r2; pthread_create (&t1, NULL, run, (int *)100); pthread_create (&t2, NLL, run, (int *)100);
pthread_join (t1, (void **) &r1); pthread_join (t2, (void **) &r2); cout << "r1 = " << *r1 << ", r2 = " << *r2 << endl; }
20
Exercise
Print out fib(0) … fib(100), in parallel – Main loop should spawn children as threads int &d; • pid = pthread_create(&&d, NULL, func&on, argument);
– Wait for children • pthread_join(&d,&result)
21
Exercise
22
CommunicaFon In threads, everything shared except: stacks, registers & thread-‐specific data – Old way:
• pthread_setspecific • pthread_getspecific
– New way: __thread • sta&c __thread int x; • Easier in Java…
Updates of shared state must be synchronized
23
Bake-‐off
Processes or threads? – Performance
– Flexibility / Ease-‐of-‐use – Robustness
24
Scheduling
25
Context Switch Cost
Threads – much cheaper – Stash registers, PC (“IP”), stack pointer
Processes – above plus – Process context – TLB shootdown
Process switches more expensive, or require long quanta
26
Flexibility / Ease-‐of-‐use Processes – more flexible
– Easy to spawn remotely • ssh foo.cs.umass.edu “ls -‐l”
– Can communicate via sockets = can be distributed across cluster / Internet
– Requires explicit communica&on or risky hackery
Threads – Communicate through memory – must be on same machine
– Require thread-‐safe code
27
Robustness
Processes – far more robust – Processes isolated from other processes
• Process dies – no effect – Apache 1.x
Threads: – If one thread crashes (e.g., derefs NULL), whole process terminates
– Then there’s the stack size problem – Apache 2.x…
28
The End