diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 38384e3..611348c 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -34,9 +34,9 @@ "type": "pdf", "state": { "file": "Concurrent Systems/slides/class 4.pdf", - "page": 11, + "page": 12, "left": -27, - "top": 7, + "top": 16, "zoom": 0.5754156769596199 }, "icon": "lucide-file-text", diff --git a/Concurrent Systems/notes/4b -.md b/Concurrent Systems/notes/4b -.md index 0ab2d79..0909ae3 100644 --- a/Concurrent Systems/notes/4b -.md +++ b/Concurrent Systems/notes/4b -.md @@ -6,5 +6,24 @@ It guarantees mutual exclusion. Inter-process synchronization is done through *conditions*, which are objects that provide the following operations: - ***wait*:** the invoking process suspends, enters into the condition's queue, and releases the mutex on the monitor - ***signal*:** if no process is in the condition's queue, the nothing happens. Otherwise - - it reactivates the first suspended process, suspends the signaling process that however has a priority to re-enter the monitor (*Hoare semantics*) - - \ No newline at end of file + - reactivates the first suspended process, suspends the signaling process that however has a priority to re-enter the monitor (*Hoare semantics*) + - completes its task and the first process in the condition's queue has the priority to enter the monitor (after that the signaling one terminates or suspends) (*Mesa semantics*). + +#### A very typical use: Rendez-vous +A soon as a process arrives at a barrier it needs to suspend and wait for every other process to reach the barrier. + +``` +monitor RNDV := + cnt ∈ {0,…,m} init at 0 + condition B + operation barrier() := + cnt++ + if cnt < m then + B.wait() + else + cnt <- 0 + B.signal() + return +``` +The last process wakes up one of the others... Then he wakes up another one etc... +