2025-03-04 08:29:45 +01:00
Peterson's algorithm cost $O(n^2)$
A first way to reduce this cost is by using a tournament of MUTEX between pairs of processes:
![[Pasted image 20250304082459.png|350]]
Of course this is a binary tree, and the height of a binary tree is logaritmic to the number of leaves. A process then wins after $\lceil \log_{2}n \rceil$ competitions $\to O(\log n)$ cost.
But we can do better. Let's see an idea of a constant-time algorithm.
```
Initialize Y at ⊥, X at any value (e.g., 0)
lock(i) :=
x < - i
if Y != ⊥ then FAIL
else Y < - i
if X = i then return
2025-03-04 08:34:45 +01:00
else FAIL
2025-03-04 08:29:45 +01:00
unlock(i) :=
Y < - ⊥
2025-03-04 08:34:45 +01:00
return
```
Problems:
- we don't want the FAIL
2025-03-04 08:39:45 +01:00
- it is possible to have an execution where nobody accesses its CS, if repeated forever it entails a deadlock
```
Initialize Y at ⊥, X at any value (e.g., 0)
lock(i) :=
* FLAG[i] < - up
X < - i
if Y ≠ ⊥ then FLAG[i] < - down
wait Y = ⊥
goto *
else Y < - i
if X = i then return
else FLAG[i] < - down
∀j.wait FLAG[j] = down
if Y = i then return
2025-03-04 08:44:45 +01:00
else wait Y = ⊥
goto *
unlock(i) :=
Y < - ⊥
FLAG[i] < - down
return
```
2025-03-04 08:49:45 +01:00
MUTEX proof
How can pi enter its CS?
![[Pasted image 20250304084537.png]]
![[Pasted image 20250304084901.png]]
2025-03-04 08:59:45 +01:00
Deadlock freedom
Let $p_i$ invoke lock
- If it eventually wins -> √
- If it is blocked forever, where can it be blocked?
1. In the second wait Y = ⊥
- in this case, it read a value in Y different from i
- there is a $p_h$ that wrote Y after $p_i$
- let us consider the last of such $p_h \to$ it will eventually win
2. In the ∀j.wait FLAG[j] = down
- this wait cannot block a process forever
2025-03-04 09:04:45 +01:00
- if $pj$ doesn't lock, it flag is down
- if $pj$ doesn't find Y at ⊥, it puts its flag down
- if pj doesn't find X at j, it puts its flag down, otherwise pj enters its CS and eventually unlocks (flag down)
- 3. In the first wait Y = ⊥
- since pj read a value different from ⊥, there is at least one pk that wrote Y before (but has not yet unlocked)
- if $p_k$ eventually enters its CS -> ok, otherwise it must be blocked forever as well. Where?
- ![[Pasted image 20250304090207.png]]
![[Pasted image 20250304090219.png]]
esercizio: prova che NON soddisfa starvation freedom
#### From deadlock freedom to bounded bypass
2025-03-04 09:09:45 +01:00
-> Round Robin algorithm
2025-03-04 09:14:45 +01:00
Let DLF be any deadlock free protocol for MUTEX. Let's see how we can make it satisfy bounded bypass:
2025-03-04 09:09:45 +01:00
```
lock(i) :=
FLAG[i] < - up
wait (TURN = i OR FLAG[TURN] = down)
DLF.lock(i)
return
unlock(i) :=
FLAG[i] < - down
2025-03-04 09:14:45 +01:00
if FLAG[TURN] = down then
TURN < - ( TURN + 1 ) mod n
DLF.unlock(i)
return
2025-03-04 09:09:45 +01:00
```
2025-03-04 09:19:45 +01:00
###### Is it deadlock free?
Since DLF is deadlock free, it is sufficient to prove that at least one process invokes DLF.lock.
If TURN = k and $p_k$ invoked lock, then it finds TURN = k and exits its wait.
2025-03-04 09:24:45 +01:00
Otherwise, any other process will find `FLAG[TURN] = down` and exits from its wait.
**Lemma 1:** if TURN = i and `FLAG[i] = up` then $p_i$ enters the CS in at most n-1 iterations
Observation 1: TURN changes only when FLAG[i] is down (after pi has completed its CS)
Observation 2: FLAG[i] = up -> either pi is in its CS or pi is competing for its CS -> it eventually invokes (if not already) DLF.lock
Observation 3: if $p_j$ invokes lock after that FLAG[i] is set, $p_j$ blocks in its wait
2025-03-04 09:29:45 +01:00
Let Y be the set of processes competing for the CS (suspended on the DLF.lock)
2025-03-04 09:24:45 +01:00
- because of Observation 2, $i \in Y$
2025-03-04 09:29:45 +01:00
- because of Observation 3, once FLAG[i] is set, Y cannot grow anymore
- because DLF is deadlock free, eventually one $p_{y} \in Y$ wins if $y = i$.
- if $y = i$ we are done
- otherwise, Y shrinks by one. And because of Observation 1, TURN and FLAG[TURN] don't change, so $p_y$ cannot enter Y again.
- Iterating this reasoning we can see that $p_i$ will eventually win, and the worst case is when is the last winner.
2025-03-04 09:34:45 +01:00
**Lemma 2:** If FLAG[i] = up, then TURN is set to i in at most $(n-1)^2$ iterations.
If TURN=i when FLAG[i] is set, done
By Deadlock freedom of RR, at least one process eventually unlocks
- If FLAG[TURN] = down, then TURN is increased. Otherwise, by Lemam 1, $p_{TURN}$ wins in at most n-1 iterations and increases TURN.
- If now TURN = i then we are done. Otherwise, we repeat this reasoning.
The worst case is when TURN = *i+1* mod n when FLAG[i] is set.
![[Pasted image 20250304093223.png]]