vault backup: 2025-03-12 10:44:27
This commit is contained in:
parent
fb56bcc453
commit
6547be1a32
2 changed files with 33 additions and 7 deletions
10
.obsidian/workspace.json
vendored
10
.obsidian/workspace.json
vendored
|
@ -34,9 +34,9 @@
|
||||||
"type": "pdf",
|
"type": "pdf",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Concurrent Systems/slides/class 4.pdf",
|
"file": "Concurrent Systems/slides/class 4.pdf",
|
||||||
"page": 2,
|
"page": 3,
|
||||||
"left": -23,
|
"left": -23,
|
||||||
"top": 165,
|
"top": 298,
|
||||||
"zoom": 0.652019002375297
|
"zoom": 0.652019002375297
|
||||||
},
|
},
|
||||||
"icon": "lucide-file-text",
|
"icon": "lucide-file-text",
|
||||||
|
@ -217,16 +217,16 @@
|
||||||
},
|
},
|
||||||
"active": "6edd4157a160e462",
|
"active": "6edd4157a160e462",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"Concurrent Systems/slides/class 4.pdf",
|
"Concurrent Systems/notes/3a - Hardware primitives & Lamport Bakery algorithm.md",
|
||||||
"Concurrent Systems/notes/4 - Semaphores.md",
|
|
||||||
"Concurrent Systems/notes/3b - Aravind's algorithm and improvements.md",
|
"Concurrent Systems/notes/3b - Aravind's algorithm and improvements.md",
|
||||||
|
"Concurrent Systems/notes/4 - Semaphores.md",
|
||||||
|
"Concurrent Systems/slides/class 4.pdf",
|
||||||
"Concurrent Systems/notes/images/Pasted image 20250310172134.png",
|
"Concurrent Systems/notes/images/Pasted image 20250310172134.png",
|
||||||
"Concurrent Systems/notes/1b - Peterson algorithm.md",
|
"Concurrent Systems/notes/1b - Peterson algorithm.md",
|
||||||
"Concurrent Systems/slides/class 3.pdf",
|
"Concurrent Systems/slides/class 3.pdf",
|
||||||
"Concurrent Systems/notes/images/Pasted image 20250310103703.png",
|
"Concurrent Systems/notes/images/Pasted image 20250310103703.png",
|
||||||
"Concurrent Systems/notes/2 - Fast mutex by Lamport.md",
|
"Concurrent Systems/notes/2 - Fast mutex by Lamport.md",
|
||||||
"Concurrent Systems/notes/1 - CS Basics.md",
|
"Concurrent Systems/notes/1 - CS Basics.md",
|
||||||
"Concurrent Systems/notes/3a - Hardware primitives & Lamport Bakery algorithm.md",
|
|
||||||
"Concurrent Systems/notes/2b - Round Robin algorithm.md",
|
"Concurrent Systems/notes/2b - Round Robin algorithm.md",
|
||||||
"Concurrent Systems/notes/1 - CS Basics2.md",
|
"Concurrent Systems/notes/1 - CS Basics2.md",
|
||||||
"HCIW/slides/Interface and Interaction for IoT.pdf",
|
"HCIW/slides/Interface and Interaction for IoT.pdf",
|
||||||
|
|
|
@ -13,7 +13,7 @@ Main use: **prevent busy waiting**: suspend processes that cannot perform *down*
|
||||||
**Binary semaphore:** if it is at most 1 (also *up* are blocking).
|
**Binary semaphore:** if it is at most 1 (also *up* are blocking).
|
||||||
|
|
||||||
A semaphore needs two underlying objects:
|
A semaphore needs two underlying objects:
|
||||||
- a counter initialized at s0 that can also become negative
|
- a counter initialized at s0 that can also become negative (see the implementation below to understand)
|
||||||
- a data structure (typically a queue), initially empty, to store suspended processes.
|
- a data structure (typically a queue), initially empty, to store suspended processes.
|
||||||
|
|
||||||
#### Ideal implementation
|
#### Ideal implementation
|
||||||
|
@ -30,3 +30,29 @@ S.up() :=
|
||||||
if S.counter <= 0 then
|
if S.counter <= 0 then
|
||||||
activate a proc from S.queue
|
activate a proc from S.queue
|
||||||
return
|
return
|
||||||
|
```
|
||||||
|
>[!note] note
|
||||||
|
>if S.counter ≥ 0, then this is the value of the semaphore; otherwise, S.counter tells you how many processes are suspended in S
|
||||||
|
>
|
||||||
|
>all operations are in MUTEX
|
||||||
|
|
||||||
|
|
||||||
|
#### Actual implementation
|
||||||
|
```
|
||||||
|
Let t be a test&set register initialized at 0
|
||||||
|
|
||||||
|
S.down() :=
|
||||||
|
Disable interrupts
|
||||||
|
wait S.t.test&set() = 0
|
||||||
|
S.counter--
|
||||||
|
if S.counter < 0 then
|
||||||
|
enter into S.queue
|
||||||
|
S.t <- 0
|
||||||
|
SUSPEND
|
||||||
|
return
|
||||||
|
|
||||||
|
S.up() :=
|
||||||
|
S.counter++
|
||||||
|
if S.counter <= 0 then
|
||||||
|
activate a proc from S.queue
|
||||||
|
return
|
||||||
|
|
Loading…
Reference in a new issue