Language Support for Concurrency. 2 Announcements CS 415 project 1 due today! CS 414 homework 2 available due next week Midterm will be first week in.

Slides:



Advertisements
Similar presentations
Ch 7 B.
Advertisements

Ch. 7 Process Synchronization (1/2) I Background F Producer - Consumer process :  Compiler, Assembler, Loader, · · · · · · F Bounded buffer.
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.
1 Semaphores and Monitors CIS450 Winter 2003 Professor Jinhua Guo.
Monitors Chapter 7. The semaphore is a low-level primitive because it is unstructured. If we were to build a large system using semaphores alone, the.
Semaphores. Announcements No CS 415 Section this Friday Tom Roeder will hold office hours Homework 2 is due today.
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.
Synchronization: Monitors Hank Levy. 6/21/20152 Synchronization with Semaphores Semaphores can be used to solve any of the traditional synchronization.
Classical Synchronization Problems. Paradigms for Threads to Share Data We’ve looked at critical sections –Really, a form of locking –When one thread.
Monitors CSCI 444/544 Operating Systems Fall 2008.
Synchronization in Java Fawzi Emad Chau-Wen Tseng Department of Computer Science University of Maryland, College Park.
Synchronization..or: the trickiest bit of this course.
Race Conditions CS550 Operating Systems. Review So far, we have discussed Processes and Threads and talked about multithreading and MPI processes by example.
Classical Synchronization Problems. Announcements CS 414 grades and solutions available in CMS soon. –Average 74.3 –High of 95. –Score out of 100 pts.
Classical Synchronization Problems. Announcements CS 4410 #1 grades and solutions available in CMS soon. –Average 54, stddev 9.7 –High of 70. –Score out.
More Synchronisation Last time: bounded buffer, readers-writers, dining philosophers Today: sleeping barber, monitors.
Monitor Solutions to Classical Problems. 2 Announcements CS 415 Projects graded. –Mean 80.7, High 90 out of 90 CS 414 Homework due Monday.
Monitor  Giving credit where it is due:  The lecture notes are borrowed from Dr. I-Ling Yen at University of Texas at Dallas  I have modified them and.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts – 7 th Edition, Feb 8, 2005 Background Concurrent.
CS510 Concurrent Systems Introduction to Concurrency.
Experience with Processes and Monitors in Mesa
1 CS 333 Introduction to Operating Systems Class 6 – Monitors and Message Passing Jonathan Walpole Computer Science Portland State University.
1 Concurrent Languages – Part 1 COMP 640 Programming Languages.
Critical Problem Revisit. Critical Sections Mutual exclusion Only one process can be in the critical section at a time Without mutual exclusion, results.
COMP 111 Threads and concurrency Sept 28, Tufts University Computer Science2 Who is this guy? I am not Prof. Couch Obvious? Sam Guyer New assistant.
4061 Session 21 (4/3). Today Thread Synchronization –Condition Variables –Monitors –Read-Write Locks.
CSC321 Concurrent Programming: §5 Monitors 1 Section 5 Monitors.
Chap 6 Synchronization. Background Concurrent access to shared data may result in data inconsistency Maintaining data consistency requires mechanisms.
ICS 313: Programming Language Theory Chapter 13: Concurrency.
Lecture 6: Synchronization (II) – Semaphores and Monitors
CSE 451: Operating Systems Winter 2012 Semaphores and Monitors Mark Zbikowski Gary Kimura.
CSE 451: Operating Systems Winter 2014 Module 8 Semaphores, Condition Variables, and Monitors Mark Zbikowski Allen Center 476 ©
CS399 New Beginnings Jonathan Walpole. 2 Concurrent Programming & Synchronization Primitives.
Silberschatz, Galvin and Gagne  2002 Modified for CSCI 399, Royden, Operating System Concepts Operating Systems Lecture 24 Critical Regions.
1 Condition Variables CS 241 Prof. Brighten Godfrey March 16, 2012 University of Illinois.
13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:
Problems with Semaphores Used for 2 independent purposes –Mutual exclusion –Condition synchronization Hard to get right –Small mistake easily leads to.
CS533 – Spring Jeanie M. Schwenk Experiences and Processes and Monitors with Mesa What is Mesa? “Mesa is a strongly typed, block structured programming.
COSC 3407: Operating Systems Lecture 9: Readers-Writers and Language Support for Synchronization.
Concurrency in Shared Memory Systems Synchronization and Mutual Exclusion.
IT 344: Operating Systems Winter 2008 Module 7 Semaphores and Monitors
1 Previous Lecture Overview  semaphores provide the first high-level synchronization abstraction that is possible to implement efficiently in OS. This.
Chapter 71 Monitors (7.7)  A high-level-language object-oriented concept that attempts to simplify the programming of synchronization problems  A synchronization.
CS510 Concurrent Systems Jonathan Walpole. Introduction to Concurrency.
Synchronization..or: the trickiest bit of this course.
Operating Systems NWEN 301 Lecture 6 More Concurrency.
CS703 - Advanced Operating Systems
CSE 120 Principles of Operating
Jonathan Walpole Computer Science Portland State University
CS510 Operating System Foundations
CS510 Operating System Foundations
CSCI 511 Operating Systems Chapter 5 (Part C) Monitor
Monitors Chapter 7.
Semaphore Originally called P() and V() wait (S) { while S <= 0
CSE 451: Operating Systems Winter 2004 Module 7+ Monitor Supplement
CSE 451: Operating Systems Winter Module 8 Semaphores and Monitors
Monitors Chapter 7.
CSE 451: Operating Systems Autumn Lecture 8 Semaphores and Monitors
Monitors Chapter 7.
Monitor Giving credit where it is due:
CSE 451: Operating Systems Autumn Lecture 7 Semaphores and Monitors
CSE 451: Operating Systems Autumn Module 8 Semaphores and Monitors
CSE 451: Operating Systems Winter Module 7 Semaphores and Monitors
CSE 451: Operating Systems Winter Module 7 Semaphores and Monitors
Synchronization: Monitors
CS333 Intro to Operating Systems
CSE 451: Operating Systems Winter Module 7 Semaphores and Monitors
Review The Critical Section problem Peterson’s Algorithm
Presentation transcript:

Language Support for Concurrency

2 Announcements CS 415 project 1 due today! CS 414 homework 2 available due next week Midterm will be first week in March –Either Wednesday, March 7th, in class –Or Thursday, March 8th, in the evening.

3 Common programming errors Process i P(S) CS P(S) Process j V(S) CS V(S) Process k P(S) CS A typo. Process I will get stuck (forever) the second time it does the P() operation. Moreover, every other process will freeze up too when trying to enter the critical section! A typo. Process J won’t respect mutual exclusion even if the other processes follow the rules correctly. Worse still, once we’ve done two “extra” V() operations this way, other processes might get into the CS inappropriately! Whoever next calls P() will freeze up. The bug might be confusing because that other process could be perfectly correct code, yet that’s the one you’ll see hung when you use the debugger to look at its state!

4 More common mistakes Conditional code that can break the normal top-to-bottom flow of code in the critical section Often a result of someone trying to maintain a program, e.g. to fix a bug or add functionality in code written by someone else P(S) if(something or other) return; CS V(S)

5 What if buffer is full? Producer do {... // produce an item in nextp... P(mutex); P(empty);... // add nextp to buffer... V(mutex); V(full); } while (true); What’s wrong? Shared: Semaphores mutex, empty, full; Init: mutex = 1; /* for mutual exclusion*/ empty = N; /* number empty bufs */ full = 0; /* number full bufs */ Consumer do { P(full); P(mutex);... // remove item to nextc... V(mutex); V(empty);... // consume item in nextc... } while (true); Oops! Even if you do the correct operations, the order in which you do semaphore operations can have an incredible impact on correctness

6 Revisiting semaphores! Semaphores are very “low-level” primitives –Users could easily make small errors –Similar to programming in assembly language Small error brings system to grinding halt –Very difficult to debug Also, we seem to be using them in two ways –For mutual exclusion, the “real” abstraction is a critical section –But the bounded buffer example illustrates something different, where threads “communicate” using semaphores Simplification: Provide concurrency support in compiler –Monitors

7 Monitors Hoare 1974 Abstract Data Type for handling/defining shared resources Comprises: –Shared Private Data The resource Cannot be accessed from outside –Procedures that operate on the data Gateway to the resource Can only act on data local to the monitor –Synchronization primitives Among threads that access the procedures

8 Monitor Semantics Monitors guarantee mutual exclusion –Only one thread can execute monitor procedure at any time “in the monitor” –If second thread invokes monitor procedure at that time It will block and wait for entry to the monitor  Need for a wait queue –If thread within a monitor blocks, another can enter Effect on parallelism?

9 Structure of a Monitor Monitor monitor_name { // shared variable declarations procedure P1(....) {.... } procedure P2(....) {.... }. procedure PN(....) {.... } initialization_code(....) {.... } For example: Monitor stack { int top; void push(any_t *) {.... } any_t * pop() {.... } initialization_code() {.... } only one instance of stack can be modified at a time

10 Schematic view of a Monitor

11 Synchronization Using Monitors Defines Condition Variables: –condition x; –Provides a mechanism to wait for events Resources available, any writers 3 atomic operations on Condition Variables –x.wait(): release monitor lock, sleep until woken up  condition variables have waiting queues too –x.notify(): wake one process waiting on condition (if there is one) No history associated with signal –x.broadcast(): wake all processes waiting on condition Useful for resource manager Condition variables are not Boolean –If(x) then { } does not make sense

12 Monitor with Condition Variables

13 Producer Consumer using Monitors Monitor Producer_Consumer { any_t buf[N]; int n = 0, tail = 0, head = 0; condition not_empty, not_full; void put(char ch) { if(n == N) wait(not_full); buf[head%N] = ch; head++; n++; signal(not_empty); } char get() { if(n == 0) wait(not_empty); ch = buf[tail%N]; tail++; n--; signal(not_full); return ch; } What if no thread is waiting when signal is called? Signal is a “no-op” if nobody is waiting. This is very different from what happens when you call V() on a semaphore – semaphores have a “memory” of how many times V() was called!

14 Types of wait queues Monitors have several kinds of “wait” queues –Condition variable: has a queue of threads waiting on the associated condition Thread goes to the end of the queue –Entry to the monitor: has a queue of threads waiting to obtain mutual exclusion so they can enter Again, a new arrival goes to the end of the queue –So-called “urgent” queue: threads that were just woken up using signal(). New arrival normally goes to the front of this queue

15 Producer Consumer using Monitors Monitor Producer_Consumer { condition not_full; /* other vars */ condition not_empty; void put(char ch) { wait(not_full);... signal(not_empty); } char get() {... } }

16 Types of Monitors What happens on signal(): Hoare: signaler immediately gives lock to waiter (theory) –Condition definitely holds when waiter returns –Easy to reason about the program –Calling thread goes on the urgent queue Mesa: signaler keeps lock and processor (practice) –Condition might not hold when waiter returns –Fewer context switches, easy to support broadcast –Consider harder to work with this style of monitor Brinch Hansen: signaller must immediately exit monitor –So, notify should be last statement of monitor procedure –We recommend this approach!

17 Mesa-style monitor subtleties char buf[N]; // producer/consumer with monitors int n = 0, tail = 0, head = 0; condition not_empty, not_full; void put(char ch) if(n == N) wait(not_full); buf[head%N] = ch; head++; n++; signal(not_empty); char get() if(n == 0) wait(not_empty); ch = buf[tail%N]; tail++; n--; signal(not_full); return ch; Consider the following time line: 0. initial condition: n = 0 1. c0 tries to take char, blocks on not_empty (releasing monitor lock) 2. p0 puts a char (n = 1), signals not_empty 3. c0 is put on run queue 4. Before c0 runs, another consumer thread c1 enters and takes character (n = 0) 5. c0 runs. Possible fixes?

18 Mesa-style subtleties char buf[N]; // producer/consumer with monitors int n = 0, tail = 0, head = 0; condition not_empty, not_full; void put(char ch) while(n == N) wait(not_full); buf[head] = ch; head = (head+1)%N; n++; signal(not_empty); char get() while(n == 0) wait(not_empty); ch = buf[tail]; tail = (tail+1) % N; n--; signal(not_full); return ch; When can we replace “while” with “if”?

19 Condition Variables & Semaphores Condition Variables != semaphores Access to monitor is controlled by a lock –Wait: blocks on thread and gives up the lock To call wait, thread has to be in monitor, hence the lock Semaphore P() blocks thread only if value less than 0 –Signal: causes waiting thread to wake up If there is no waiting thread, the signal is lost V() increments value, so future threads need not wait on P() Condition variables have no history However they can be used to implement each other

20 Hoare Monitors using Semaphores For each procedure F: P(mutex); /* body of F */ if(next_count > 0) V(next); else V(mutex); Condition Var Wait: x.wait: x_count++; if(next_count > 0) V(next); else V(mutex); P(x_sem); x.count--; Condition Var Notify: x.notify: If(x_count > 0) { next_count++; V(x_sem); P(next); next_count--; }

21 Language Support Can be embedded in programming language: –Synchronization code added by compiler, enforced at runtime –Mesa/Cedar from Xerox PARC –Java: synchronized, wait, notify, notifyall –C#: lock, wait (with timeouts), pulse, pulseall Monitors easier and safer than semaphores –Compiler can check, lock implicit (cannot be forgotten) Why not put everything in the monitor?

22 Eliminating Locking Overhead Remove locks by duplicating state –Each instance only has one writer –Assumption: assignment is atomic Non-blocking/Wait free Synchronization –Do not use locks –Optimistically do the transaction –If commit fails, then retry

23 Optimistic Concurrency Control Example: hits = hits + 1; A) Read hits into register R1 B) Add 1 to R1 and store it in R2 C) Atomically store R2 in hits only if hits==R1 (i.e. CAS) If store didn’t write goto A Can be extended to any data structure: A) Make copy of data structure, modify copy. B) Use atomic word compare-and-swap to update pointer. C) Goto A if some other thread beat you to the update. Less overhead, deals with failures better Lots of retrying under heavy load

24 To conclude Race conditions are a pain! We studied five ways to handle them –Each has its own pros and cons Support in Java, C# has simplified writing multithreaded applications Some new program analysis tools automate checking to make sure your code is using synchronization correctly –The hard part for these is to figure out what “correct” means! –None of these tools would make sense of the bounded buffer (those in the business sometimes call it the “unbounded bugger”)