From 5d04f0c65bcb8c469aa04c61e8d86b59c594410f Mon Sep 17 00:00:00 2001 From: Perry Kivolowitz Date: Sun, 5 Mar 2023 10:14:12 -0600 Subject: [PATCH] tweaks to atomics text --- more/atomics/README.md | 28 ++++++++++++++++++---------- more/atomics/README.pdf | Bin 272024 -> 272480 bytes 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/more/atomics/README.md b/more/atomics/README.md index 6dcab11..e1021b2 100644 --- a/more/atomics/README.md +++ b/more/atomics/README.md @@ -189,9 +189,11 @@ addition, subtraction and various bitwise operations. These will be described below. For ARMv8 and for later ARM versions (to perform operations other than -those listed above), there is a general solution that isn't pretty. It -is an example of Load Linked / Store Conditional. It isn't pretty -because it involves a loop. +those listed above), there is a general solution: an is an example of +Load Linked / Store Conditional. It involves a loop but starvation is +unlikely because a rescheduled thread is unlikely to be descheduled +again within the same loop owing to the relatively long time alloted +to each freshly scheduled entity. ```asm .text // 1 @@ -217,8 +219,9 @@ The conditional assembly block from line 4 through line 10 declare the label `LoadLinkedStoreConditional` as global for both Linux and Apple assemblers. The label itself is also stated. -It is worth explaining that labels marked as global must have an -underscore prefix for Apple assembly. +Labels marked as global must have an underscore prefix for Apple +assembly. This code does not make use of the macro package we have +written for sake of brevity and clarity. This function is passed the address of an `int32_t`. @@ -232,8 +235,8 @@ Line 13 puts the potato on the fork. It is a store conditional which may or may not actually write anything to memory. To understand this instruction, [Kristien et -al](../../reference_material/USENIX2020.pdf) et al. provide this -amazingly helpful picture: +al](../../reference_material/USENIX2020.pdf) et al. provide this helpful +picture: ![llsc](./llsc.png) @@ -245,10 +248,10 @@ Imagine the following: | T1 | T2 | | -- | -- | | Executes line 11. Gets value *N*. Location is marked. | | -| T1 is descheduled. | | -| | Executes line 11. Gets value *N*. Location is marked again. | +| T1 is descheduled. The code to implement the context switch clears the watch.| | +| | Executes line 11. Gets value *N*. Location is marked. | | | `w1` goes up to *N + 1* on line 12. | -| | Line 13 succeeds in storing *N + 1* to memory and
the location marking is cleared | +| | Line 13 succeeds in storing *N + 1* to memory and the location marking is cleared | | | T2 is descheduled. | | T1 is scheduled - recall it has stale values. | | | Executes line 12 making *N + 1* which is now wrong. | | @@ -256,6 +259,11 @@ Imagine the following: | Loops around, this time picking up *N + 1* | | | Correctly makes *N + 2* | | +Switching contexts is but one of the ways in which any watches held by +the descheduled thread are cleared. This is OK and causes the thread to +loop when it is rescheduled. It is likely to succeed the next time +around. + ## Implementation of ARMv8.1A and Newer Implementations of operations on atomic variables were improved in the diff --git a/more/atomics/README.pdf b/more/atomics/README.pdf index a35882fa1d4dcd9f2b4ad1880e81dfef624af880..cbf75e10c7b6f7d43de95ae11fc97346adee7e13 100644 GIT binary patch delta 8074 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 L(9_GR%c1-ax36IS delta 7635 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