13/03/07week 21 ceng334 introduction to operating systems erol sahin dept of computer eng. middle...
TRANSCRIPT
![Page 1: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/1.jpg)
13/03/07Week 2 1
CENG334Introduction to Operating Systems
Erol Sahin
Dept of Computer Eng.Middle East Technical University
Ankara, TURKEY
URL: http://kovan.ceng.metu.edu.tr/ceng334
Monitors, Condvars, DeadlocksTopics:•Monitors•Condition Variables•Deadlocks•Dining philosopher problem
![Page 2: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/2.jpg)
2
Midterm date
Midterm on April 5th? Thursday..
![Page 3: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/3.jpg)
3
SemaphoresHigher-level synchronization
construct● Designed by Edsger Dijkstra in the
1960's, part of the THE operatingsystem (classic stuff!)
Semaphore is a shared counter
Two operations on semaphores:
P() or wait() or down()● From Dutch “proeberen”, meaning “test”● Atomic action:
● Wait for semaphore value to become > 0, then decrement it
V() or signal() or up()● From Dutch “verhogen”, meaning “increment”● Atomic action:
● Increments semaphore value by 1.
Semaphore
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 4: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/4.jpg)
4
Producer/Consumer: naïve implementation
Producer Consumer
int count = 0;
Producer() {int item;while (TRUE) {
item = bake();if (count == N) sleep();insert_item(item);count = count + 1;if (count == 1)
wakeup(consumer);}
}
Consumer() {int item;while (TRUE) {
if (count == 0) sleep();item = remove_item();count = count – 1;if (count == N-1)
wakeup(producer);eat(item);
}}
What's wrong with this code? What if we context switch right here??
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 5: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/5.jpg)
5
A fix using semaphores
Producer Consumer
Semaphore mutex = 1;Semaphore empty = N;Semaphore full = 0;
Producer() {int item;while (TRUE) {
item = bake();P(empty);P(mutex);insert_item(item);V(mutex);V(full);
}}
Consumer() {int item;while (TRUE) {
P(full);P(mutex);item = remove_item();V(mutex);V(empty);eat(item);
}}
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 6: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/6.jpg)
6
Reader/Writers
Let's go back to the problem at the beginning of lecture.● Single shared object● Want to allow any number of threads to read simultaneously● But, only one thread should be able to write to the object at a time
● (And, not interfere with any readers...)
Semaphore mutex = 1;Semaphore wrt = 1;int readcount = 0;
Writer() {P(wrt);do_write();V(wrt);}
Reader() {P(mutex);readcount++;if (readcount == 1) {
P(wrt);}V(mutex);do_read();P(mutex);readcount--;if (readcount == 0) {
V(wrt);}V(mutex);
Why the test here??
Adapted from Matt Welsh’s (Harvard University) slides.
✔ A Reader should only wait for a Writer to complete its do_write().✔ A Reader should not wait for other Readers to complete their do_read().✔ The Writer should wait for the other Writers to complete their do_write().✔ The Writer should wait for all the Readers to complete their do_read().
![Page 7: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/7.jpg)
7
Issues with Semaphores
Much of the power of semaphores derives from calls toP() and V() that are unmatched
● See previous example!
Unlike locks, acquire() and release() are not always paired.
This means it is a lot easier to get into trouble with semaphores.● “More rope”
Would be nice if we had some clean, well-defined language support for synchronization...
● Java does!
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 8: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/8.jpg)
11
Java Synchronization SupportJava synchronization based on locks and condition variables
● Every Java object can be used as a lock
What's nice about this?● Compiler ensures that lock is released before leaving the synchronized block
● Even if there is an exception!!
Condition variable (CV): allows a thread to wait or wakeup other threads
Three operations on condition variables:● wait() -- Block until another thread calls notify() or notifyAll() on the CV● notify() -- Wake up one thread waiting on the CV● notifyAll() -- Wake up all threads waiting on the CV
Object foo;synchronized (foo) { // Do some stuff with 'foo' locked...}
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 9: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/9.jpg)
12
Bounded Buffer using CV's
int theArray[ARRAY_SIZE], size;Object theLock;
void put(int val) {synchronized(theLock) {
while (size == ARRAY_SIZE) {theLock.wait();
}addItemToArray(val);size++;if (size == 1)
theLock.notify();}
}
int get() {int item;synchronized(theLock) {
while (size == 0) {theLock.wait();
}item = getItemFromArray()size--;if (size == ARRAY_SIZE-1)
theLock.notify();}return item;
}
Problems with this code??
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 10: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/10.jpg)
13
Bounded Buffer using CV's
int theArray[ARRAY_SIZE], size;Object theLock;
void put(int val) {synchronized(theLock) {
while (size == ARRAY_SIZE) {theLock.wait();
}addItemToArray(val);size++;if (size == 1)
theLock.notify();}
}
int get() {int item;synchronized(theLock) {
while (size == 0) {theLock.wait();
}item = getItemFromArray()size--;if (size == ARRAY_SIZE-1)
theLock.notify();}return item;
}
Assumes only a single thread calling put() and get() at a time!If two threads call get(), then two threads call put(), only one will be woken up!!
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 11: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/11.jpg)
14
How to fix this problem?
Every notifyAll() will cause all threads to wake up and re-check theempty or full condition.
● Could be inefficient if a lot of threads are involved...
int theArray[ARRAY_SIZE], size;Object theLock;
void put(int val) {synchronized(theLock) {
while (size == ARRAY_SIZE) {theLock.wait();
}addItemToArray(val);size++;if (size == 1)
theLock.notifyAll();}
}
int get() {int item;synchronized(theLock) {
while (size == 0) {theLock.wait();
}item = getItemFromArray()size--;if (size == ARRAY_SIZE-1)
theLock.notifyAll();}return item;
}
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 12: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/12.jpg)
15
Monitors
This style of using locks and CV's to protect access to a sharedobject is often called a monitor
● Think of a monitor as a lock protecting an object, plus a queue of waiting threads.
Shared data
Methods accessingshared data
Waiting threads
At most one thread in the monitor at a time
How is this different than a lock???
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 13: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/13.jpg)
16
Monitors
Shared data
Methods accessingshared data
unlocked
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 14: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/14.jpg)
17
Monitors
Shared data
Methods accessingshared data
locked
zzzz...
zzzz...
Sleeping thread no longer “in” the monitor.(But not on the waiting queue either! Why?)
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 15: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/15.jpg)
18
Monitors
Shared data
Methods accessingshared data
lockedMonitor stays locked!(Lock now owned bydifferent thread...)
zzzz...
notify()
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 16: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/16.jpg)
19
Monitors
Shared data
Methods accessingshared data
locked
notify()
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 17: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/17.jpg)
20
Monitors
Shared data
Methods accessingshared data
locked
No guarantee which order threads get into the monitor.(Not necessarily FIFO!)
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 18: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/18.jpg)
21
CVs in Java
In Java, a thread can only call wait(), notify(), or notifyAll() if itholds the lock of the associated object
Why?
Object foo;
/* NOT ALLOWED!!! */foo.notify();
/* This is ok ... */synchronized(foo) { foo.notify(); }
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 19: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/19.jpg)
22
CVs in JavaIn Java, a thread can only call wait(), notify(), or notifyAll() if it
holds the lock of the associated object
Why?● Want to avoid common race conditions!
Object foo;
/* NOT ALLOWED!!! */foo.notify();
/* This is ok ... */synchronized(foo) { foo.notify(); }
if (foo.count < 0) {synchronized (foo) {
foo.wait();}
}
/* Another thread... */synchronized (foo) {
foo.count++;foo.notify();
}
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 20: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/20.jpg)
23
Hoare vs. Mesa Monitor SemanticsThe monitor notify() operation can have two different meanings:
Hoare monitors (1974)● notify(CV) means to run the waiting thread immediately● Causes notifying thread to block
Mesa monitors (Xerox PARC, 1980)● notify(CV) puts waiting thread back onto the “ready queue” for the monitor● But, notifying thread keeps running
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 21: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/21.jpg)
24
Hoare vs. Mesa Monitor SemanticsThe monitor notify() operation can have two different meanings:
Hoare monitors (1974)● notify(CV) means to run the waiting thread immediately● Causes notifying thread to block
Mesa monitors (Xerox PARC, 1980)● notify(CV) puts waiting thread back onto the “ready queue” for the monitor● But, notifying thread keeps running
What's the practical difference?● In Hoare-style semantics, the “condition” that triggered the notify()
will always be true when the awoken thread runs● For example, that the buffer is now no longer empty
● In Mesa-style semantics, awoken thread has to recheck the condition● Since another thread might have beaten it to the punch
Adapted from Matt Welsh’s (Harvard University) slides.
![Page 22: 13/03/07Week 21 CENG334 Introduction to Operating Systems Erol Sahin Dept of Computer Eng. Middle East Technical University Ankara, TURKEY URL:](https://reader034.vdocuments.net/reader034/viewer/2022042608/5697c01e1a28abf838cd0f5a/html5/thumbnails/22.jpg)
25
The Big PictureThe point here is that getting synchronization right is hard
How to pick between locks, semaphores, condvars, monitors???
Locks are very simple for many cases.● Issues: Maybe not the most efficient solution● For example, can't allow multiple readers but one writer inside a standard lock.
Condition variables allow threads to sleep while holding a lock● Just be sure you understand whether they use Mesa or Hoare semantics!
Semaphores provide pretty general functionality● But also make it really easy to botch things up.
Java captures a lot of useful common operations with its use of monitors (compiler checking is nice too)
● But, not possible to implement everything directly with Java's primitives.
Adapted from Matt Welsh’s (Harvard University) slides.