CSCE 313: Introduction to Computer Systems

Similar documents
Critical Section Problem: Example

Critical Section Problem: Example

Chapter 6: Synchronization. Operating System Concepts 8 th Edition,

Chapter 5: Process Synchronization. Operating System Concepts Essentials 2 nd Edition

Chapter 7: Process Synchronization!

Lecture 6. Process Synchronization

Synchronization. CS 416: Operating Systems Design, Spring 2011 Department of Computer Science Rutgers University

Chapter 7: Process Synchronization. Background. Illustration

Operating Systems ECE344

Chapter 5: Process Synchronization. Operating System Concepts 9 th Edition

Process Management And Synchronization

Chapter 6: Process Synchronization. Operating System Concepts 8 th Edition,

Lesson 6: Process Synchronization

CS370 Operating Systems

Process Synchronization

Chapter 6: Process Synchronization

Chapter 6: Synchronization. Chapter 6: Synchronization. 6.1 Background. Part Three - Process Coordination. Consumer. Producer. 6.

Chapter 6: Process Synchronization

Introduction to OS Synchronization MOS 2.3

Process Synchronization

semsignal (s) & semwait (s):

Chapter 7: Process Synchronization. Background

Synchronization Principles

Outline. Monitors. Barrier synchronization The sleeping barber problem Readers and Writers One-way tunnel. o Monitors in Java

Process Synchronization

Operating Systems. Designed and Presented by Dr. Ayman Elshenawy Elsefy

Concurrency Principles

Chapter 5: Process Synchronization. Operating System Concepts 9 th Edition

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

Process Synchronization: Semaphores. CSSE 332 Operating Systems Rose-Hulman Institute of Technology

Concept of a process

Opera&ng Systems ECE344

CS 4410 Operating Systems. Review 1. Summer 2016 Cornell University

Chapter 6: Process Synchronization

Chapter 5 Concurrency: Mutual Exclusion. and. Synchronization. Operating Systems: Internals. and. Design Principles

CS420: Operating Systems. Process Synchronization

Operating Systems CMPSC 473. Synchronization February 26, Lecture 12 Instructor: Trent Jaeger

Process Synchronization

Process Synchronization. CISC3595, Spring 2015 Dr. Zhang

COP 4225 Advanced Unix Programming. Synchronization. Chi Zhang

Lecture Topics. Announcements. Today: Concurrency (Stallings, chapter , 5.7) Next: Exam #1. Self-Study Exercise #5. Project #3 (due 9/28)

Synchronization. Disclaimer: some slides are adopted from the book authors slides 1

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

Chapter 5 Concurrency: Mutual Exclusion and Synchronization

Process Synchronization

Concurrency: Mutual Exclusion and Synchronization - Part 2

Synchronization for Concurrent Tasks

CS3733: Operating Systems

Interprocess Communication By: Kaushik Vaghani

Interprocess Communication and Synchronization

CHAPTER 6: PROCESS SYNCHRONIZATION

Dealing with Issues for Interprocess Communication

Introduction to Operating Systems

Threading and Synchronization. Fahd Albinali

Process Coordination

Module 6: Process Synchronization. Operating System Concepts with Java 8 th Edition

Synchronization. Disclaimer: some slides are adopted from the book authors slides 1

Process Synchronization

Module 6: Process Synchronization

2 Threads vs. Processes

Chapters 5 and 6 Concurrency

Silberschatz and Galvin Chapter 6

Chapter 6: Process Synchronization. Operating System Concepts 8 th Edition,

Synchronization. CS 475, Spring 2018 Concurrent & Distributed Systems

Chapter 6: Process Synchronization. Module 6: Process Synchronization

Background. The Critical-Section Problem Synchronisation Hardware Inefficient Spinning Semaphores Semaphore Examples Scheduling.

CSC501 Operating Systems Principles. Process Synchronization

Semaphores and Monitors: High-level Synchronization Constructs

Module 6: Process Synchronization

Chapter 5: Process Synchronization

