Silberschatz, Galvin, and Gagne  1999 7.1 Applied Operating System Concepts Module 7: Process Synchronization Background The Critical-Section Problem.

Slides:



Advertisements
Similar presentations
Chapter 6: Process Synchronization
Advertisements

5.1 Silberschatz, Galvin and Gagne ©2009 Operating System Concepts with Java – 8 th Edition Chapter 5: CPU Scheduling.
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Chapter 6: Process Synchronization.
Process Synchronization. Module 6: Process Synchronization Background The Critical-Section Problem Peterson’s Solution Synchronization Hardware Semaphores.
6.5 Semaphore Can only be accessed via two indivisible (atomic) operations wait (S) { while S
Synchronization Principles Gordon College Stephen Brinton.
02/19/2010CSCI 315 Operating Systems Design1 Process Synchronization Notice: The slides for this lecture have been largely based on those accompanying.
Silberschatz, Galvin and Gagne  Operating System Concepts Chapter 7: Process Synchronization Background The Critical-Section Problem Synchronization.
Chapter 6: Process Synchronization. Outline Background Critical-Section Problem Peterson’s Solution Synchronization Hardware Semaphores Classic Problems.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts – 7 th Edition, Feb 8, 2005 Objectives Understand.
Silberschatz, Galvin and Gagne ©2007 Operating System Concepts with Java – 7 th Edition, Nov 15, 2006 Process Synchronization (Or The “Joys” of Concurrent.
Process Synchronization
02/23/2004CSCI 315 Operating Systems Design1 Process Synchronization Notice: The slides for this lecture have been largely based on those accompanying.
What we will cover… Process Synchronization Basic Concepts
02/11/2004CSCI 315 Operating Systems Design1 Process Synchronization Notice: The slides for this lecture have been largely based on those accompanying.
02/17/2010CSCI 315 Operating Systems Design1 Process Synchronization Notice: The slides for this lecture have been largely based on those accompanying.
1 School of Computing Science Simon Fraser University CMPT 300: Operating Systems I Ch 6: Process Synchronization Dr. Mohamed Hefeeda.
02/25/2004CSCI 315 Operating Systems Design1 Process Synchronization Notice: The slides for this lecture have been largely based on those accompanying.
Instructor: Umar KalimNUST Institute of Information Technology Operating Systems Process Synchronization.
02/14/2007CSCI 315 Operating Systems Design1 Process Synchronization Notice: The slides for this lecture have been largely based on those accompanying.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts Interrupt Interrupt and Context Switching (Process.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts – 7 th Edition, Feb 8, 2005 Module 6: Process Synchronization.
02/19/2007CSCI 315 Operating Systems Design1 Process Synchronization Notice: The slides for this lecture have been largely based on those accompanying.
Adopted from and based on Textbook: Operating System Concepts – 8th Edition, by Silberschatz, Galvin and Gagne Updated and Modified by Dr. Abdullah Basuhail,
Operating Systems CSE 411 CPU Management Oct Lecture 13 Instructor: Bhuvan Urgaonkar.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts – 7 th Edition, Feb 8, 2005 Background Concurrent.
7a.1 Silberschatz, Galvin and Gagne ©2003 Operating System Concepts with Java Module 7a: Classic Synchronization Background The Critical-Section Problem.
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Chapter 6: Process Synchronization.
Background Concurrent access to shared data may result in data inconsistency Maintaining data consistency requires mechanisms to ensure the orderly execution.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts Module 6: Process Synchronization Background The.
6.3 Peterson’s Solution The two processes share two variables: Int turn; Boolean flag[2] The variable turn indicates whose turn it is to enter the critical.
Silberschatz, Galvin and Gagne  Operating System Concepts Chapter 7: Process Synchronization Background The Critical-Section Problem Synchronization.
Silberschatz and Galvin  Operating System Concepts Module 6: Process Synchronization Background The Critical-Section Problem Synchronization.
Process Synchronization Background The Critical-Section Problem Peterson’s Solution Synchronization Hardware Semaphores Classic Problems of Synchronization.
Principles of Operating Systems Lecture 6 and 7 - Process Synchronization.
1 Chapter 6: Process Synchronization Background The Critical-Section Problem Peterson’s Solution Special Machine Instructions for Synchronization Semaphores.
Silberschatz, Galvin and Gagne  Operating System Concepts Chapter 7: Process Synchronization Background The Critical-Section Problem Synchronization.
Silberschatz, Galvin and Gagne  Operating System Concepts Chapter 7: Process Synchronization Background The Critical-Section Problem Synchronization.
Chap 6 Synchronization. Background Concurrent access to shared data may result in data inconsistency Maintaining data consistency requires mechanisms.
1 Chapter 7: Process Synchronization 2 Contents Background The Critical-Section Problem Synchronization Hardware Semaphores Classical Problems of Synchronization.
Chapter 6: Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts Module 6: Synchronization Background The Critical-Section.
Chapter 6: Process Synchronization
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts Module 6: Process Synchronization Background The.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts Module 6: Process Synchronization Background The.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts Module 6: Process Synchronization Background The.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts Module 6: Process Synchronization Background The.
Chapter 6: Process Synchronization. 6.2 Silberschatz, Galvin and Gagne ©2005 Operating System Concepts Module 6: Process Synchronization Background The.
Chapter 6: Process Synchronization. Module 6: Process Synchronization Background The Critical-Section Problem Peterson’s Solution Synchronization Hardware.
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Chapter 6: Process Synchronization.
7.1 Process Synchronization Background The Critical-Section Problem Synchronization Hardware Semaphores Classical Problems of Synchronization Monitors.
CSS430 Processes Synchronization1 CSS430 Process Synchronization Textbook Ch6 These slides were compiled from the OSC textbook slides (Silberschatz, Galvin,
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Chapter 6: Process Synchronization.
CSC 360 Instructor: Kui Wu More on Process Synchronization Semaphore, Monitor, Condition Variables.
CSE Operating System Principles Synchronization.
Process Synchronization. Objectives To introduce the critical-section problem, whose solutions can be used to ensure the consistency of shared data To.
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition Chapter 6: Process Synchronization.
Silberschatz, Galvin and Gagne ©2013 Operating System Concepts – 9 th Edition Chapter 5: Process Synchronization.
6.1 Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition Q: 請以實際例子說明 critical section 之意 ? 何謂 race condition? while (true) { /*
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition Chapter 6: Process Synchronization.
Chapter 6 Synchronization Dr. Yingwu Zhu. The Problem with Concurrent Execution Concurrent processes (& threads) often access shared data and resources.
6.1 Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition Chapter 6: Synchronization Background The Critical-Section Problem Peterson’s.
Chapter 6-7: Process Synchronization
Chapter 5: Process Synchronization
Chapter 6: Process Synchronization
Chapter 6: Process Synchronization
Process Synchronization
Lecture 9: Process Synchronization
Chapter 6: Process Synchronization
Process Synchronization
Module 7a: Classic Synchronization
Presentation transcript:

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Module 7: Process Synchronization Background The Critical-Section Problem Synchronization Hardware Semaphores Classical Problems of Synchronization Monitors Java Synchronization Synchronization in Solaris 2 Synchronization in Windows NT

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Background Concurrent access to shared data may result in data inconsistency. Maintaining data consistency requires mechanisms to ensure the orderly execution of cooperating processes. Shared-memory solution to bounded-butter problem (Chapter 4) has a race condition on the class data count

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Bounded Buffer public class BoundedBuffer { public void enter(Object item) { // producer calls this method } public Object remove() { // consumer calls this method } // potential race condition on count private volatile int count; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts enter() Method // producer calls this method public void enter(Object item) { while (count == BUFFER_SIZE) ; // do nothing // add an item to the buffer ++count; buffer[in] = item; in = (in + 1) % BUFFER_SIZE; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts remove() Method // consumer calls this method public Object remove() { Object item; while (count == 0) ; // do nothing // remove an item from the buffer --count; item = buffer[out]; out = (out + 1) % BUFFER_SIZE; return item; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Solution to Critical-Section Problem 1.Mutual Exclusion. If process Pi is executing in its critical section, then no other processes can be executing in their critical sections. 2.Progress. If no process is executing in its critical section and there exist some processes that wish to enter their critical section, then the selection of the processes that will enter the critical section next cannot be postponed indefinitely. 3.Bounded Waiting. A bound must exist on the number of times that other processes are allowed to enter their critical sections after a process has made a request to enter its critical section and before that request is granted. Assume that each process executes at a nonzero speed No assumption concerning relative speed of the n processes.

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Worker Thread public class Worker extends Thread { public Worker(String n, int i, MutualExclusion s) { name = n; id = i; shared = s; } public void run() { /* see next slide */ } private String name; private int id; private MutualExclusion shared; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts run() Method of Worker Thread public void run() { while (true) { shared.enteringCriticalSection(id); // in critical section code shared.leavingCriticalSection(id); // out of critical section code }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts MutualExclusion Abstract Class public abstract class MutualExclusion { public static void criticalSection() { // simulate the critical section } public static void nonCriticalSection() { // simulate the non-critical section } public abstract void enteringCriticalSection(int t); public abstract void leavingCriticalSection(int t); public static final int TURN_0 = 0; public static final int TURN_1 = 1; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Testing Each Algorithm public class TestAlgorithm { public static void main(String args[]) { MutualExclusion alg = new Algorithm_1(); Worker first = new Worker("Runner 0", 0, alg); Worker second = new Worker("Runner 1", 1, alg); first.start(); second.start(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Algorithm 1 public class Algorithm_1 extends MutualExclusion { public Algorithm_1() { turn = TURN_0; } public void enteringCriticalSection(int t) { while (turn != t) Thread.yield(); } public void leavingCriticalSection(int t) { turn = 1 - t; } private volatile int turn; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Algorithm 2 public class Algorithm_2 extends MutualExclusion { public Algorithm_2() { flag[0] = false; flag[1] = false; } public void enteringCriticalSection(int t) { // see next slide } public void leavingCriticalSection(int t) { flag[t] = false; } private volatile boolean[] flag = new boolean[2]; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Algorithm 2 – enteringCriticalSection() public void enteringCriticalSection(int t) { int other = 1 - t; flag[t] = true; while (flag[other] == true) Thread.yield(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Algorithm 3 public class Algorithm_3 extends MutualExclusion { public Algorithm_3() { flag[0] = false; flag[1] = false; turn = TURN_0; } public void enteringCriticalSection(int t) {/* see next slides */ } public void leavingCriticalSection(int t) {{/* see next slides */ } private volatile int turn; private volatile boolean[] flag = new boolean[2]; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Algorithm 3 – enteringCriticalSection() public void enteringCriticalSection(int t) { int other = 1 - t; flag[t] = true; turn = other; while ( (flag[other] == true) && (turn == other) ) Thread.yield(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Algo. 3 – leavingingCriticalSection() public void leavingCriticalSection(int t) { flag[t] = false; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Synchronization Hardware public class HardwareData { public HardwareData(boolean v) { data = v; } public boolean get() { return data; } public void set(boolean v) { data = v; } private boolean data; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Test-and-Set Instruction (in Java) public class HardwareSolution { public static boolean testAndSet(HardwareData target) { HardwareData temp = new HardwareData(target.get()); target.set(true); return temp.get(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Thread using Test-and-Set HardwareData lock = new HardwareData(false); while (true) { while (HardwareSolution.testAndSet(lock)) Thread.yield(); // do nothing // now in critical section code lock.set(false); // out of critical section }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Swap instruction public static void swap(HardwareData a, HardwareData b) { HardwareData temp = new HardwareData(a.get()); a.set(b.get()); b.set(temp.get()); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Thread using Swap HardwareData lock = new HardwareData(false); HardwareData key = new HardwareData(true); while (true) { key.set(true); do { HardwareSolution.swap(lock,key); } while (key.get() == true); // now in critical section code lock.set(false); // out of critical section }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Semaphore Synchronization tool that does not require busy waiting. Semaphore S – integer variable can only be accessed via two indivisible (atomic) operations P (S): while S  0 do no-op; S--; V(S): S++;

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Semaphore as General Synchronization Tool Semaphore S; // initialized to 1 P(S); CriticalSection() V(S);

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Semaphore Eliminating Busy-Waiting P(S) { value--; if (value < 0) { add this process to list block } V(S) { value++; if (value <= 0) { remove a process P from list wakeup(P); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Synchronization Using Semaphores public class FirstSemaphore { public static void main(String args[]) { Semaphore sem = new Semaphore(1); Worker[] bees = new Worker[5]; for (int i = 0; i < 5; i++) bees[i] = new Worker(sem, "Worker " + (new Integer(i)).toString() ); for (int i = 0; i < 5; i++) bees[i].start(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Worker Thread public class Worker extends Thread { public Worker(Semaphore) { sem = s;} public void run() { while (true) { sem.P(); // in critical section sem.V(); // out of critical section } private Semaphore sem; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts 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 P(S);P(Q); P(Q);P(S);  V(S);V(Q); V(Q)V(S); Starvation – indefinite blocking. A process may never be removed from the semaphore queue in which it is suspended.

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Two Types of Semaphores Counting semaphore – integer value can range over an unrestricted domain. Binary semaphore – integer value can range only between 0 and 1; can be simpler to implement. Can implement a counting semaphore S as a binary semaphore.

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Classical Problems of Synchronization Bounded-Buffer Problem Readers and Writers Problem Dining-Philosophers Problem

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Bounded-Buffer Problem public class BoundedBuffer { public BoundedBuffer() { /* see next slides */ } public void enter() { /* see next slides */ } public Object remove() { /* see next slides */ } private static final int BUFFER_SIZE = 2; private Semaphore mutex; private Semaphore empty; private Semaphore full; private int in, out; private Object[] buffer; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Bounded Buffer Constructor public BoundedBuffer() { // buffer is initially empty count = 0; in = 0; out = 0; buffer = new Object[BUFFER_SIZE]; mutex = new Semaphore(1); empty = new Semaphore(BUFFER_SIZE); full = new Semaphore(0); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts enter() Method public void enter(Object item) { empty.P(); mutex.P(); // add an item to the buffer buffer[in] = item; in = (in + 1) % BUFFER_SIZE; mutex.V(); full.V(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts remove() Method public Object remove() { full.P(); mutex.P(); // remove an item from the buffer Object item = buffer[out]; out = (out + 1) % BUFFER_SIZE; mutex.V(); empty.V(); return item; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Readers-Writers Problem: Reader public class Reader extends Thread { public Reader(Database db) { server = db; } public void run() { int c; while (true) { c = server.startRead(); // now reading the database c = server.endRead(); } private Databaseserver; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Readers-Writers Problem: Writer public class Writer extends Thread { public Writer(Database db) { server = db; } public void run() { while (true) { server.startWrite(); // now writing the database server.endWrite(); } private Databaseserver; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Readers-Writers Problem (cont) public class Database { public Database() { readerCount = 0; mutex = new Semaphore(1); db = new Semaphore(1); } public int startRead() { /* see next slides */ } public int endRead() { /* see next slides */ } public void startWrite() { /* see next slides */ } public void endWrite() { /* see next slides */ } private int readerCount; // number of active readers Semaphore mutex; // controls access to readerCount Semaphore db; // controls access to the database }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts startRead() Method public int startRead() { mutex.P(); ++readerCount; // if I am the first reader tell all others // that the database is being read if (readerCount == 1) db.P(); mutex.V(); return readerCount; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts endRead() Method public int endRead() { mutex.P(); --readerCount; // if I am the last reader tell all others // that the database is no longer being read if (readerCount == 0) db.V(); mutex.V(); return readerCount; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Writer Methods public void startWrite() { db.P(); } public void endWrite() { db.V(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Dining-Philosophers Problem Shared data Semaphore chopStick[] = new Semaphore[5];

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Dining-Philosophers Problem (Cont.) Philosopher i: while (true) { // get left chopstick chopStick[i].P(); // get right chopstick chopStick[(i + 1) % 5].P(); // eat for awhile //return left chopstick chopStick[i].V(); // return right chopstick chopStick[(i + 1) % 5].V(); // think for awhile }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Monitors A monitor is a high-level abstraction that provides thread safety. Only one thread may be active within the monitor at a time. monitor monitor-name { // variable declarations public entry p1(…) { … } public entry p2(…) { … }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Condition Variables condition x, y; A thread that invokes x.wait is suspended until another thread invokes x.signal

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Monitor with condition variables

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Solution to Dining Philosophers monitor diningPhilosophers { int[] state = new int[5]; static final int THINKING = 0; static final int HUNGRY = 1; static final int EATING = 2; condition[] self = new condition[5]; public diningPhilosophers { for (int i = 0; i < 5; i++) state[i] = THINKING; } public entry pickUp(int i) { /* see next slides */ } public entry putDown(int i) { /* see next slides */ } private test(int i) {/* see next slides */ } }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts pickUp() Procedure public entry pickUp(int i) { state[i] = HUNGRY; test(i); if (state[i] != EATING) self[i].wait; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts putDown() Procedure public entry putDown(int i) { state[i] = THINKING; // test left and right neighbors test((i + 4) % 5); test((i + 1) % 5); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts test() Procedure private test(int i) { if ( (state[(i + 4) % 5] != EATING) && (state[i] == HUNGRY) && (state[(i + 1) % 5] != EATING) ) { state[i] = EATING; self[i].signal; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Java Synchronization Synchronized, wait(), notify() statements Multiple Notifications Block Synchronization Java Semaphores Java Monitors

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts synchronized Statement Every object has a lock associated with it. Calling a synchronized method requires “owning” the lock. If a calling thread does not own the lock (another thread already owns it), the calling thread is placed in the wait set for the object’s lock. The lock is released when a thread exits the synchronized method.

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Entry Set

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts synchronized enter() Method public synchronized void enter(Object item) { while (count == BUFFER_SIZE) Thread.yield(); ++count; buffer[in] = item; in = (in + 1) % BUFFER_SIZE; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts synchronized remove() Method public synchronized Object remove() { Object item; while (count == 0) Thread.yield(); --count; item = buffer[out]; out = (out + 1) % BUFFER_SIZE; return item; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts The wait() Method When a thread calls wait(), the following occurs: - the thread releases the object lock. - thread state is set to blocked. - thread is placed in the wait set.

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Entry and Wait Sets

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts The notify() Method When a thread calls notify(), the following occurs: - selects an arbitrary thread T from the wait set. - moves T to the entry set. - sets T to Runnable. T can now compete for the object’s lock again.

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts enter() with wait/notify Methods public synchronized void enter(Object item) { while (count == BUFFER_SIZE) try { wait(); } catch (InterruptedException e) { } } ++count; buffer[in] = item; in = (in + 1) % BUFFER_SIZE; notify(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts remove() with wait/notify Methods public synchronized Object remove() { Object item; while (count == 0) try { wait(); } catch (InterruptedException e) { } --count; item = buffer[out]; out = (out + 1) % BUFFER_SIZE; notify(); return item; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Multiple Notifications notify() selects an arbitrary thread from the wait set. *This may not be the thread that you want to be selected. Java does not allow you to specify the thread to be selected. notifyAll() removes ALL threads from the wait set and places them in the entry set. This allows the threads to decide among themselves who should proceed next. notifyAll() is a conservative strategy that works best when multiple threads may be in the wait set.

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Reader Methods with Java Synchronization public class Database { public Database() { readerCount = 0; dbReading = false; dbWriting = false; } public synchronized int startRead() { /* see next slides */ } public synchronized int endRead() { /* see next slides */ } public synchronized void startWrite() { /* see next slides */ } public synchronized void endWrite() { /* see next slides */ } private int readerCount; private boolean dbReading; private boolean dbWriting; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts startRead() Method public synchronized int startRead() { while (dbWriting == true) { try { wait(); } catch (InterruptedException e) { } ++readerCount; if (readerCount == 1) dbReading = true; return readerCount; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts endRead() Method public synchronized int endRead() { --readerCount if (readerCount == 0) db.notifyAll(); return readerCount; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Writer Methods public void startWrite() { while (dbReading == true || dbWriting == true) try { wait(); } catch (InterruptedException e) { } dbWriting = true; } public void endWrite() { dbWriting = false; notifyAll(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Block Synchronization Blocks of code – rather than entire methods – may be declared as synchronized. This yields a lock scope that is typically smaller than a synchronized method.

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Block Synchronization (cont) Object mutexLock = new Object();... public void someMethod() { // non-critical section synchronized(mutexLock) { // critical section } // non-critical section }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Java Semaphores Java does not provide a semaphore, but a basic semaphore can be constructed using Java synchronization mechanism.

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Semaphore Class public class Semaphore { public Semaphore() { value = 0; } public Semaphore(int v) { value = v; } public synchronized void P() { /* see next slide */ } public synchronized void V() { /* see next slide */ } private int value; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts P() Operation public synchronized void P() { while (value <= 0) { try { wait(); } catch (InterruptedException e) { } } value --; }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts V() Operation public synchronized void V() { ++value; notify(); }

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Solaris 2 Synchronization Solaris 2 Provides: - adaptive mutex - condition variables - semaphores - reader-writer locks

Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Windows NT Synchronization Windows NT Provides: - mutex - critical sections - semaphores - event objects