Kevin Walsh CS 3410, Spring 2010 Computer Science Cornell University Atomic Instructions P&H Chapter 2.11.

Slides:



Advertisements
Similar presentations
Operating Systems Semaphores II
Advertisements

1 Interprocess Communication 1. Ways of passing information 2. Guarded critical activities (e.g. updating shared data) 3. Proper sequencing in case of.
Global Environment Model. MUTUAL EXCLUSION PROBLEM The operations used by processes to access to common resources (critical sections) must be mutually.
Ch 7 B.
Chapter 6: Process Synchronization
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Chapter 6: Process Synchronization.
CH7 discussion-review Mahmoud Alhabbash. Q1 What is a Race Condition? How could we prevent that? – Race condition is the situation where several processes.
Synchronization. Shared Memory Thread Synchronization Threads cooperate in multithreaded environments – User threads and kernel threads – Share resources.
Atomic Instructions Hakim Weatherspoon CS 3410, Spring 2011 Computer Science Cornell University P&H Chapter 2.11.
CS 316: Synchronization-II Andrew Myers Fall 2007 Computer Science Cornell University.
Language Support for Concurrency. 2 Common programming errors Process i P(S) CS P(S) Process j V(S) CS V(S) Process k P(S) CS.
Concurrency: Mutual Exclusion, Synchronization, Deadlock, and Starvation in Representative Operating Systems.
1 CS 333 Introduction to Operating Systems Class 4 – Synchronization Primitives Semaphores Jonathan Walpole Computer Science Portland State University.
CS533 Concepts of Operating Systems Class 3 Monitors.
Jonathan Walpole Computer Science Portland State University
Jonathan Walpole Computer Science Portland State University
Hakim Weatherspoon CS 3410, Spring 2015 Computer Science Cornell University P&H Chapter 2.11.
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science Emery Berger University of Massachusetts, Amherst Operating Systems CMPSCI 377 Lecture.
Synchronization CSCI 444/544 Operating Systems Fall 2008.
CS510 Concurrent Systems Introduction to Concurrency.
Cosc 4740 Chapter 6, Part 3 Process Synchronization.
Implementing Synchronization. Synchronization 101 Synchronization constrains the set of possible interleavings: Threads “agree” to stay out of each other’s.
Synchronization II Hakim Weatherspoon CS 3410, Spring 2012 Computer Science Cornell University P&H Chapter 2.11.
Operating Systems ECE344 Ashvin Goel ECE University of Toronto Mutual Exclusion.
4061 Session 21 (4/3). Today Thread Synchronization –Condition Variables –Monitors –Read-Write Locks.
Kernel Locking Techniques by Robert Love presented by Scott Price.
Hakim Weatherspoon CS 3410, Spring 2015 Computer Science Cornell University P&H Chapter 2.11, 5.10, and 6.5.
Chapter 6 – Process Synchronisation (Pgs 225 – 267)
Hakim Weatherspoon CS 3410, Spring 2015 Computer Science Cornell University P&H Chapter 2.11.
1 Interprocess Communication (IPC) - Outline Problem: Race condition Solution: Mutual exclusion –Disabling interrupts; –Lock variables; –Strict alternation.
CS 3204 Operating Systems Godmar Back Lecture 7. 12/12/2015CS 3204 Fall Announcements Project 1 due on Sep 29, 11:59pm Reading: –Read carefully.
CS399 New Beginnings Jonathan Walpole. 2 Concurrent Programming & Synchronization Primitives.
CSE 451: Operating Systems Section 5 Synchronization.
U NIVERSITY OF M ASSACHUSETTS A MHERST Department of Computer Science Computer Systems Principles Synchronization Emery Berger and Mark Corner University.
1 Previous Lecture Overview  semaphores provide the first high-level synchronization abstraction that is possible to implement efficiently in OS. This.
Implementing Lock. From the Previous Lecture  The “too much milk” example shows that writing concurrent programs directly with load and store instructions.
CSCI1600: Embedded and Real Time Software Lecture 17: Concurrent Programming Steven Reiss, Fall 2015.
CSC 660: Advanced Operating SystemsSlide #1 CSC 660: Advanced OS Synchronization.
CS510 Concurrent Systems Jonathan Walpole. Introduction to Concurrency.
Implementing Mutual Exclusion Andy Wang Operating Systems COP 4610 / CGS 5765.
Synchronization II Hakim Weatherspoon CS 3410, Spring 2013 Computer Science Cornell University P&H Chapter 2.11.
December 1, 2006©2006 Craig Zilles1 Threads & Atomic Operations in Hardware  Previously, we introduced multi-core parallelism & cache coherence —Today.
CS703 – Advanced Operating Systems
Atomic Operations in Hardware
Atomic Operations in Hardware
CS533 Concepts of Operating Systems Class 3
CS510 Operating System Foundations
Synchronization II Hakim Weatherspoon CS 3410, Spring 2012
Synchronization II Hakim Weatherspoon CS 3410, Spring 2013
Jonathan Walpole Computer Science Portland State University
Multicore, Parallelism, and Synchronization
Coordination Lecture 5.
Implementing Mutual Exclusion
CSCI1600: Embedded and Real Time Software
CS533 Concepts of Operating Systems Class 3
CSE 451: Operating Systems Autumn Lecture 8 Semaphores and Monitors
Implementing Mutual Exclusion
Kernel Synchronization II
CSE 451: Operating Systems Winter Module 7 Semaphores and Monitors
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
CSE 153 Design of Operating Systems Winter 19
CSE 153 Design of Operating Systems Winter 2019
CS333 Intro to Operating Systems
CSCI1600: Embedded and Real Time Software
Parallelism, Multicore, and Synchronization
CSE 542: Operating Systems
CSE 542: Operating Systems
Presentation transcript:

