vault backup: 2025-03-10 08:44:43
This commit is contained in:
parent
8b41fce975
commit
4979a0eed2
2 changed files with 50 additions and 4 deletions
4
.obsidian/workspace.json
vendored
4
.obsidian/workspace.json
vendored
|
@ -49,9 +49,9 @@
|
||||||
"type": "pdf",
|
"type": "pdf",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Concurrent Systems/slides/class 3.pdf",
|
"file": "Concurrent Systems/slides/class 3.pdf",
|
||||||
"page": 1,
|
"page": 5,
|
||||||
"left": -9,
|
"left": -9,
|
||||||
"top": 169,
|
"top": 186,
|
||||||
"zoom": 0.6
|
"zoom": 0.6
|
||||||
},
|
},
|
||||||
"icon": "lucide-file-text",
|
"icon": "lucide-file-text",
|
||||||
|
|
|
@ -23,7 +23,7 @@ X.test&set() :=
|
||||||
(the function is implemented in an atomic way by the hardware by suspending the interruptions!)
|
(the function is implemented in an atomic way by the hardware by suspending the interruptions!)
|
||||||
```
|
```
|
||||||
|
|
||||||
###### How do we use it?
|
###### How do we use it for MUTEX?
|
||||||
```
|
```
|
||||||
lock() :=
|
lock() :=
|
||||||
wait X.test&set() = 0
|
wait X.test&set() = 0
|
||||||
|
@ -44,4 +44,50 @@ X.swap(v) :=
|
||||||
tmp <- X
|
tmp <- X
|
||||||
X <- v
|
X <- v
|
||||||
return tmp
|
return tmp
|
||||||
|
```
|
||||||
|
|
||||||
|
###### How do we use it for MUTEX?
|
||||||
|
```
|
||||||
|
lock() :=
|
||||||
|
wait X.swap(1) = 0
|
||||||
|
return
|
||||||
|
|
||||||
|
unlock() :=
|
||||||
|
X <- 0
|
||||||
|
return
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Compare&swap
|
||||||
|
```
|
||||||
|
X boolean register
|
||||||
|
|
||||||
|
X.compare&swap(old, new) :=
|
||||||
|
if X = old then
|
||||||
|
X <- new
|
||||||
|
return true
|
||||||
|
return false
|
||||||
|
```
|
||||||
|
###### How do we use it for MUTEX?
|
||||||
|
```
|
||||||
|
Initialize X at 0
|
||||||
|
|
||||||
|
lock() :=
|
||||||
|
wait X.compare&swap(0, 1) = true
|
||||||
|
return
|
||||||
|
|
||||||
|
unlock() :=
|
||||||
|
X <- 0
|
||||||
|
return
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Fetch&add
|
||||||
|
Up to now, all solutions enjoy deadlock freedom, but allow for starvation. So let's use Round Robin to promote the liveness property!
|
||||||
|
|
||||||
|
Let X be an integer register; the Fetch&add primitive is implemented as follows:
|
||||||
|
```
|
||||||
|
X.fetch&add(v) :=
|
||||||
|
tmp <- X
|
||||||
|
X <- X+v
|
||||||
|
return tmp
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in a new issue