Atomic Instructions! Hakim Weatherspoon CS 3410, Spring 2011 Computer Science Cornell University. P&H Chapter 2.11

Similar documents
CS 3410 Computer Science Cornell University

Synchronization. Han Wang CS 3410, Spring 2012 Computer Science Cornell University. P&H Chapter 2.11

Synchronization. Han Wang CS 3410, Spring 2012 Computer Science Cornell University. P&H Chapter 2.11

CS 31: Intro to Systems Misc. Threading. Kevin Webb Swarthmore College December 6, 2018

Operating Systems CMPSCI 377 Spring Mark Corner University of Massachusetts Amherst

Synchronization. P&H Chapter 2.11 and 5.8. Hakim Weatherspoon CS 3410, Spring 2013 Computer Science Cornell University

10/17/ Gribble, Lazowska, Levy, Zahorjan 2. 10/17/ Gribble, Lazowska, Levy, Zahorjan 4

CIS Operating Systems Application of Semaphores. Professor Qiang Zeng Spring 2018

CSE 451: Operating Systems Winter Lecture 7 Synchronization. Steve Gribble. Synchronization. Threads cooperate in multithreaded programs

Operating Systems. Synchronization

Synchronization COMPSCI 386

CSE 451: Operating Systems Winter Lecture 7 Synchronization. Hank Levy 412 Sieg Hall

Operating Systems ECE344

Signaling and Hardware Support

CS 318 Principles of Operating Systems

CS5460: Operating Systems

CS 152 Computer Architecture and Engineering CS252 Graduate Computer Architecture. Lecture 19 Memory Consistency Models

Opera&ng Systems ECE344

Synchronization 1. Synchronization

CSE 153 Design of Operating Systems

CS 31: Introduction to Computer Systems : Threads & Synchronization April 16-18, 2019

Semaphores. Blocking in semaphores. Two types of semaphores. Example: Bounded buffer problem. Binary semaphore usage

CS 470 Spring Mike Lam, Professor. Semaphores and Conditions

Reminder from last time

Synchronization I. Jo, Heeseung

Locks. Dongkun Shin, SKKU

IV. Process Synchronisation

CS533 Concepts of Operating Systems. Jonathan Walpole

Dealing with Issues for Interprocess Communication

Threads and Synchronization. Kevin Webb Swarthmore College February 15, 2018

CSE 451: Operating Systems Winter Synchronization. Gary Kimura

Introduction to OS Synchronization MOS 2.3

CMSC421: Principles of Operating Systems

Other consistency models

Synchronization 1. Synchronization

Systèmes d Exploitation Avancés

CSE 451: Operating Systems Spring Module 10 Semaphores, Condition Variables, and Monitors

Condition Variables. Jinkyu Jeong Computer Systems Laboratory Sungkyunkwan University

Solving the Producer Consumer Problem with PThreads

C09: Process Synchronization

CSE 120 Principles of Operating Systems Spring 2016

Synchronization. CS61, Lecture 18. Prof. Stephen Chong November 3, 2011

Lecture 5: Synchronization w/locks

CS 318 Principles of Operating Systems

Lecture 6 (cont.): Semaphores and Monitors

Synchroniza+on II COMS W4118

Real Time Operating Systems and Middleware

Symmetric Multiprocessors: Synchronization and Sequential Consistency

Synchronization. Dr. Yingwu Zhu

More Types of Synchronization 11/29/16

CS 167 Midterm Exam. Two Hours; Closed Book; Please Use a Black Pen March 23, 2017

More Shared Memory Programming

Implementing Mutual Exclusion. Sarah Diesburg Operating Systems CS 3430

CS 318 Principles of Operating Systems

CS 471 Operating Systems. Yue Cheng. George Mason University Fall 2017

Cache Coherence and Atomic Operations in Hardware

Administrivia. p. 1/20

Summary Semaphores. Passing the Baton any await statement. Synchronisation code not linked to the data

Condition Variables. Dongkun Shin, SKKU

CSci 4061 Introduction to Operating Systems. Synchronization Basics: Locks

