deadlocks

85
Deadlocks Andy Wang Operating Systems COP 4610 / CGS 5765

Upload: carla-faulkner

Post on 31-Dec-2015

36 views

Category:

Documents


0 download

DESCRIPTION

Deadlocks. Andy Wang Operating Systems COP 4610 / CGS 5765. Example 1. Example 2. Soap operas…. Deadlocks. Deadlocks : Occur when threads are waiting for resources with circular dependencies - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Deadlocks

Deadlocks

Andy WangOperating SystemsCOP 4610 / CGS 5765

Page 2: Deadlocks

Example 1

Page 3: Deadlocks

Example 2

Soap operas…

Page 4: Deadlocks

Deadlocks

Deadlocks: Occur when threads are waiting for resources with circular dependencies Often involve nonpreemptable

resources, which cannot be taken away from its current thread without failing the computation (e.g., storage allocated to a file)

Page 5: Deadlocks

Deadlocks

Deadlocks that involve preemptable resources (e.g., CPU) can usually be resolved by reallocation of resources

Starvation: a thread waits indefinitely

A deadlock implies starvation

Page 6: Deadlocks

An Example of Deadlocks

Thread A Thread B

P(x); P(y);P(y); P(x);

A deadlock won’t always happen with this code, but it might

Page 7: Deadlocks

Deadlocks, Deadlocks, Everywhere…

Can happen with any kind of resource Among multiple resources

Cannot be resolved for each resource independently A thread can grab all the memory The other grabs all the disk space Each thread may need to wait for the

other to release

Page 8: Deadlocks

Deadlocks, Deadlocks, Everywhere…

Round-Robin CPU scheduling cannot prevent deadlocks (or starvation) from happening

Can occur whenever there is waiting…

Page 9: Deadlocks

A Classic Example of Deadlocks

Dining lawyers (philosophers) Each needs two chopsticks to eat

Page 10: Deadlocks

Dining Lawyers

If each first grabs the chopstick on their right before the one on their left, and all grab at the same time, we have a deadlock

(Personally, I prefer to starve than share chopsticks…)

Page 11: Deadlocks

Dining Lawyers

If each first grabs the chopstick on their right…

Page 12: Deadlocks

If each first grabs the chopstick on their right…

Dining Lawyers

Page 13: Deadlocks

If each first grabs the chopstick on their right…

Dining Lawyers

Page 14: Deadlocks

A Dining Lawyer Implementation

semaphore chopstick[5] = {1, 1, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[j]);P(chopstick[(j + 1) % 5];// eatV(chopstick[(j + 1) % 5];V(chopstick[j]);

}}

Page 15: Deadlocks

A Dining Lawyer Implementation

// chopstick[5] = {0, 0, 0, 0, 0};

lawyer(int j) {while (TRUE) {

P(chopstick[j]);P(chopstick[(j + 1) % 5];// eatV(chopstick[(j + 1) % 5];V(chopstick[j]);

}}

Page 16: Deadlocks

A Dining Lawyer Implementation

// chopstick[5] = {0, 0, 0, 0, 0};

lawyer(int j) {while (TRUE) {

P(chopstick[j]);P(chopstick[(j + 1) % 5];// eatV(chopstick[(j + 1) % 5];V(chopstick[j]);

}}

Page 17: Deadlocks

Conditions for Deadlocks

Four necessary (but not sufficient) conditions Limited access (lock-protected

resources) No preemption (if someone has the

resource, it cannot be taken away) Wait while holding (holding a resource

while requesting and waiting for the next resource)

Circular chain of requests

Page 18: Deadlocks

Conditions for Deadlocks

Four necessary (but not sufficient) conditions Limited access (lock-protected

resources) No preemption (if someone has the

resource, it cannot be taken away) Wait while holding (holding a resource

while requesting and waiting for the next resource)

Circular chain of requests

Page 19: Deadlocks

Conditions for Deadlocks

Four necessary (but not sufficient) conditions Limited access (lock-protected

resources) No preemption (if someone has the

resource, it cannot be taken away) Wait while holding (holding a resource

while requesting and waiting for the next resource)

Circular chain of requests

Page 20: Deadlocks

Deadlock Prevention Techniques

Involves removing one of the four conditions

Page 21: Deadlocks

Deadlock Prevention Techniques

1. Infinite resources (buy a very large disk)

Page 22: Deadlocks

Deadlock Prevention Techniques

2. No sharing (independent threads)

Page 23: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)

easier said than done…

Page 24: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)semaphore chopstick[5] = {1, 1, 1, 1, 1}, s = 1;lawyer(int j) {

while (TRUE) {P(s);

P(chopstick[j]);P(chopstick[(j + 1) % 5];// eatV(chopstick[(j + 1) % 5];V(chopstick[j]);

V(s);}

}

Page 25: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)semaphore chopstick[5] = {1, 1 0, 1 0, 1, 1}, s = 1 0;lawyer(int j) {

while (TRUE) {P(s);

P(chopstick[j]);P(chopstick[(j + 1) % 5];// eatV(chopstick[(j + 1) % 5];V(chopstick[j]);

V(s);}

}

1

Page 26: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)// chopstick[5] = {1, 0, 0, 1, 1}, s = 0;lawyer(int j) {

