Carnegie Mellon 1 Synchronization: Basics 15-213 / 18-213: Introduction to Computer Systems 23 rd Lecture, Jul 21, 2015 Instructors: nwf and Greg Kesden.

Slides:



Advertisements
Similar presentations
Ch 7 B.
Advertisements

Chapter 6: Process Synchronization
Silberschatz, Galvin and Gagne ©2013 Operating System Concepts – 9 th Edition Chapter 5: Process Synchronization.
5.1 Silberschatz, Galvin and Gagne ©2009 Operating System Concepts with Java – 8 th Edition Chapter 5: CPU Scheduling.
Programming with Threads Topics Threads Shared variables The need for synchronization Synchronizing with semaphores Thread safety and reentrancy Races.
Programming with Threads November 26, 2003 Topics Shared variables The need for synchronization Synchronizing with semaphores Thread safety and reentrancy.
Carnegie Mellon 1 Synchronization: Basics : Introduction to Computer Systems 23 rd Lecture, Nov. 16, 2010 Instructors: Randy Bryant and Dave O’Hallaron.
– 1 – , F’02 Traditional View of a Process Process = process context + code, data, and stack shared libraries run-time heap 0 read/write data Program.
Threads© Dr. Ayman Abdel-Hamid, CS4254 Spring CS4254 Computer Network Architecture and Programming Dr. Ayman A. Abdel-Hamid Computer Science Department.
Synchronization April 29, 2008 Topics Shared variables The need for synchronization Synchronizing with semaphores Thread safety and reentrancy Races and.
Concurrent HTTP Proxy with Caching Ashwin Bharambe Monday, Dec 4, 2006.
Programming with Threads Topics Threads Shared variables The need for synchronization Synchronizing with semaphores Thread safety and reentrancy Races.
Programming with Threads April 30, 2002 Topics Shared variables The need for synchronization Synchronizing with semaphores Synchronizing with mutex and.
CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.
1 Process Synchronization Andrew Case Slides adapted from Mohamed Zahran, Clark Barrett, Jinyang Li, Randy Bryant and Dave O’Hallaron.
Operating Systems ECE344 Ashvin Goel ECE University of Toronto Threads and Processes.
CS345 Operating Systems Threads Assignment 3. Process vs. Thread process: an address space with 1 or more threads executing within that address space,
1. Synchronization: basic 2. Synchronization: advanced.
1 Concurrent Programming. 2 Outline Concurrent programming –Processes –Threads Suggested reading: –12.1, 12.3.
CS333 Intro to Operating Systems Jonathan Walpole.
Week 16 (April 25 th ) Outline Thread Synchronization Lab 7: part 2 & 3 TA evaluation form Reminders Lab 7: due this Thursday Final review session Final.
SYNCHRONIZATION. Today  Threads review  Sharing  Mutual exclusion  Semaphores.
Carnegie Mellon Introduction to Computer Systems /18-243, fall nd Lecture, Nov. 17 Instructors: Roger B. Dannenberg and Greg Ganger.
Programming with Threads Topics Threads Shared variables The need for synchronization Synchronizing with semaphores Thread safety and reentrancy Races.
Thread S04, Recitation, Section A Thread Memory Model Thread Interfaces (System Calls) Thread Safety (Pitfalls of Using Thread) Racing Semaphore.
Concurrency I: Threads Nov 9, 2000 Topics Thread concept Posix threads (Pthreads) interface Linux Pthreads implementation Concurrent execution Sharing.
CSCI1600: Embedded and Real Time Software Lecture 17: Concurrent Programming Steven Reiss, Fall 2015.
1 Carnegie Mellon Synchronization : Introduction to Computer Systems Recitation 14: November 25, 2013 Pratik Shah (pcshah) Section C.
1. Concurrency and threads 2. Synchronization: basic 3. Synchronization: advanced.
Concurrency Threads Synchronization Thread-safety of Library Functions Anubhav Gupta Dec. 2, 2002 Outline.
1 Introduction to Threads Race Conditions. 2 Process Address Space Revisited Code Data OS Stack (a)Process with Single Thread (b) Process with Two Threads.
1 Concurrent Programming. 2 Outline Concurrency with I/O multiplexing Synchronization –Shared variables –Synchronizing with semaphores Suggested reading:
1 CMSC Laundry List P/W/F, Exam, etc. Instructors: HSG, HH, MW.
December 1, 2006©2006 Craig Zilles1 Threads & Atomic Operations in Hardware  Previously, we introduced multi-core parallelism & cache coherence —Today.
Chien-Chung Shen CIS/UD
Synchronization /18-243: Introduction to Computer Systems
Instructors: Gregory Kesden and Markus Püschel
Threads Synchronization Thread-safety of Library Functions
Synchronization: Basics
Background on the need for Synchronization
Instructors: Randal E. Bryant and David R. O’Hallaron
Programming with Threads
Programming with Threads
Threads Threads.
CS399 New Beginnings Jonathan Walpole.
Concurrent Programming November 13, 2008
Concurrency I: Threads April 10, 2001
Concurrent Servers Topics Limitations of iterative servers
Instructor: Randy Bryant
Programming with Threads
CS703 – Advanced Operating Systems
Concurrent Programming
Programming with Threads
Programming with Threads Dec 6, 2001
Programming with Threads Dec 5, 2002
Concurrent Programming November 18, 2008
Synchronization: Basics CSCI 380: Operating Systems
Programming with Threads
CSE 451: Operating Systems Autumn 2003 Lecture 7 Synchronization
CSE 451: Operating Systems Autumn 2005 Lecture 7 Synchronization
CSE 451: Operating Systems Winter 2003 Lecture 7 Synchronization
Programming with Threads
Concurrent Programming November 13, 2008
Programming with Threads
Lecture 20: Synchronization
Instructor: Brian Railing
Lecture 19: Threads CS April 3, 2019.
Programming with Threads
Threads CSE 2431: Introduction to Operating Systems
Presentation transcript:

