UNIVERSITY OF WISCONSIN-MADISON
Computer Sciences Department | ||
CS 537
Spring 2001 | A. Arpaci-Dusseau | |
Quiz #5: March 21st -- Deadlock |
Name: | Student ID #: |
a. Mutual exclusion b. Hold and wait c. No preemption d. Circular wait _d_ Impose a total ordering (or ranking) on how resources are acquired _c_ When a process requests a resource that is already held, force the process holding the resource to release it _b_ Only allow a process to request a resource when the process has none _a_ Allow all processes to access the resource simultaneously _b_ Require each process to grab all desired resources at once
Can running each of the following code segments lead to deadlock of process 0 and process 1? Simply answer "yes" or "no".
Code Sample 1 Process 0: Process 1: lock1.acquire(); lock1.acquire(); lock2.acquire(); lock2.acquire(); lock1.release(); lock1.release(); lock2.release(); lock2.release();No deadlock possible, because there is no circularity of requests. Both processes grab the locks in the same order. |
Code Sample 2 Process 0: Process 1: lock1.acquire(); lock2.acquire(); lock2.acquire(); lock1.acquire(); lock1.release(); lock1.release(); lock2.release(); lock2.release();Deadlock is possible, because there is circularity. If process 0 acquires lock1 and then process 1 acquires lock2, both will be stuck holding one lock while waiting for the other. |
Code Sample 3 Process 0: Process 1: lock1.acquire(); lock2.acquire(); lock2.acquire(); lock2.release(); lock1.release(); lock1.acquire(); lock2.release(); lock1.release();No deadlock possible, because process 1 does not hold and wait. Even if process 0 acquires lock1 and process 1 acquires lock2, eventually process 1 will release lock2, at which point process 0 will be able to acquire lock 2. |
Running which of the above code samples could lead to the situation shown in the following resource-allocation graph? Indicate all of the possible code samples that apply.
Possible with Code Sample 1 given the following execution:
Process 0: Process 1: lock1.acquire(); lock2.acquire(); lock1.acquire(); // waits! |
Not possible with Code Sample 2; if Process 1 is waiting for lock1, it must hold lock2, which isn't shown in the figure.
Possible with Code Sample 3 given the following execution:
Process 0: Process 1: lock2.acquire(); lock2.release(); lock1.acquire(); lock2.acquire(); lock1.acquire(); // waits! |