Kevin Walsh CS 3410, Spring 2010 Computer Science Cornell University Atomic Instructions P&H Chapter 2.11

2 Synchronization Synchronization techniques clever code must work despite adversarial scheduler/interrupts used by: hackers also: noobs disable interrupts used by: exception handler, scheduler, device drivers, … disable preemption dangerous for user code, but okay for some kernel code mutual exclusion locks (mutex) general purpose, except for some interrupt-related cases

3 Mutexes Q: How to implement critical section in code? A: Lots of approaches…. Mutual Exclusion Lock (mutex) lock(m): wait till it becomes free, then lock it unlock(m): unlock it safe_increment() { pthread_mutex_lock(m); hits = hits + 1; pthread_mutex_unlock(m) }

4 Hardware Support for Synchronization

5 Atomic Test and Set Mutex implementation Suppose hardware has atomic test-and-set Hardware atomic equivalent of… int test_and_set(int *m) { old = *m; *m = 1; return old; }

6 Using test-and-set for mutual exclusion Use test-and-set to implement mutex / spinlock / crit. sec. int m = 0;... while (test_and_set(&m)) { /* skip */ }; m = 0;

7 Spin waiting Also called: spinlock, busy waiting, spin waiting, … Efficient if wait is short Wasteful if wait is long Possible heuristic: spin for time proportional to expected wait time If time runs out, context-switch to some other thread

8 Alternative Atomic Instructions Other atomic hardware primitives - test and set (x86) - atomic increment (x86) - bus lock prefix (x86)

9 Alternative Atomic Instructions Other atomic hardware primitives - test and set (x86) - atomic increment (x86) - bus lock prefix (x86) - compare and exchange (x86, ARM deprecated) - linked load / store conditional (MIPS, ARM, PowerPC, DEC Alpha, …)

10 mutex from LL and SC Linked load / Store Conditional mutex_lock(int *m) { again: LL t0, 0(a0) BNE t0, zero, again ADDI t0, t0, 1 SC t0, 0(a0) BEQ t0, zero, again }

11 Using synchronization primitives to build concurrency-safe datastructures

12 Broken invariants Access to shared data must be synchronized goal: enforce datastructure invariants // invariant: // data is in A[h … t-1] char A[100]; int h = 0, t = 0; // writer: add to list tail void put(char c) { A[t] = c; t++; } // reader: take from list head char get() { while (h == t) { }; char c = A[h]; h++; return c; }

13 Protecting an invariant Rule of thumb: all updates that can affect invariant become critical sections // invariant: (protected by m) // data is in A[h … t-1] pthread_mutex_t *m = pthread_mutex_create(); char A[100]; int h = 0, t = 0; // writer: add to list tail void put(char c) { pthread_mutex_lock(m); A[t] = c; t++; pthread_mutex_unlock(m); } // reader: take from list head char get() { pthread_mutex_lock(m); char c = A[h]; h++; pthread_mutex_unlock(m); return c; }

14 Guidelines for successful mutexing Insufficient locking can cause races Skimping on mutexes? Just say no! Poorly designed locking can cause deadlock know why you are using mutexes! acquire locks in a consistent order to avoid cycles use lock/unlock like braces (match them lexically) –lock(&m); …; unlock(&m) –watch out for return, goto, and function calls! –watch out for exception/error conditions! P1:lock(m1); lock(m2); P2:lock(m2); lock(m1);

15 Cache Coherency causes yet more trouble

16 Remember: Cache Coherence Recall: Cache coherence defined... Informal: Reads return most recently written value Formal: For concurrent processes P 1 and P 2 P writes X before P reads X (with no intervening writes)  read returns written value P 1 writes X before P 2 reads X  read returns written value P 1 writes X and P 2 writes X  all processors see writes in the same order –all see the same final value for X