Carnegie Mellon 1 Synchronization: Basics / : Introduction to Computer Systems 23 rd Lecture, Jul 21, 2015 Instructors: nwf and Greg Kesden

Carnegie Mellon 2 Today Threads review Sharing Mutual exclusion Semaphores

Carnegie Mellon 3 Process: Traditional View 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) Code, data, and stack read-only code/data stack SP PC brk Process context Kernel context: VM structures Descriptor table brk pointer

Carnegie Mellon 4 Process: Alternative View Process = thread + code, data, and kernel context shared libraries run-time heap 0 read/write data Program context: Data registers Condition codes Stack pointer (SP) Program counter (PC) Code, data, and kernel context read-only code/data stack SP PC brk Thread Kernel context: VM structures Descriptor table brk pointer

Carnegie Mellon 5 Process with Two Threads shared libraries run-time heap 0 read/write data Program context: Data registers Condition codes Stack pointer (SP) Program counter (PC) Code, data, and kernel context read-only code/data stack SP PC brk Thread 1 Kernel context: VM structures Descriptor table brk pointer Program context: Data registers Condition codes Stack pointer (SP) Program counter (PC) stack SP Thread 2

Carnegie Mellon 6 Threads vs. Processes Threads and processes: similarities  Each has its own logical control flow  Each can run concurrently with others  Each is scheduled and context switched by the kernel Threads and processes: differences  Threads share code and data, processes (typically) do not  Threads are less expensive than processes  Process control (creating and reaping) is more expensive than thread control  Context switches for processes more expensive than for threads

Carnegie Mellon 7 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!

Carnegie Mellon 8 Today Threads review Sharing Mutual exclusion Semaphores