while (TRUE) {P(s);

P(chopstick[j]);P(chopstick[(j + 1) % 5];// eatV(chopstick[(j + 1) % 5];V(chopstick[j]);

V(s);}

}

1

3

Page 27: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)// chopstick[5] = {1, 1, 1, 1, 1}, s = 1;lawyer(int j) {

while (TRUE) {P(s);

P(chopstick[j]);P(chopstick[(j + 1) % 5];

V(s);// eat

P(s);V(chopstick[(j + 1) % 5];V(chopstick[j]);

V(s);}

}

Page 28: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)// chopstick[5] = {1, 1 0, 1 0, 1, 1}, s = 1 0 1;lawyer(int j) {

while (TRUE) {P(s);

P(chopstick[j]);P(chopstick[(j + 1) % 5];

V(s);// eat

P(s);V(chopstick[(j + 1) % 5];V(chopstick[j]);

V(s);}

}

1

Page 29: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)// chopstick[5] = {1, 0, 0, 1 0, 1 0}, s = 1 0 1;lawyer(int j) {

while (TRUE) {P(s);

P(chopstick[j]);P(chopstick[(j + 1) % 5];

V(s);// eat

P(s);V(chopstick[(j + 1) % 5];V(chopstick[j]);

V(s);}

}

1 3

Page 30: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)// chopstick[5] = {1, 0, 0, 0, 0}, s = 1 0;lawyer(int j) {

while (TRUE) {P(s);

P(chopstick[j]); // deadlockP(chopstick[(j + 1) % 5];

V(s);// eat

P(s);V(chopstick[(j + 1) % 5];V(chopstick[j]);

V(s);}

}

1 3

2

Page 31: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)// chopstick[5] = {1, 0, 0, 0, 0}, s = 0;lawyer(int j) {

while (TRUE) {P(s);

P(chopstick[j]);P(chopstick[(j + 1) % 5];

V(s);// eat

P(s);V(chopstick[(j + 1) % 5];V(chopstick[j]);

V(s);}

}

1 3

2

Page 32: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)

int counter[5] = {1, 1, 1, 1, 1}; semaphore chopstick[5] = {1, 1, 1, 1, 1}, s = 1;lawyer(int j) {

while (TRUE) {P(s);// if both counters j and (j + 1) % 5 > 0, decrement counters// and grab chopstick[j] and chopstick[(j + 1) % 5]V(s);// if holding both chopsticks, eatP(s);// release chopsticks and increment counters as neededV(s);

}}

Page 33: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)

// counter[5] = {1, 0, 0, 1, 1}; chopstick[5] = {1, 0, 0, 1, 1}, s = 1;lawyer(int j) {

while (TRUE) {P(s);// if both counters j and (j + 1) % 5 > 0, decrement counters// and grab chopstick[j] and chopstick[(j + 1) % 5]V(s);// if holding both chopsticks, eatP(s);// release chopsticks and increment counters as neededV(s);

}}

(1, 2)

1

Page 34: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)

// counter[5] = {1, 0, 0, 1, 1}; chopstick[5] = {1, 0, 0, 1, 1}, s = 1;lawyer(int j) {

while (TRUE) {P(s);// if both counters j and (j + 1) % 5 > 0, decrement counters// and grab chopstick[j] and chopstick[(j + 1) % 5]V(s);// if holding both chopsticks, eatP(s);// release chopsticks and increment counters as neededV(s);

}}

(1, 2)

1

()

2

Page 35: Deadlocks

Deadlock Prevention Techniques

3. Allocate all resources at the beginning (if you need 2 chopsticks, grab both at the same time)

// counter[5] = {1, 0, 0, 0, 0}; chopstick[5] = {1, 0, 0, 0, 0}, s = 1;lawyer(int j) {

while (TRUE) {P(s);// if both counters j and (j + 1) % 5 > 0, decrement counters// and grab chopstick[j] and chopstick[(j + 1) % 5]V(s);// if holding both chopsticks, eatP(s);// release chopsticks and increment counters as neededV(s);

}}

(1, 2)

1

(3, 4)

3

Page 36: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {1, 1, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

Page 37: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {1 0, 1, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0

Page 38: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 1 0, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1

Page 39: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 1 0, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1 2

Page 40: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 1 0, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1 2 3

Page 41: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1 2 3 4

--..

Page 42: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

01 2 3 4

Page 43: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 12 3 4

Page 44: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1 23 4

Page 45: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0, 1 0};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1 2 34

yes!

Page 46: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0, 0};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1 23

4

Page 47: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0, 0 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1 2

3

4

Page 48: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1 2

3

4

Page 49: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 1 0, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1 2

3

4

gross

Page 50: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1

2

4

3

Page 51: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 0 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1

2

4

3

Page 52: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1

2

4

3

Page 53: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 1 0, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0 1

2

4

3

z…

Page 54: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0

1

4

32

Page 55: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 0 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0

