aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJohannes Stoelp <johannes.stoelp@gmail.com>2024-04-28 18:31:51 +0200
committerJohannes Stoelp <johannes.stoelp@gmail.com>2024-04-28 18:31:51 +0200
commit81779e3dd91e147c883974588a3be0410f225d42 (patch)
tree75b75cb5eab276bf801a4a5021ca88b2c34c33b2
parent801e1f4793faa64b8de4c2b92a9c5dbcd818b969 (diff)
downloadblog-81779e3dd91e147c883974588a3be0410f225d42.tar.gz
blog-81779e3dd91e147c883974588a3be0410f225d42.zip
xpost: add figure to match threads
-rw-r--r--content/2023-01-14-xpost-matcha-threads/gen-svg.sh3
-rw-r--r--content/2023-01-14-xpost-matcha-threads/index.md (renamed from content/2023-01-14-xpost-matcha-threads.md)18
-rw-r--r--content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.drawio185
-rw-r--r--content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.svg3
4 files changed, 209 insertions, 0 deletions
diff --git a/content/2023-01-14-xpost-matcha-threads/gen-svg.sh b/content/2023-01-14-xpost-matcha-threads/gen-svg.sh
new file mode 100644
index 0000000..365e243
--- /dev/null
+++ b/content/2023-01-14-xpost-matcha-threads/gen-svg.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+drawio -x -f svg -t --svg-theme dark -o os-vs-user-threads.svg os-vs-user-threads.drawio
diff --git a/content/2023-01-14-xpost-matcha-threads.md b/content/2023-01-14-xpost-matcha-threads/index.md
index 9500300..3456b09 100644
--- a/content/2023-01-14-xpost-matcha-threads.md
+++ b/content/2023-01-14-xpost-matcha-threads/index.md
@@ -66,6 +66,24 @@ Implementations for different ISAs are available here:
- [armv7a][yield-arm]
- [riscv64][yield-rv64]
+## Appendix: os-level vs user-level threading
+
+The figure below depicts *os-level* threading (left) vs *user-level* threading
+(right).
+
+The main difference is that in the case of user-level threading, the operating
+system (os) does not now anything about the user threads. In the concrete
+example, only a **single** user thread can run at any given time, whereas in
+the case of os-level threading, all threads can run truly parallel.
+
+When a user-level thread is scheduled, the *stack-pointer* (sp) of the os
+thread is adjusted to the user threads' stack. For the example below, if the
+user thread **A** is scheduled (yielded to), the stack-pointer for the os
+thread **S** is switched to the **stack A**. Once the user thread yields back
+to the scheduler, the stack-pointer is switched back to **stack S**.
+
+<img src="os-vs-user-threads.svg">
+
[matcha]: https://github.com/johannst/matcha-threads
[yield-x86]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/x86_64/yield.s
[yield-arm]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/arm/yield.s
diff --git a/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.drawio b/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.drawio
new file mode 100644
index 0000000..1eacde1
--- /dev/null
+++ b/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.drawio
@@ -0,0 +1,185 @@
+<mxfile host="Electron" modified="2024-04-28T16:20:12.227Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="2RwH5VfZZgyXLsWH8aob" version="23.1.5" type="device">
+ <diagram name="Page-1" id="eupsqoG42ICuPfNcTmHv">
+ <mxGraphModel dx="1024" dy="615" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="6WErTb2tg34p5fqduLaV-2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="360" y="290" width="120" height="260" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-3" value="&lt;font&gt;process address space&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="360" y="250" width="120" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-7" value="stack A" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#50fa7b;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="360" y="320" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-8" value="stack B" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#55FFFF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="360" y="400" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-9" value="stack C" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#FF55FF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="360" y="480" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-17" value="" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="290" width="120" height="260" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-18" value="&lt;font&gt;process address space&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="820" y="250" width="120" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-20" value="stack S" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#ffffff;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="500" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-21" value="stack A" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#50FA7B;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="320" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-22" value="stack C" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#FF55FF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="440" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-23" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;user thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=bottom;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="560" y="410" width="60" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-28" value="stack B" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#55FFFF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="380" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-29" value="&lt;font&gt;thread&lt;br&gt;S&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#ffffff;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="500" width="220" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-30" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;OS thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="560" y="540" width="50" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-31" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;user thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=bottom;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="640" y="410" width="60" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-32" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;user thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=bottom;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="720" y="410" width="60" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-38" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" target="6WErTb2tg34p5fqduLaV-19" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="570" y="500" as="sourcePoint" />
+ <mxPoint x="570" y="470" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-39" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="609.9985074626868" y="460" as="sourcePoint" />
+ <mxPoint x="609.9985074626868" y="500" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-41" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;yield&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="575" y="470" width="30" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-42" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="649.89" y="500" as="sourcePoint" />
+ <mxPoint x="649.89" y="460" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-43" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="689.8885074626868" y="460" as="sourcePoint" />
+ <mxPoint x="689.8885074626868" y="500" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-44" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;yield&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="654.89" y="470" width="30" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-45" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="729.89" y="500" as="sourcePoint" />
+ <mxPoint x="729.89" y="460" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-46" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="769.8885074626868" y="460" as="sourcePoint" />
+ <mxPoint x="769.8885074626868" y="500" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-47" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;yield&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="734.89" y="470" width="30" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-19" value="&lt;font&gt;thread&lt;br&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#50fa7b;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="420" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-24" value="&lt;font&gt;thread&lt;br&gt;B&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#55FFFF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="640" y="420" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-26" value="&lt;font&gt;thread&lt;br&gt;C&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#FF55FF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="720" y="420" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-51" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="6WErTb2tg34p5fqduLaV-5" target="6WErTb2tg34p5fqduLaV-7" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="659.9985074626868" y="370" as="sourcePoint" />
+ <mxPoint x="659.9985074626868" y="410" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-52" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="320" y="420" as="sourcePoint" />
+ <mxPoint x="360" y="420" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-53" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="320" y="500" as="sourcePoint" />
+ <mxPoint x="360" y="500" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-5" value="&lt;font&gt;thread&lt;br&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#50fa7b;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="260" y="320" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-10" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;OS thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="260" y="360" width="50" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-11" value="&lt;font&gt;thread&lt;br&gt;B&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#55FFFF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="260" y="400" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-12" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;OS thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="260" y="440" width="50" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-13" value="&lt;font&gt;thread&lt;br&gt;C&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#FF55FF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="260" y="480" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-14" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;OS thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="260" y="520" width="50" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-54" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="320" y="340" width="20" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-55" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="320" y="420" width="20" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-56" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="320" y="500" width="20" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-59" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="780" y="520" width="20" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-60" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;fillColor=#76608a;strokeColor=#B3B3B3;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="520" y="560" as="sourcePoint" />
+ <mxPoint x="520" y="240" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="iekysqo_5NKT5N1MqhNL-1" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=0;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;dashed=1;strokeColor=#50FA7B;" edge="1" parent="1" source="6WErTb2tg34p5fqduLaV-59" target="6WErTb2tg34p5fqduLaV-21">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="790" y="530" as="sourcePoint" />
+ <mxPoint x="830" y="530" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="800" y="520" />
+ <mxPoint x="800" y="340" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="iekysqo_5NKT5N1MqhNL-2" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp when yielding to A&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;horizontal=0;" vertex="1" parent="1">
+ <mxGeometry x="800" y="390" width="10" height="120" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-58" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="780" y="520" as="sourcePoint" />
+ <mxPoint x="820" y="520" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.svg b/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.svg
new file mode 100644
index 0000000..38103d0
--- /dev/null
+++ b/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="681px" height="323px" viewBox="-0.5 -0.5 681 323"><defs/><g><rect x="100" y="51" width="120" height="260" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="100" y="11" width="120" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 26px; margin-left: 101px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>process address space</font></div></div></div></foreignObject><text x="160" y="30" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">process address space</text></switch></g><rect x="100" y="81" width="120" height="40" fill="none" stroke="#50fa7b" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 101px; margin-left: 101px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack A</div></div></div></foreignObject><text x="160" y="105" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack A</text></switch></g><rect x="100" y="161" width="120" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 181px; margin-left: 101px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack B</div></div></div></foreignObject><text x="160" y="185" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack B</text></switch></g><rect x="100" y="241" width="120" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 261px; margin-left: 101px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack C</div></div></div></foreignObject><text x="160" y="265" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack C</text></switch></g><rect x="560" y="51" width="120" height="260" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="560" y="11" width="120" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 26px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>process address space</font></div></div></div></foreignObject><text x="620" y="30" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">process address space</text></switch></g><rect x="560" y="261" width="120" height="40" fill="none" stroke="#ffffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 281px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack S</div></div></div></foreignObject><text x="620" y="285" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack S</text></switch></g><rect x="560" y="81" width="120" height="40" fill="none" stroke="#50fa7b" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 101px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack A</div></div></div></foreignObject><text x="620" y="105" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack A</text></switch></g><rect x="560" y="201" width="120" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 221px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack C</div></div></div></foreignObject><text x="620" y="225" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack C</text></switch></g><rect x="300" y="171" width="60" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 178px; margin-left: 302px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">user thread</i></font></div></div></div></foreignObject><text x="302" y="178" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">user thread</text></switch></g><rect x="560" y="141" width="120" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 161px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack B</div></div></div></foreignObject><text x="620" y="165" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack B</text></switch></g><rect x="300" y="261" width="220" height="40" fill="none" stroke="#ffffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 281px; margin-left: 301px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />S<br /></font></div></div></div></foreignObject><text x="410" y="285" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="300" y="301" width="50" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 306px; margin-left: 302px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">OS thread</i></font></div></div></div></foreignObject><text x="302" y="310" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">OS thread</text></switch></g><rect x="380" y="171" width="60" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 178px; margin-left: 382px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">user thread</i></font></div></div></div></foreignObject><text x="382" y="178" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">user thread</text></switch></g><rect x="460" y="171" width="60" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 178px; margin-left: 462px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">user thread</i></font></div></div></div></foreignObject><text x="462" y="178" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">user thread</text></switch></g><path d="M 310 261 L 310.02 229.12" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 310.02 222.12 L 312.35 229.12 L 307.68 229.12 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 350 221 L 350 252.88" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 350 259.88 L 347.67 252.88 L 352.33 252.88 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="315" y="231" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 241px; margin-left: 316px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">yield</i></font></div></div></div></foreignObject><text x="330" y="245" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">yield</text></switch></g><path d="M 389.89 261 L 389.89 229.12" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 389.89 222.12 L 392.22 229.12 L 387.56 229.12 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 429.89 221 L 429.89 252.88" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 429.89 259.88 L 427.56 252.88 L 432.22 252.88 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="394.89" y="231" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 241px; margin-left: 396px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">yield</i></font></div></div></div></foreignObject><text x="410" y="245" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">yield</text></switch></g><path d="M 469.89 261 L 469.89 229.12" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 469.89 222.12 L 472.22 229.12 L 467.56 229.12 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 509.89 221 L 509.89 252.88" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 509.89 259.88 L 507.56 252.88 L 512.22 252.88 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="474.89" y="231" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 241px; margin-left: 476px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">yield</i></font></div></div></div></foreignObject><text x="490" y="245" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">yield</text></switch></g><rect x="300" y="181" width="60" height="40" fill="none" stroke="#50fa7b" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 201px; margin-left: 301px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />A</font></div></div></div></foreignObject><text x="330" y="205" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="380" y="181" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 201px; margin-left: 381px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />B<br /></font></div></div></div></foreignObject><text x="410" y="205" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="460" y="181" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 201px; margin-left: 461px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />C<br /></font></div></div></div></foreignObject><text x="490" y="205" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><path d="M 60 101 L 91.88 101" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 98.88 101 L 91.88 103.33 L 91.88 98.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 60 181 L 91.88 181" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 98.88 181 L 91.88 183.33 L 91.88 178.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 60 261 L 91.88 261" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 98.88 261 L 91.88 263.33 L 91.88 258.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="81" width="60" height="40" fill="none" stroke="#50fa7b" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 101px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />A</font></div></div></div></foreignObject><text x="30" y="105" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="0" y="121" width="50" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 126px; margin-left: 2px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">OS thread</i></font></div></div></div></foreignObject><text x="2" y="130" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">OS thread</text></switch></g><rect x="0" y="161" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 181px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />B<br /></font></div></div></div></foreignObject><text x="30" y="185" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="0" y="201" width="50" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 206px; margin-left: 2px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">OS thread</i></font></div></div></div></foreignObject><text x="2" y="210" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">OS thread</text></switch></g><rect x="0" y="241" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 261px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />C<br /></font></div></div></div></foreignObject><text x="30" y="265" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="0" y="281" width="50" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 286px; margin-left: 2px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">OS thread</i></font></div></div></div></foreignObject><text x="2" y="290" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">OS thread</text></switch></g><rect x="60" y="101" width="20" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 18px; height: 1px; padding-top: 106px; margin-left: 62px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp</i></font></div></div></div></foreignObject><text x="62" y="110" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp</text></switch></g><rect x="60" y="181" width="20" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 18px; height: 1px; padding-top: 186px; margin-left: 62px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp</i></font></div></div></div></foreignObject><text x="62" y="190" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp</text></switch></g><rect x="60" y="261" width="20" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 18px; height: 1px; padding-top: 266px; margin-left: 62px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp</i></font></div></div></div></foreignObject><text x="62" y="270" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp</text></switch></g><rect x="520" y="281" width="20" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 18px; height: 1px; padding-top: 286px; margin-left: 522px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp</i></font></div></div></div></foreignObject><text x="522" y="290" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp</text></switch></g><path d="M 260 321 L 260 1" fill="none" stroke="#b3b3b3" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><path d="M 520 281 L 540 281 L 540 101 L 551.88 101" fill="none" stroke="#50fa7b" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 558.88 101 L 551.88 103.33 L 551.88 98.67 Z" fill="#50fa7b" stroke="#50fa7b" stroke-miterlimit="10" pointer-events="all"/><rect x="540" y="151" width="10" height="120" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 545 269)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 269px; margin-left: 545px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp when yielding to A</i></font></div></div></div></foreignObject><text x="545" y="273" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp when yielding to A</text></switch></g><path d="M 520 281 L 551.88 281" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 558.88 281 L 551.88 283.33 L 551.88 278.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file