Carnegie Mellon 9 Shared Variables in Threaded C Programs Question: Which variables in a threaded C program are shared?  The answer is not as simple as “global variables are shared” and “stack variables are private” Requires answers to the following questions:  What is the memory model for threads?  How are instances of variables mapped to memory?  How many threads might reference each of these instances? Def: A variable x is shared if and only if multiple threads reference some instance of x.

Carnegie Mellon 10 Threads Memory Model Conceptual model:  Multiple threads run within the context of a single process  Each thread has its own separate thread context  Thread ID, stack, stack pointer, PC, condition codes, and GP registers  All threads share the remaining process context  Code, data, heap, and shared library segments of the process virtual address space  Open files and installed handlers Operationally, this model is not strictly enforced:  Register values are truly separate and protected, but…  Any thread can read and write the stack of any other thread The mismatch between the conceptual and operation model is a source of confusion and errors

Carnegie Mellon 11 Example Program to Illustrate Sharing char **ptr; /* global var */ int main() { long i; pthread_t tid; char *msgs[2] = { "Hello from foo", "Hello from bar" }; ptr = msgs; for (i = 0; i < 2; i++) Pthread_create(&tid, NULL, thread, (void *)i); Pthread_exit(NULL); } void *thread(void *vargp) { long myid = (long)vargp; static int cnt = 0; printf("[%ld]: %s (cnt=%d)\n", myid, ptr[myid], ++cnt); return NULL; } Peer threads reference main thread’s stack indirectly through global ptr variable sharing.c

Carnegie Mellon 12 Mapping Variable Instances to Memory Global variables  Def: Variable declared outside of a function  Virtual memory contains exactly one instance of any global variable Local variables  Def: Variable declared inside function without static attribute  Each thread stack contains one instance of each local variable Local static variables  Def: Variable declared inside function with the static attribute  Virtual memory contains exactly one instance of any local static variable.

Carnegie Mellon 13 char **ptr; /* global var */ int main() { long i; pthread_t tid; char *msgs[2] = { "Hello from foo", "Hello from bar" }; ptr = msgs; for (i = 0; i < 2; i++) Pthread_create(&tid, NULL, thread, (void *)i); Pthread_exit(NULL); } void *thread(void *vargp) { long myid = (long)vargp; static int cnt = 0; printf("[%ld]: %s (cnt=%d)\n", myid, ptr[myid], ++cnt); return NULL; } Mapping Variable Instances to Memory Global var: 1 instance ( ptr [data]) Local static var: 1 instance ( cnt [data]) Local vars: 1 instance ( i.m, msgs.m ) Local var: 2 instances ( myid.p0 [peer thread 0’s stack], myid.p1 [peer thread 1’s stack] ) sharing.c

Carnegie Mellon 14 Shared Variable Analysis Which variables are shared? Answer: A variable x is shared iff multiple threads reference at least one instance of x. Thus: ptr, cnt, and msgs are shared i and myid are not shared Variable Referenced byReferenced by Referenced by instance main thread?peer thread 0?peer thread 1? ptr cnt i.m msgs.m myid.p0 myid.p1 yes noyes no yes noyesno yes

Carnegie Mellon 15 Today Threads review Sharing Mutual exclusion Semaphores

Carnegie Mellon 16 badcnt.c : Improper Synchronization /* Global shared variable */ volatile long cnt = 0; /* Counter */ int main(int argc, char **argv) { long niters; pthread_t tid1, tid2; niters = atoi(argv[1]); Pthread_create(&tid1, NULL, thread, &niters); Pthread_create(&tid2, NULL, thread, &niters); Pthread_join(tid1, NULL); Pthread_join(tid2, NULL); /* Check result */ if (cnt != (2 * niters)) printf("BOOM! cnt=%ld\n", cnt); else printf("OK cnt=%ld\n", cnt); exit(0); } /* Thread routine */ void *thread(void *vargp) { long i, niters = *((long *)vargp); for (i = 0; i < niters; i++) cnt++; return NULL; } linux>./badcnt OK cnt=20000 linux>./badcnt BOOM! cnt=13051 linux> cnt should equal 20,000. What went wrong? badcnt.c