Chapter 5: Process Synchronization. Operating System Concepts 9 th Edition

1 Process Coordination

Background. Module 6: Process Synchronization. Bounded-Buffer (Cont.) Bounded-Buffer. Background

Process/Thread Synchronization

Concurrency: a crash course

IT 540 Operating Systems ECE519 Advanced Operating Systems

IV. Process Synchronisation

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

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

CSE Traditional Operating Systems deal with typical system software designed to be:

CSE 451: Operating Systems Winter Synchronization. Gary Kimura

CS370 Operating Systems

Synchronization Spinlocks - Semaphores

Chapter 5: Process Synchronization

Concurrency: Mutual Exclusion and Synchronization

Lecture. DM510 - Operating Systems, Weekly Notes, Week 11/12, 2018

Semaphores. Jinkyu Jeong Computer Systems Laboratory Sungkyunkwan University

Maximum CPU utilization obtained with multiprogramming. CPU I/O Burst Cycle Process execution consists of a cycle of CPU execution and I/O wait

CS3502 OPERATING SYSTEMS

Synchronization. Race Condition. The Critical-Section Problem Solution. The Synchronization Problem. Typical Process P i. Peterson s Solution

Process Synchronization Mechanisms

Dept. of CSE, York Univ. 1

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

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

Process Synchronization. Mehdi Kargahi School of ECE University of Tehran Spring 2008

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

Example of use. Shared var mutex: semaphore = 1; Process i. begin.. P(mutex); execute CS; V(mutex);.. End;

Semaphores. To avoid busy waiting: when a process has to wait, it will be put in a blocked queue of processes waiting for the same event

Semaphores. Semaphores. Semaphore s operations. Semaphores: observations

Concurrency. Chapter 5

Transcription:

CSCE 313 Introduction to Computer Systems Instructor: Dr. Guofei Gu http://courses.cse.tamu.edu/guofei/csce313 Synchronization: Critical Sections & Semaphores Why? What? How? Examples The Critical Section Problem Software solutions Hardware-supported solutions The basic synchronization mechanism: Semaphores Classical synchronization problems Reading: R&R, Ch 14 (and, later, Ch 13) 1