17 Relaxed consistency implications Ideal case: sequential consistency Globally: writes appear in interleaved order Locally: other core’s writes show up in program order In practice: not so much… write-back caches  sequential consistency is tricky writes appear in semi-random order locks alone don’t help * MIPS has sequential consistency; Intel does not

18 Acquire/release Memory Barriers and Release Consistency Less strict than sequential consistency; easier to build One protocol: Acquire: lock, and force subsequent accesses after Release: unlock, and force previous accesses before P1:... acquire(m); A[t] = c; t++; release(m); P2:... acquire(m); A[t] = c; t++; unlock(m); Moral: can’t rely on sequential consistency (so use synchronization libraries)

19 Are Locks + Barriers enough?

20 Beyond mutexes Writers must check for full buffer & Readers must check if for empty buffer ideal: don’t busy wait… go to sleep instead char get() { acquire(L); char c = A[h]; h++; release(L); return c; }

21 Beyond mutexes Writers must check for full buffer & Readers must check if for empty buffer ideal: don’t busy wait… go to sleep instead char get() { acquire(L); char c = A[h]; h++; release(L); return c; } char get() { acquire(L); while (h == f) { }; char c = A[h]; h++; release(L); return c; } char get() { while (h == f) { }; acquire(L); char c = A[h]; h++; release(L); return c; }

22 Beyond mutexes Writers must check for full buffer & Readers must check if for empty buffer ideal: don’t busy wait… go to sleep instead char get() { acquire(L); char c = A[h]; h++; release(L); return c; } char get() { acquire(L); while (h == f) { }; char c = A[h]; h++; release(L); return c; }

23 Beyond mutexes Writers must check for full buffer & Readers must check if for empty buffer ideal: don’t busy wait… go to sleep instead char get() { acquire(L); char c = A[h]; h++; release(L); return c; } char get() { acquire(L); while (h == f) { }; char c = A[h]; h++; release(L); return c; } char get() { while (h == f) { }; acquire(L); char c = A[h]; h++; release(L); return c; } char get() { do { acquire(L); empty = (h == f); if (!empty) { c = A[h]; h++; } release(L); } while (empty); return c; }

24 Language-level Synchronization

25 Condition variables Use [Hoare] a condition variable to wait for a condition to become true (without holding lock!) wait(m, c) : atomically release m and sleep, waiting for condition c wake up holding m sometime after c was signaled signal(c) : wake up one thread waiting on c broadcast(c) : wake up all threads waiting on c POSIX (e.g., Linux): pthread_cond_wait, pthread_cond_signal, pthread_cond_broadcast

26 Using a condition variable wait(m, c) : release m, sleep until c, wake up holding m signal(c) : wake up one thread waiting on c char get() { lock(m); while (t == h) wait(m, not_empty); char c = A[h]; h = (h+1) % n; unlock(m); signal(not_full); return c; } cond_t *not_full =...; cond_t *not_empty =...; mutex_t *m =...; void put(char c) { lock(m); while ((t-h) % n == 1) wait(m, not_full); A[t] = c; t = (t+1) % n; unlock(m); signal(not_empty); }

27 Using a condition variable wait(m, c) : release m, sleep until c, wake up holding m signal(c) : wake up one thread waiting on c char get() { lock(m); while (t == h) wait(m, not_empty); char c = A[h]; h = (h+1) % n; unlock(m); signal(not_full); return c; } cond_t *not_full =...; cond_t *not_empty =...; mutex_t *m =...; void put(char c) { lock(m); while ((t-h) % n == 1) wait(m, not_full); A[t] = c; t = (t+1) % n; unlock(m); signal(not_empty); }

28 Monitors A Monitor is a concurrency-safe datastructure, with… one mutex some condition variables some operations All operations on monitor acquire/release mutex one thread in the monitor at a time Ring buffer was a monitor Java, C#, etc., have built-in support for monitors

29 Java concurrency Java objects can be monitors “synchronized” keyword locks/releases the mutex Has one (!) builtin condition variable –o.wait() = wait(o, o) –o.notify() = signal(o) –o.notifyAll() = broadcast(o) Java wait() can be called even when mutex is not held. Mutex not held when awoken by signal(). Useful?

30 More synchronization mechanisms Lots of synchronization variations… (can implement with mutex and condition vars.) Reader/writer locks Any number of threads can hold a read lock Only one thread can hold the writer lock Semaphores N threads can hold lock at the same time Message-passing, sockets, queues, ring buffers, … transfer data and synchronize

31 Summary Hardware Primitives: test-and-set, LL/SC, barrier,... … used to build … Synchronization primitives: mutex, semaphore,... … used to build … Language Constructs: monitors, signals,...