Carnegie Mellon 17 Assembly Code for Counter Loop for (i = 0; i < niters; i++) cnt++; C code for counter loop in thread i movq (%rdi), %rcx testq %rcx,%rcx jle.L2 movl $0, %eax.L3: movq cnt(%rip),%rdx addq $1, %rdx movq %rdx, cnt(%rip) addq $1, %rax cmpq %rcx, %rax jne.L3.L2: H i : Head T i : Tail L i : Load cnt U i : Update cnt S i : Store cnt Asm code for thread i

Carnegie Mellon 18 Concurrent Execution Key idea: In general, any sequentially consistent interleaving is possible, but some give an unexpected result!  I i denotes that thread i executes instruction I  %rdx i is the content of %rdx in thread i’s context H1H1 L1L1 U1U1 S1S1 H2H2 L2L2 U2U2 S2S2 T2T2 T1T i (thread) instr i cnt%rdx 1 OK %rdx 2 Thread 1 critical section Thread 2 critical section

Carnegie Mellon 19 Concurrent Execution (cont) Incorrect ordering: two threads increment the counter, but the result is 1 instead of 2 H1H1 L1L1 U1U1 H2H2 L2L2 S1S1 T1T1 U2U2 S2S2 T2T i (thread) instr i cnt%rdx %rdx 2 Oops!

Carnegie Mellon 20 Concurrent Execution (cont) How about this ordering? We can analyze the behavior using a progress graph H1H1 L1L1 H2H2 L2L2 U2U2 S2S2 U1U1 S1S1 T1T1 T2T i (thread) instr i cnt%rdx 1 %rdx Oops! 1

Carnegie Mellon 21 Progress Graphs A progress graph depicts the discrete execution state space of concurrent threads. Each axis corresponds to the sequential order of instructions in a thread. Each point corresponds to a possible execution state (Inst 1, Inst 2 ). E.g., (L 1, S 2 ) denotes state where thread 1 has completed L 1 and thread 2 has completed S 2. H1H1 L1L1 U1U1 S1S1 T1T1 H2H2 L2L2 U2U2 S2S2 T2T2 Thread 1 Thread 2 (L 1, S 2 )

Carnegie Mellon 22 Trajectories in Progress Graphs A trajectory is a sequence of legal state transitions that describes one possible concurrent execution of the threads. Example: H1, L1, U1, H2, L2, S1, T1, U2, S2, T2 H1H1 L1L1 U1U1 S1S1 T1T1 H2H2 L2L2 U2U2 S2S2 T2T2 Thread 1 Thread 2

Carnegie Mellon 23 Critical Sections and Unsafe Regions L, U, and S form a critical section with respect to the shared variable cnt Instructions in critical sections (wrt to some shared variable) should not be interleaved Sets of states where such interleaving occurs form unsafe regions H1H1 L1L1 U1U1 S1S1 T1T1 H2H2 L2L2 U2U2 S2S2 T2T2 Thread 1 Thread 2 critical section wrt cnt Unsafe region

Carnegie Mellon 24 Critical Sections and Unsafe Regions H1H1 L1L1 U1U1 S1S1 T1T1 H2H2 L2L2 U2U2 S2S2 T2T2 Thread 1 Thread 2 critical section wrt cnt Unsafe region Def: A trajectory is safe iff it does not enter any unsafe region Claim: A trajectory is correct (wrt cnt ) iff it is safe unsafe safe

Carnegie Mellon 25 Enforcing Mutual Exclusion Question: How can we guarantee a safe trajectory? Answer: We must synchronize the execution of the threads so that they never have an unsafe trajectory.  i.e., need to guarantee mutually exclusive access to critical regions Classic solution:  Semaphores (Edsger Dijkstra) Other approaches (out of our scope)  Mutex and condition variables (Pthreads)  Monitors (Java)

