2-Dining Puppies Mutex Failure
-
Upload
penelope-duncan -
Category
Documents
-
view
29 -
download
2
description
Transcript of 2-Dining Puppies Mutex Failure
![Page 1: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/1.jpg)
1
2-Dining Puppies Mutex Failure
![Page 2: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/2.jpg)
2
Outline for Today• Objective:
– Reader-writer problem– Message Passing
• Administrative details:
![Page 3: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/3.jpg)
3
Readers/Writers Problem
Synchronizing access to a file or data record in a database such that any number of threads requesting read-only access are allowed but only one thread requesting write access is allowed, excluding all readers.
![Page 4: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/4.jpg)
4
Template for Readers/WritersReader(){while (true)
{
read
}}
Writer(){while (true)
{
write
}}
/*request r access*/
/*release r access*/
/*request w access*/
/*release w access*/
![Page 5: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/5.jpg)
5
Template for Readers/WritersReader(){while (true)
{
read
}}
Writer(){while (true)
{
write
}}
fd = open(foo, 0);
close(fd);
fd = open(foo, 1);
close(fd);
![Page 6: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/6.jpg)
6
Template for Readers/WritersReader(){while (true)
{
read
}}
Writer(){while (true)
{
write
}}
startRead();
endRead();
startWrite();
endWrite();
![Page 7: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/7.jpg)
7
R/W - Monitor StyleBoolean busy = false;
int numReaders = 0;
Lock filesMutex;
Condition OKtoWrite, OKtoRead;
void startRead () {
filesMutex.Acquire( );
while ( busy )
OKtoRead.Wait(&filesMutex);
numReaders++;
filesMutex.Release( );}
void endRead () {
filesMutex.Acquire( );
numReaders--;
if (numReaders == 0)
OKtoWrite.Signal(&filesMutex);
filesMutex.Release( );}
void startWrite() {
filesMutex.Acquire( );
while (busy || numReaders != 0)
OKtoWrite.Wait(&filesMutex);
busy = true;
filesMutex.Release( );}
void endWrite() {
filesMutex.Acquire( );
busy = false;
OKtoRead.Broadcast(&filesMutex); OKtoWrite.Signal(&filesMutex);
filesMutex.Release( );}
![Page 8: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/8.jpg)
8
Guidelines for Choosing Lock Granularity
1. Keep critical sections short. Push “noncritical” statements outside of critical sections to reduce contention.
2. Limit lock overhead. Keep to a minimum the number of times mutexes are acquired and released.
Note tradeoff between contention and lock overhead.
3. Use as few mutexes as possible, but no fewer.Choose lock scope carefully: if the operations on two different data
structures can be separated, it may be more efficient to synchronize those structures with separate locks.
Add new locks only as needed to reduce contention. “Correctness first, performance second!”
![Page 9: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/9.jpg)
9
Semaphore Solution
int readCount = 0;
semaphore mutex = 1;
semaphore writeBlock = 1;
![Page 10: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/10.jpg)
10
Reader(){
while (TRUE) {
other stuff;
P(mutex);
readCount = readCount +1;
if(readCount == 1)
P(writeBlock);
V(mutex);
access resource;
P(mutex);
readCount = readCount -1;
if(readCount == 0)
V(writeBlock);
V(mutex); }}
Writer(){
while(TRUE){
other stuff;
P(writeBlock);
access resource;
V(writeBlock);
}}
![Page 11: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/11.jpg)
11
Attempt at Writer Priority
int readCount = 0, writeCount = 0;
semaphore mutex1 = 1, mutex2 = 1;
semaphore readBlock = 1;
semaphore writeBlock = 1;
![Page 12: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/12.jpg)
12
Reader(){ while (TRUE) { other stuff; P(readBlock); P(mutex1); readCount = readCount +1; if(readCount == 1) P(writeBlock); V(mutex1); V(readBlock); access resource; P(mutex1); readCount = readCount -1; if(readCount == 0) V(writeBlock); V(mutex1); }}
Writer(){ while(TRUE){ other stuff; P(mutex2); writeCount = writeCount +1; if (writeCount == 1) P(readBlock); V(mutex2); P(writeBlock); access resource; V(writeBlock); P(mutex2); writeCount - writeCount - 1; if (writeCount == 0) V(readBlock); V(mutex2); }}
Reader2
Writer1
Reader1
![Page 13: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/13.jpg)
13
Reader(){ while (TRUE) { other stuff; P(readBlock); P(mutex1); readCount = readCount +1; if(readCount == 1) P(writeBlock); V(mutex1); V(readBlock); access resource; P(mutex1); readCount = readCount -1; if(readCount == 0) V(writeBlock); V(mutex1); }}
Writer(){ while(TRUE){ other stuff; P(mutex2); writeCount = writeCount +1; if (writeCount == 1) P(readBlock); V(mutex2); P(writeBlock); access resource; V(writeBlock); P(mutex2); writeCount - writeCount - 1; if (writeCount == 0) V(readBlock); V(mutex2); }}
Reader2
Writer1Reader1
![Page 14: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/14.jpg)
14
Reader(){ while (TRUE) { other stuff; P(writePending); P(readBlock); P(mutex1); readCount = readCount +1; if(readCount == 1) P(writeBlock); V(mutex1); V(readBlock); V(writePending); access resource; P(mutex1); readCount = readCount -1; if(readCount == 0) V(writeBlock); V(mutex1); }}
Writer(){ while(TRUE){ other stuff; P(mutex2); writeCount = writeCount +1; if (writeCount == 1) P(readBlock); V(mutex2); P(writeBlock); access resource; V(writeBlock); P(mutex2); writeCount - writeCount - 1; if (writeCount == 0) V(readBlock); V(mutex2); }}
![Page 15: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/15.jpg)
15
Reader(){ while (TRUE) { other stuff; P(writePending); P(readBlock); P(mutex1); readCount = readCount +1; if(readCount == 1) P(writeBlock); V(mutex1); V(readBlock); V(writePending); access resource; P(mutex1); readCount = readCount -1; if(readCount == 0) V(writeBlock); V(mutex1); }}
Writer(){ while(TRUE){ other stuff; P(mutex2); writeCount = writeCount +1; if (writeCount == 1) P(readBlock); V(mutex2); P(writeBlock); access resource; V(writeBlock); P(mutex2); writeCount - writeCount - 1; if (writeCount == 0) V(readBlock); V(mutex2); }}
Reader1
Writer1
Reader2
Assumptions about semaphore semantics?
![Page 16: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/16.jpg)
16
Reader(){ while (TRUE) { other stuff; P(writePending); P(readBlock); P(mutex1); readCount = readCount +1; if(readCount == 1) P(writeBlock); V(mutex1); V(readBlock); V(writePending); access resource; P(mutex1); readCount = readCount -1; if(readCount == 0) V(writeBlock); V(mutex1); }}
Writer(){ while(TRUE){ other stuff; P(mutex2); writeCount = writeCount +1; if (writeCount == 1) P(readBlock); V(mutex2); P(writeBlock); access resource; V(writeBlock); P(mutex2); writeCount - writeCount - 1; if (writeCount == 0) V(readBlock); V(mutex2); }}
Assume the writePending semaphore was omitted. What would happen?
Reader1
Writer1
Reader2
![Page 17: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/17.jpg)
17
Assume the writePending semaphore was omitted in the solution just given. What would happen?
This is supposed to give writers priority. However, consider the following sequence:
Reader 1 arrives, executes thro’ P(readBlock);
Reader 1 executes P(mutex1);
Writer 1 arrives, waits at P(readBlock);
Reader 2 arrives, waits at P(readBlock);
Reader 1 executes V(mutex1); then V(readBlock);
Reader 2 may now proceed…wrong
![Page 18: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/18.jpg)
18
Linux Reader/Writer Spinlocks• Class of reader/writer
problems• Multiple readers OK• Mutual exclusion for
writers• No upgrade from reader
lock to writer lock• Favors readers –
starvation of writers possible
rwlock_t
read_lock,read_unlockread_lock_irq // also unlock
read_lock_irqsave
read_unlock_irqrestore
write_lock,write_unlock//_irq,_irqsave,_irqrestore
write_trylock
rw_is_locked
![Page 19: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/19.jpg)
19
Linux Reader/Writer Semaphores
• All reader / writer semaphores are mutexes (usage count 1)
• Multiple readers, solo writer
• Uninterruptible sleep• Possible to
downgrade writer to reader
down_read
down_write
up_read
up_write
downgrade_writer
down_read_trylock
down_write_trylock
![Page 20: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/20.jpg)
20
Message-Passing
![Page 21: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/21.jpg)
21
Interprocess Communication - Messages
• Assume no explicit sharing of data elements in the address spaces of processes wishing to cooperate/communicate.
• Essence of message-passing is copying (although implementations may avoid actual copies whenever possible).
• Problem-solving with messages - has a feel of more active involvement by participants.
![Page 22: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/22.jpg)
22
Issues
• System calls for sending and receiving messages with the OS(s) acting as courier.– Variations on exact semantics of primitives and in the
definition of what comprises a message.
• Naming - direct (to/from pids), indirect (to distinct objects - e.g., mailboxes, ports, sockets)– How do unrelated processes “find” each other?
• Buffering - capacity and blocking semantics.• Guarantees - in-order delivery? no lost messages?
![Page 23: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/23.jpg)
23
Send and Receive
![Page 24: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/24.jpg)
24
UNIX Sockets for Client/ Server Message Passing
Server1. Create a named socket
syscalls:sfd = socket(…)bind (sfd, ptr,len)
2. Listen for clientslisten(sfd,numpend)
4. Connection made and continue listeningcfd=accept(sfd, …)
5. Exchange datawrite(cfd, …)
6. Done: close(cfd);7. Really done: close(sfd);
Client
3. Create unnamed socket & ask for connectionsyscalls:cfd=socket(…)err=connect(cfd, ptr, …)
5. Exchange data read(cfd, …)
6. Done: close(cfd);
name
name
In a child process of server
![Page 25: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/25.jpg)
25
5 DP – Direct Send/Receive Message Passing Between Philosophers
Philosopher 0(thinking)
Philosopher 1
Philosopher 2
Philosopher 3(eating)
Philosopher 4
Forkplease?
![Page 26: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/26.jpg)
26
Philosopher 0(thinking)
Philosopher 1
Philosopher 2
Philosopher 3(eating)
Philosopher 4
Umm. Oh yeah.
![Page 27: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/27.jpg)
27
Philosopher 0(thinking)
Philosopher 1
Philosopher 2
Philosopher 3(eating)
Philosopher 4
Forkplease?
![Page 28: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/28.jpg)
28
Philosopher 0(thinking)
Philosopher 1
Philosopher 2
Philosopher 3(eating)
Philosopher 4
Forkplease?
I’ll ignorethat requestuntil I’m done
![Page 29: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/29.jpg)
29
Philosopher 0(thinking)
Philosopher 1
Philosopher 2
Philosopher 3(eating)
Philosopher 4Forkplease?
Forkplease?
![Page 30: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/30.jpg)
30
Client / Server
server->
Start here
![Page 31: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/31.jpg)
31
Example: Time Service
![Page 32: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/32.jpg)
32
Example: Time Service via Messages
![Page 33: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/33.jpg)
33
Client / Server with Threads
![Page 34: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/34.jpg)
34
Hiding Message-Passing: RPC
![Page 35: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/35.jpg)
35
Remote Procedure Call - RPC
• Looks like a nice familiar procedure call
P0
result = foo(param);
P1
Receive
![Page 36: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/36.jpg)
36
Remote Procedure Call - RPC
• Looks like a nice familiar procedure call
P0
result = foo(param);please do foo for P0
with param
P1
Receive
blockedhere
![Page 37: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/37.jpg)
37
Remote Procedure Call - RPC
• Looks like a nice familiar procedure call
P0
result = foo(param);please do foo for P0
with param
P1
Receiver = foo(param);// actual callblocked
here
![Page 38: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/38.jpg)
38
Remote Procedure Call - RPC
• Looks like a nice familiar procedure call
P0
result = foo(param);
P1
Receiver = foo(param);// actual call
Replyreturningr to P0
blockedhere
![Page 39: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/39.jpg)
39
Remote Procedure Call - RPC
• Looks like a nice familiar procedure call
P0
result = foo(param);
P1
Receiver = foo(param);// actual call
Replyreturningr to P0
![Page 40: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/40.jpg)
40
Remote Procedure Call - RPC
• Looks like a nice familiar procedure call
P0
result = foo(param);
P1
Receiver = foo(param);// actual call
Reply
![Page 41: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/41.jpg)
41
5DP via RPC with Fork Manager
• Looks like a nice familiar procedure call
Philosopher0
result = PickupForks (0);
Fork Server
Receiver = proc(param);// explicit queuingwhen necessary
Reply
![Page 42: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/42.jpg)
42
Example: Time Service via RPC
![Page 43: 2-Dining Puppies Mutex Failure](https://reader036.fdocuments.in/reader036/viewer/2022062422/56813629550346895d9da132/html5/thumbnails/43.jpg)
44
RPC Issues