1

4

32

Page 56: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0 1, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0

1

4

32

Page 57: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 1 0, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0

1

4

32

Page 58: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0

4

321

Page 59: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 0 1, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0

4

321

Page 60: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0 1, 1, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

0

4

321

Page 61: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {1 0, 1, 1, 1, 1};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

4

3210

Page 62: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 1, 1, 1, 1 0};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

4

3210

Page 63: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 1, 1, 1, 1 0};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

4

3210

Page 64: Deadlocks

Deadlock Prevention Techniques

4. Make everyone use the same ordering in accessing resource (All threads must call P(x) before P(y)

// chopstick[5] = {0, 1, 1, 1, 1 0};

lawyer(int j) {while (TRUE) {

P(chopstick[min(j, (j + 1) % 5)]);P(chopstick[max(j, (j + 1) % 5)]);// eatV(chopstick[max(j, (j + 1) % 5)]);V(chopstick[min(j, (j + 1) % 5)]);

}}

4

3210

Page 65: Deadlocks

More Deadlock Prevention Methods

5. No waiting (phone company)6. Preempt resources (copying

memory content to disk)7. Banker’s algorithm8. A combination of techniques

Page 66: Deadlocks

Banker’s Algorithm

The idea of Banker’s algorithm: Allows the sum of requested resources

> total resources As long as, there is some way for all

threads to finish without getting into any deadlocks

Page 67: Deadlocks

Banker’s Algorithm

Banker’s algorithm: A thread states its maximum resource

needs in advance The OS allocates resource dynamically

as needed. A thread waits if granting its request would lead to deadlocks

A request can be granted if some sequential ordering of threads is deadlock free

Page 68: Deadlocks

Example 1

Total RAM 256 MB

Allocated Still needed

P1 80 MB 30 MB

P2 10 MB 10 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

Page 69: Deadlocks

Example 1

Total RAM 256 MB

Allocated Still needed

P1 80 MB 30 MB

P2 20 MB 0 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

P2

36

Page 70: Deadlocks

Example 1

Total RAM 256 MB

Allocated Still needed

P1 80 MB 30 MB

P2 0 MB 0 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

P2

3656

Page 71: Deadlocks

Example 1

Total RAM 256 MB

Allocated Still needed

P1 110 MB 0 MB

P2 0 MB 0 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

P2

3656

P1

26

Page 72: Deadlocks

Example 1

Total RAM 256 MB

Allocated Still needed

P1 0 MB 0 MB

P2 0 MB 0 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

P2

3656

P1

26

136

Page 73: Deadlocks

Example 1

Total RAM 256 MB

Allocated Still needed

P1 0 MB 0 MB

P2 0 MB 0 MB

P3 200 MB 0 MB

time

free RAM(MB)

46

P2

3656

P1

26

136

P3

56

Page 74: Deadlocks

Example 1

Total RAM 256 MB

Allocated Still needed

P1 0 MB 0 MB

P2 0 MB 0 MB

P3 0 MB 0 MB

time

free RAM(MB)

46

P2

3656

P1

26

136

P3

56

256

Page 75: Deadlocks

Example 1

Total RAM 256 MB

Allocated Still needed

P1 80 MB 30 MB

P2 10 MB 10 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

P2

3656

P1

26

136

P3

56

256

The system is initially in a safe state, since we can run P2, P1, and then P3

Page 76: Deadlocks

Example 2

Total RAM 256 MB

Allocated Still needed

P1 80 MB 60 MB

P2 10 MB 10 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

Page 77: Deadlocks

Example 2

Total RAM 256 MB

Allocated Still needed

P1 80 MB 60 MB

P2 20 MB 0 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

P2

36

Page 78: Deadlocks

Example 2

Total RAM 256 MB

Allocated Still needed

P1 80 MB 60 MB

P2 0 MB 0 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

P2

3656

Page 79: Deadlocks

Example 2

Total RAM 256 MB

Allocated Still needed

P1 80 MB 60 MB

P2 0 MB 0 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

P2

3656

Page 80: Deadlocks

Example 2

Total RAM 256 MB

Allocated Still needed

P1 80 MB 60 MB

P2 10 MB 10 MB

P3 120 MB 80 MB

time

free RAM(MB)

46

P2

3656

The system is initially in an unsafe state, since we cannot find an execution sequence for P1, P2, and P3

Page 81: Deadlocks

Deadlock Detection and Recovery

Scan the resource allocation graph Detect circular chains of requests Recover from the deadlock

Page 82: Deadlocks

Resource Allocation Graph

Resource X Resource Y

waiting for

waiting for

Thread Aowned by

Thread Bowned by

Page 83: Deadlocks

Once A Cycle is Detected…

Some possible actions Kill a thread and force it to give up

resources Remaining system may be in an

inconsistent state Rollback actions of a deadlocked thread

Not always possible (a file maybe half-way through modifications)

Need checkpointing, or taking snapshots of system states from time to time

Page 84: Deadlocks

Deadlock Resolution Techniques

Page 85: Deadlocks

When it comes to deadlocks…

May the Force be with you…