Synchronization: Critical Sections & Semaphores Why? What? How? Examples The Critical Section Problem Software solutions Hardware-supported solutions The basic synchronization mechanism: Semaphores Classical synchronization problems The Critical Section Problem: Example 1 void echo() { input(in, keyboard); out := in; output(out, display); char in; /* shared variables */ char out; Process 1 Process 2 Operation: Echo() Echo() Interleaved execution ノ input(in,keyboard) out = in; ノノノ output(out,display) ノノノ input(in,keyboard); out = in; output(out,display); ノ Race condition! 2

The Critical Section Problem: Example 2 Producer-consumer with bounded, shared-memory, buffer. out in circular buffer of size n int in, out; Item buffer[n]; int counter; Producer: void deposit(item * ) { while (counter == n) no_op; buffer[in] = ; in = (in+1) MOD n; counter = counter + 1; Consumer: Item * remove() { while (counter == 0) no_op; = buffer[out]; out = (out+1) MOD n; counter = counter - 1; return ; This Implementation is not Correct! operation: on CPU: interleaved execution: Producer counter = counter + 1 reg 1 = counter reg 1 = reg 1 + 1 counter = reg 1 reg 1 = counter reg 1 = reg 1 + 1 counter = reg 1 Consumer counter = counter - 1 reg 2 = counter reg 2 = reg 2-1 counter = reg 2 reg 2 = counter reg 2 = reg 2-1 counter = reg 2 Race condition! Need to ensure that only one process can manipulate variable counter at a time : synchronization. 3

Critical Section Problem: Example 3 Insertion of an element into a list. new curr 1. void insert(new, curr) { /*1*/ new. = curr.; /*2*/ new. = c..; /*3*/ curr. = new; /*4*/ new.. = new; new curr new curr 2. 4. new curr 3. new curr Interleaved Execution causes Errors! Process 1 new1. = curr.; new1. = c..; curr. = new1; new1ext. = new1; Process 2 new2. = curr.; new2. = c..; curr. = new2; new2.. = new2; curr new1 new2 Must guarantee mutually exclusive access to list data structure! 4

Synchronization: Critical Sections & Semaphores Why? What? How? Examples The Critical Section Problem Software solutions Hardware-supported solutions The basic synchronization mechanism: Semaphores Classical synchronization problems Critical Sections Execution of critical section by processes must be mutually exclusive. Typically due to manipulation of shared variables. Need protocol to enforce mutual exclusion. while (TRUE) { enter section; critical section; exit section; remainder section; 5

Criteria for a Solution of the C.S. Problem 1. Mutual exclusion: Only one process at a time can enter the critical section. 2. Progress: A process that halts in non-critical section cannot ent other processes from entering the critical section. When no process is in a critical section, any process that requests to enter the critical section should be permitted to enter without delay. 3. Bounded waiting: A process requesting to enter a critical section should not be delayed indefinitely. Assumptions: Make no assumptions about the relative speed of processors (or their number). A process remains within a critical section for a finite time only. Synchronization: Critical Sections & Semaphores Why? What? How? Examples The Critical Section Problem Software solutions Hardware-supported solutions The basic synchronization mechanism: Semaphores Classical synchronization problems 6

A (Wrong) Solution to the C.S. Problem Two processes P 0 and P 1 int turn; /* turn == i : P i is allowed to enter c.s. ; j=1-i;*/ P i : while (TRUE) { while (turn!= i) no_op; critical section; turn = j; remainder section; What s Wrong? Guarantees mutual exclusion. Does not guarantee progress enforces strict alternation of processes entering CS's. Bounded waiting violated suppose one process terminates while its its turn? 7

Another Wrong Solution (Remove strict alternation requirement ) bool flag[2]; /* initialize to FALSE */ /* flag[i] == TRUE : P i intends to enter c.s.*/ P i : while (TRUE) { while (flag[j]) no_op; flag[i] = TRUE; critical section; flag[i] = FALSE; remainder section; Mutual exclusion violated What s Wrong? Progress ok. Bounded wait ok. 8

Yet Another Wrong Solution (Restore mutual exclusion ) bool flag[2]; /* initialize to FALSE */ /* flag[i] == TRUE : P i intends to enter c.s.*/ while (TRUE) { flag[i] = TRUE; while (flag[j]) no_op; critical section; flag[i] = FALSE; remainder section; What s Wrong? Guarantees mutual exclusion Violates progress both processes could set flag and then deadlock on the while. Bounded waiting violated 9

A Combined Solution (Petersen) int turn; bool flag[2]; /* initialize to FALSE */ while (TRUE) { flag[i] = TRUE; turn = j; while (flag[j]) && (turn == j) no_op; critical section; flag[i] = FALSE; remainder section; Synchronization: Critical Sections & Semaphores Why? What? How? Examples The Critical Section Problem Software solutions Hardware-supported solutions The basic synchronization mechanism: Semaphores Classical synchronization problems 10

Hardware Support For Synchronization Disallow interrupts simplicity widely used problem: interrupt service latency problem: what about multiprocessors? Atomic operations: Operations that check and modify memory areas in a single step (i.e. operation can not be interrupted) Test-And-Set Exchange, Swap, Compare-And-Swap Test-And-Set atomic! bool TestAndSet(bool & var) { bool temp; temp = var; bool lock; /* init to FALSE */ var = TRUE; return temp; while (TRUE) { while (TestAndSet(lock)) no_op; Mutual Exclusion with Test-And-Set critical section; lock = FALSE; remainder section; 11

Exchange (Swap) atomic! void Exchange(bool & a, bool & b){ bool temp; temp = a; bool lock; /*init to FALSE */ a = b; while (TRUE) { b = temp; dummy = TRUE; do Exchange(lock, dummy); while(dummy); Mutual Exclusion with Exchange critical section; lock = FALSE; remainder section; Compare-And-Swap bool Compare&Swap (Type * x, Type old, Type new) { if *x == old { *x = new; return TRUE; else { return FALSE atomic! 12

Some Fun with Compare-and-Swap: Lock-Free Concurrent Data Structures Example: Shared Stack PUSH element C onto stack: head A B C 1. Create C 2. C. = head 3. head = C Some Fun with Compare-and-Swap: Lock-Free Concurrent Data Structures Example: Shared Stack PUSH element C onto stack: What can go wrong?! head A B C C 1. Create C 2. C. = head context switch! 1. Create C 2. C. = head 3. head = C context switch back! Solution: compare-and-swap(head, C., C), 3. head = C i.e. compare and swap head, new value C, and expected value C.. If fails, go back to step 2. 13

Synchronization: Critical Sections & Semaphores Why? What? How? Examples The Critical Section Problem Software solutions Hardware-supported solutions The basic synchronization mechanism: Semaphores Classical synchronization problems Semaphores Problems with solutions above: Although requirements simple (mutual exclusion), addition to programs complex. Based on busy waiting. A Semaphore variable has two operations: wait (or P) and signal (or V) P(Semaphore * s); /* Decrement value of s by 1. If the value becomes negative, the process invoking the P operation is blocked. */ V(Semaphore * s); /* Increment value of s by 1 in a single indivisible action. If value is not positive, then a process blocked by a P is unblocked*/ Binary semaphore: The value of s can be either 1 or 0 (TRUE or FALSE). a.k.a mutex lock General semaphore: The value of s can be any integer. (counting semaphore) 14

Effect of Semaphores Synchronization using semaphores: V(s) P(s) s.value = 0 P(s) Mutual exclusion with semaphores: BinSemaphore * s; /* init to TRUE*/ while (TRUE) { P(s); critical section; V(s) V(s); remainder section; Implementation (with busy waiting): Spinlock Binary Semaphores: P(BinSemaphore * s) { key = FALSE; do exchange(s.value, key); while (key == FALSE); V(BinSemaphore * s) { s.value = TRUE; General Semaphores: BinSemaphore * mutex /*TRUE*/ BinSemaphore * delay /*FALSE*/ P(Semaphore * s) { P(mutex); s.value = s.value - 1; if (s.value < 0) { V(mutex); P(delay); else V(mutex); V(Semaphore * s) { P(mutex); s.value = s.value + 1; if (s.value <= 0) V(delay); V(mutex); 15

Implementation ( without busy waiting) Semaphore bool lock; /* init to FALSE */ int value; PCBList * L; blocked processes P(Semaphore * s) { while (TestAndSet(lock)) no_op; s.value = s.value - 1; if (s.value < 0) { append(this_process, s.l); lock = FALSE; sleep(); lock = FALSE; V(Semaphore * s) { while (TestAndSet(lock)) no_op; s.value = s.value + 1; if (s.value <= 0) { PCB * p = remove(s.l); wakeup(p); lock = FALSE; Deadlock and Starvation Deadlock two or more processes are waiting indefinitely for an event that can be caused by only one of the waiting processes Let S and Q be two semaphores initialized to 1 P 0 P 1 wait (S); wait (Q); wait (Q); wait (S);.... signal (S); signal (Q); signal (Q); signal (S); Starvation indefinite blocking. A process may never be removed from the semaphore queue in which it is suspended Priority Inversion - Scheduling problem when lowerpriority process holds a lock needed by higher-priority process 16

Synchronization: Critical Sections & Semaphores Why? What? How? Examples The Critical Section Problem Software solutions Hardware-supported solutions The basic synchronization mechanism: Semaphores Classical synchronization problems Classical Problems: Producer-Consumer Semaphore * n; /* initialized to 0 */ BinSemaphore * mutex; /* initialized to TRUE */ Producer: while (TRUE) { produce item; P(mutex); deposit item; V(mutex); V(n); Consumer: while (TRUE) { P(n); P(mutex); remove item; V(mutex); consume item; 17

Classical Problems: Producer-Consumer with Bounded Buffer Semaphore * full; /* initialized to 0 */ Semaphore * empty; /* initialized to n */ BinSemaphore * mutex; /* initialized to TRUE */ Producer: while (TRUE) { produce item; P(empty); P(mutex); deposit item; V(mutex); V(full); Consumer: while (TRUE) { P(full); P(mutex); remove item; V(mutex); V(empty); consume item; Classical Problems: Readers/Writers Multiple readers can access data element concurrently. Writers access data element exclusively. Semaphore * mutex, * wrt; /* initialized to 1 */ int nreaders; /* initialized to 0 */ Reader: P(mutex); nreaders = nreaders + 1; if (nreaders == 1) P(wrt); V(mutex); do the reading... Writer: P(wrt); do the writing... V(wrt); P(mutex); nreaders = nreaders - 1; if (nreaders = 0) V(wrt); V(mutex); 18

Incorrect Implementation of Readers/Writers monitor ReaderWriter{ int numberofreaders = 0; int numberofwriters = 0; boolean busy = FALSE; /* READERS */ procedure startread() { while (numberofwriters!= 0); numberofreaders = numberofreaders + 1; procedure finishread() { numberofreaders = numberofreaders - 1; /* WRITERS */ procedure startwrite() { numberofwriters = numberofwriters + 1; while (busy (numberofreaders > 0)); busy = TRUE; ; procedure finishwrite() { numberofwriters = numberofwriters - 1; busy = FALSE; ; ; A Correct Implementation monitor ReaderWriter{ int numberofreaders = 0; int numberofwriters = 0; boolean busy = FALSE; condition oktoread, oktowrite; /* READERS */ procedure startread() { if (busy (oktowrite.lqueue)) oktoread.wait; numberofreaders = numberofreaders + 1; oktoread.signal; procedure finishread() { numberofreaders = numberofreaders - 1; if (numberofreaders = 0) oktowrite.signal; /* WRITERS */ procedure startwrite() { if (busy (numberofreaders > 0)) oktowrite.wait; busy = TRUE; ; procedure finishwrite() { busy = FALSE; if (oktowrite.lqueue) oktowrite.signal; else oktoread.signal; ; ; 19

Synchronization: Critical Sections & Semaphores Why? What? How? Examples The Critical Section Problem Software solutions Hardware-supported solutions The basic synchronization mechanism: Semaphores Classical synchronization problems More sophisticated synchronization mechanisms: Monitors Higher-Level Synchronization Primitives Semaphores as the GOTO among the synchronization primitives. very powerful, but tricky to use. Need higher-abstraction primitives, for example: Monitors synchronized primitive in JAVA Protected Objects (Ada95) Conditional Critical Region 20

Monitors (Hoare / Brinch Hansen, 1973) Safe and effective sharing of abstract data types among several processes. Monitors can be modules, or objects. local variable accessible only through monitor s procedures process can enter monitor only by invoking monitor procedure Only one process can be active in monitor. Additional synchronization through conditions (similar to semaphores) Condition c; c.cwait() : suspend execution of calling process and enqueue it on condition c. The monitor now is available for other processes. c.csignal() : resume a process enqueued on c. If none is enqueued, do nothing. cwait/csignal different from P/V: cwait always waits, csignal does nothing if nobody waits. Structure of Monitor local (shared) data... c 1 procedure 1 procedure 2... blocked processes c m urgent queue procedure k operations initialization code 21

Example: Binary Semaphore monitor BinSemaphore { bool locked; /* Initialize to FALSE */ condition idle; entry void P() { if (locked) idle.cwait(); locked = TRUE; entry void V() { locked = FALSE; idle.csignal(); Example: Bounded Buffer Producer/Consumer monitor boundedbuffer { Item buffer[n]; /* buffer has N items */ int in; /* init to 0 */ int out; /* init to 0 */ int count; /* init to 0 */ condition notfull; /* for synchronization */ condition notempty; void deposit(item x) { if (count == N) notfull.cwait(); buffer[in] = x; in = in + 1 mod N; count = count + 1; notempty.csignal(); void remove(item & x) { if (count == 0) notempty.cwait(); x = buffer[out]; out = out + 1 mod N; count = count - 1; notfull.csignal(); 22

Monitors: Issues, Problems By definition, the above csignal(c) resumes the execution of one suspended process if there is one. the resumed process must be dispatched immediately otherwise other processes may enter the critical section and the condition under which the process was activated could change. What happens when the x.csignal() operation invoked by process P wakes up a suspended process Q? Q waits until P leaves monitor? P waits until Q leaves monitor? csignal() vs cnotify() Nested monitor call problem. Synchronization in JAVA Critical sections: synchronized statement Synchronized methods: Only one thread can be in any synchronized method of an object at any given time. Realized by having a single lock (also called monitor) per object. Synchronized static methods: One lock per class. Synchronized blocks: Finer granularity possible using synchronized blocks Can use lock of any object to define critical section. Additional synchronization: wait(), notify(), notifyall() Realized as methods for all objects 23

Java Synchronized Methods: vanilla Bounded Buffer Producer/Consumer public class BoundedBuffer { Object[] buffer; int in int out; int size int count; synchronized public deposit(object x){ if (count == size) in.wait(); buffer[in] = x; in = (in+1) mod N; count = count + 1; out.notify(); public BoundedBuffer(int n) { size = n; buffer = new Object[size]; in = 0; out = 0; count = 0; synchronized public Object remove() { Object x; if (count == 0) out.wait(); x = buffer[out]; out = (out+1) mod N; count = count - 1; in.notify(); return x; Example: Synchronized Block (D. Flanagan, JAVA in a Nutshell) public static void SortIntArray(int[] a) { // Sort array a. This is synchronized so that // some other thread cannot change elements of // the array or traverse the array while we are // sorting it. // At least no other thread that protect their // accesses to the array with synchronized. // do some non-critical stuff here... synchronized (a) { // do the array sort here. // do some other non-critical stuff here... 24

Appendix Classical Problems: The Barbershop See Operating Systems Internals and Design Principles by William Stallings (6 th ) entry door barber shop (capacity 20) standing room area barber chairs (3) sofa (capacity 4) cashier exit door Semaphore * max_capacity; /* init to 20 */ Semaphore * sofa; /* init to 4 */ Semaphore * barber_chair; /* init to 3 */ Semaphore * coord; /* init to 3 */ Semaphore * cust_ready; /* init to 0 */ Semaphore * leave_b_chair; /* init to 0 */ Semaphore * payment; /* init to 0 */ Semaphore * receipt; /* init to 0 */ 25

Process customer: P(max_capacity); <enter shop> P(sofa); <sit on sofa> P(barber_chair); <get up from sofa> V(sofa); <sit in barber chair> V(cust_ready); P(finished); <leave barber chair> V(leave_b_chair); <pay> V(payment); P(receipt); <exit shop> V(max_capacity); The Barbershop (cont) Process barber: for(;;){ P(cust_ready); P(coord); <cut hair> V(coord); V(finished); P(leave_b_chair); V(barber_chair); Process cashier: for(;;){ P(payment); P(coord); <accept pay> V(coord); V(receipt); Process customer: P(max_capacity); <enter shop> P(mutex1); custnr := ++count; V(mutex1); P(sofa); <sit on sofa> P(barber_chair); <get up from sofa> V(sofa); <sit in barber chair> P(mutex2); enqueue(custnr); V(cust_ready); V(mutex2); P(finished[custnr]); <leave barber chair> V(leave_b_chair); <pay> V(payment); P(receipt); <exit shop> V(max_capacity); The Fair Barbershop Process barber: for(;;){ P(cust_ready); P(mutex2); dequeue(b_cust); V(mutex2); P(coord); <cut hair> V(coord); V(finished[b_cust]); P(leave_b_chair); V(barber_chair); Process cashier: for(;;){ P(payment); P(coord); <accept pay> V(coord); V(receipt); 26