Carnegie Mellon 26 Today Threads review Sharing Mutual exclusion Semaphores

Carnegie Mellon 27 Semaphores Semaphore: non-negative global integer synchronization variable. Manipulated by P and V operations. P(s) (Dutch “Proberen” ; “Try”) aka sem_wait()  If s is nonzero, then decrement s by 1 and return immediately.  If s is zero, then suspend thread until s becomes nonzero and the thread is restarted by a V operation.  After restarting, the P operation decrements s and returns control to the caller. V(s) (Dutch “Vrijgave”; “Release”) aka sem_post()  Increment s by 1.  If there are any threads blocked in a P operation waiting for s to become non-zero, then restart exactly one of those threads, which then completes its P operation by decrementing s. Semaphore invariant: (s >= 0)

Carnegie Mellon 28 C Semaphore Operations Pthreads functions: #include int sem_init(sem_t *sem, 0, unsigned int val);} /* s = val */ int sem_wait(sem_t *s); /* P(s) */ int sem_post(sem_t *s); /* V(s) */ CS:APP wrapper functions: #include "csapp.h” void P(sem_t *s); /* Wrapper function for sem_wait */ void V(sem_t *s); /* Wrapper function for sem_post */

Carnegie Mellon 29 badcnt.c : Improper Synchronization /* Global shared variable */ volatile long cnt = 0; /* Counter */ int main(int argc, char **argv) { long niters; pthread_t tid1, tid2; niters = atoi(argv[1]); Pthread_create(&tid1, NULL, thread, &niters); Pthread_create(&tid2, NULL, thread, &niters); Pthread_join(tid1, NULL); Pthread_join(tid2, NULL); /* Check result */ if (cnt != (2 * niters)) printf("BOOM! cnt=%ld\n", cnt); else printf("OK cnt=%ld\n", cnt); exit(0); } /* Thread routine */ void *thread(void *vargp) { long i, niters = *((long *)vargp); for (i = 0; i < niters; i++) cnt++; return NULL; } How can we fix this using semaphores? badcnt.c

Carnegie Mellon 30 Using Semaphores for Mutual Exclusion Basic idea:  Associate a unique semaphore mutex, initially 1, with each shared variable (or related set of shared variables).  Surround corresponding critical sections with P(mutex) and V(mutex) operations. Terminology:  Binary semaphore: semaphore whose value is always 0 or 1  Mutex: binary semaphore used for mutual exclusion  P operation: “locking” the mutex  V operation: “unlocking” or “releasing” the mutex  “Holding” a mutex: locked and not yet unlocked.  Counting semaphore: used as a counter for set of available resources.

Carnegie Mellon 31 goodcnt.c: Proper Synchronization Define and initialize a mutex for the shared variable cnt: volatile long cnt = 0; /* Counter */ sem_t mutex; /* Semaphore that protects cnt */ Sem_init(&mutex, 0, 1); /* mutex = 1 */ Surround critical section with P and V: for (i = 0; i < niters; i++) { P(&mutex); cnt++; V(&mutex); } linux>./goodcnt OK cnt=20000 linux>./goodcnt OK cnt=20000 linux> Warning: It’s orders of magnitude slower than badcnt.c. goodcnt.c

Carnegie Mellon 32 Unsafe region Why Mutexes Work Provide mutually exclusive access to shared variable by surrounding critical section with P and V operations on semaphore s (initially set to 1) Semaphore invariant creates a forbidden region that encloses unsafe region that cannot be entered by any trajectory. H1H1 P(s)V(s)T1T1 Thread 1 Thread 2 L1L1 U1U1 S1S1 H2H2 P(s) V(s) T2T2 L2L2 U2U2 S2S Initially s = 1 Forbidden region

Carnegie Mellon 33 Summary Programmers need a clear model of how variables are shared by threads. Variables shared by multiple threads must be protected to ensure mutually exclusive access. Semaphores are a fundamental mechanism for enforcing mutual exclusion.