Semaphore. Originally called P() and V() wait (S) { while S <= 0 ; // no-op S--; } signal (S) { S++; }

CMSC 330: Organization of Programming Languages. The Dining Philosophers Problem

Misc. Notes. In BVT, switch from i j only if E j E i C/w i. In BVT, Google is example of W better then L. For lab, recall PDE and PTE bits get ANDed

EECS 482 Introduction to Operating Systems

Concept of a process

MULTITHREADING AND SYNCHRONIZATION. CS124 Operating Systems Fall , Lecture 10

Concurrency. On multiprocessors, several threads can execute simultaneously, one on each processor.

W4118 Operating Systems. Instructor: Junfeng Yang

Concurrency. On multiprocessors, several threads can execute simultaneously, one on each processor.

Anne Bracy CS 3410 Computer Science Cornell University

CONCURRENCY: DEADLOCK. Shivaram Venkataraman CS 537, Spring 2019

There are 8 total numbered pages, 6 Questions. You have 60 minutes. Budget your time carefully!

CMSC 330: Organization of Programming Languages

Synchronization. CSE 2431: Introduction to Operating Systems Reading: Chapter 5, [OSC] (except Section 5.10)

Overview. CMSC 330: Organization of Programming Languages. Concurrency. Multiprocessors. Processes vs. Threads. Computation Abstractions

CS510 Operating System Foundations. Jonathan Walpole

Concurrency. On multiprocessors, several threads can execute simultaneously, one on each processor.

Synchronization I. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

Reminder from last time

Synchronising Threads

CPSC/ECE 3220 Fall 2017 Exam Give the definition (note: not the roles) for an operating system as stated in the textbook. (2 pts.

Critical Section Problem: Example

The Dining Philosophers Problem CMSC 330: Organization of Programming Languages

Condition Variables CS 241. Prof. Brighten Godfrey. March 16, University of Illinois

Today: Synchronization. Recap: Synchronization

Shared Memory Programming. Parallel Programming Overview

CS 153 Design of Operating Systems Winter 2016

CS 450 Exam 2 Mon. 4/11/2016

Operating Systems (2INC0) 2017/18

CS 318 Principles of Operating Systems

Condition Variables. Dongkun Shin, SKKU

CS 550 Operating Systems Spring Concurrency Semaphores, Condition Variables, Producer Consumer Problem

Operating Systems. Lecture 4 - Concurrency and Synchronization. Master of Computer Science PUF - Hồ Chí Minh 2016/2017

More Synchronization; Concurrency in Java. CS 475, Spring 2018 Concurrent & Distributed Systems

Computer Core Practice1: Operating System Week10. locking Protocol & Atomic Operation in Linux

Recap: Thread. What is it? What does it need (thread private)? What for? How to implement? Independent flow of control. Stack

Readers-Writers Problem. Implementing shared locks. shared locks (continued) Review: Test-and-set spinlock. Review: Test-and-set on alpha

Concurrency: a crash course

Administrivia. Review: Thread package API. Program B. Program A. Program C. Correct answers. Please ask questions on Google group

Linux kernel synchronization. Don Porter CSE 506

Transcription:

Atomic Instructions! Hakim Weatherspoon CS 3410, Spring 2011 Computer Science Cornell University P&H Chapter 2.11

Announcements! PA4 due next, Friday, May 13 th Work in pairs Will not be able to use slip days Need to schedule Eme for presentaeon May 16, 17, or 18 Signup today a*er class (in front) 2

Prelim2 results Announcements! Mean 56.4 ± 16.3 (median 57.8), Max 95.5 Pickup in Homework pass back room (Upson 360)!"#$%&'()*+"#,( '&" '%" '$" '#" '!" &" %" $" #"!" '(" #!" #(" )!" )(" $!" $(" (!" ((" %!" %(" *!" *(" &!" &(" +!" +(" '!!" 3

Finish SynchronizaEon Threads and processes Goals for Today! CriEcal seceons, race condieons, and mutexes Atomic InstrucEons HW support for synchronizaeon Using sync primieves to build concurrency- safe data structures Cache coherency causes problems Locks + barriers Language level synchronizaeon 4

Mutexes! Q: How to implement criecal seceon in code? A: Lots of approaches. Mutual Exclusion Lock (mutex) lock(m): wait Ell it becomes free, then lock it unlock(m): unlock it safe_increment() { pthread_mutex_lock(m); hits = hits + 1; pthread_mutex_unlock(m) } 5

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

Hardware Support for SynchronizaEon 7

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

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; 9

Spin waiting! Also called: spinlock, busy waieng, spin waieng, Efficient if wait is short Wasteful if wait is long Possible heurisec: spin for Eme proporeonal to expected wait Eme If Eme runs out, context- switch to some other thread 10

Alternative Atomic Instructions! Other atomic hardware primieves - test and set (x86) - atomic increment (x86) - bus lock prefix (x86) 11

Alternative Atomic Instructions! Other atomic hardware primieves - test and set (x86) - atomic increment (x86) - bus lock prefix (x86) - compare and exchange (x86, ARM deprecated) - linked load / store condieonal (MIPS, ARM, PowerPC, DEC Alpha, ) 12

mutex from LL and SC! Linked load / Store CondiEonal 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 } 13

Using synchronizaeon primieves to build concurrency- safe datastructures 14

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; 15

Protecting an invariant! // 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; Rule of thumb: all updates that can affect invariant become criecal seceons 16

Guidelines for successful mutexing! Insufficient locking can cause races Skimping on mutexes? Just say no! Poorly designed locking can cause deadlock P1: lock(m1); lock(m2); P2: lock(m2); lock(m1); 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 funceon calls! watch out for excepeon/error condieons! 17

Cache Coherency causes yet more trouble 18

Remember: Cache Coherence! Recall: Cache coherence defined... Informal: Reads return most recently wriken value Formal: For concurrent processes P 1 and P 2 P writes X before P reads X (with no intervening writes) read returns wriken value P 1 writes X before P 2 reads X read returns wriken 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 19

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

Acquire/release! Memory Barriers and Release Consistency Less strict than sequeneal consistency; easier to build One protocol: Acquire: lock, and force subsequent accesses aqer 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 sequeneal consistency (so use synchronizaeon libraries) 21

Are Locks + Barriers enough? 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; } 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() { char acquire(l); while get() (h == t) { }; acquire(l); while acquire(l); (h == f) { }; char char c = A[h]; A[h]; h++; h++; release(l); release(l); return return c; c; } 24

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() { char acquire(l); get() acquire(l); while (h == t) { }; char char c = A[h]; A[h]; h++; h++; release(l); release(l); return return c; c; } 25

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

Language- level SynchronizaEon 27

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

Using a condition variable! wait(m, c) : release m, sleep unel c, wake up holding m signal(c) : wake up one thread waieng on 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); } 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; 29

Using a condition variable! wait(m, c) : release m, sleep unel c, wake up holding m signal(c) : wake up one thread waieng on 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); } 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; 30

Monitors! A Monitor is a concurrency- safe datastructure, with one mutex some condieon variables some operaeons All operaeons on monitor acquire/release mutex one thread in the monitor at a Eme Ring buffer was a monitor Java, C#, etc., have built- in support for monitors 31

Java concurrency! Java objects can be monitors synchronized keyword locks/releases the mutex Has one (!) builen condieon variable o.wait() = wait(o, o) o.noefy() = signal(o) o.noefyall() = broadcast(o) Java wait() can be called even when mutex is not held. Mutex not held when awoken by signal(). Useful? 32

More synchronization mechanisms! Lots of synchronizaeon variaeons (can implement with mutex and condieon 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 Eme Message- passing, sockets, queues, ring buffers, transfer data and synchronize 33

Summary! Hardware PrimiEves: test- and- set, LL/SC, barrier,... used to build SynchronizaEon primieves: mutex, semaphore,... used to build Language Constructs: monitors, signals,... 34