summary of recherche regarding kernel calls

This commit is contained in:
Fischlurch 2026-07-30 04:48:30 +02:00
parent 8fd1555955
commit 3e67eeac5d

View file

@ -947,8 +947,57 @@
</node>
</node>
</node>
<node CREATED="1784909413276" ID="ID_249945275" MODIFIED="1785374060368" TEXT="alte / andere IO-Modelle">
<node CREATED="1784909419840" ID="ID_468319825" MODIFIED="1784909424853" TEXT="poll/epoll">
<node CREATED="1784909439497" ID="ID_1084860008" MODIFIED="1784909467251" TEXT="alle beantworten: &quot;welchen von diesen N Sockets kann ich jetzt lesen?&quot;"/>
<node CREATED="1784909430431" ID="ID_1550519100" MODIFIED="1784909431498" TEXT="select">
<node CREATED="1784909493440" ID="ID_1776306601" MODIFIED="1784909501801" TEXT="die &#xe4;lteste L&#xf6;sung"/>
<node CREATED="1784909502349" ID="ID_2286932" MODIFIED="1784909521102" TEXT="man gibt dem Kernel eine Bitmask die interessante FildDescriptors markiert"/>
<node CREATED="1784909521832" ID="ID_1755337748" MODIFIED="1784909530992" TEXT="der Kernel setzt dort Bit"/>
<node CREATED="1784909532281" ID="ID_1850235470" MODIFIED="1784909544907" TEXT="man sieht dann selber welche FD-Nummer man anschauen sollte"/>
<node CREATED="1784909546095" ID="ID_242092869" MODIFIED="1784909559545" TEXT="limitiert durch die feste Bitmask-Gr&#xf6;&#xdf;e (1024)"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1784562284612" ID="ID_1770923455" MODIFIED="1784562386505" TEXT="Performance-Aspekte">
<node CREATED="1784909581226" ID="ID_486293840" MODIFIED="1784909582678" TEXT="poll">
<node CREATED="1784909583578" ID="ID_50149205" MODIFIED="1784909592869" TEXT="gleiches Prinzip, aber API mit einer flexiblen Liste"/>
<node CREATED="1784909594154" ID="ID_1802655092" MODIFIED="1784909599505" TEXT="jeder Call ist O(n)"/>
</node>
<node CREATED="1784909637914" ID="ID_92373023" MODIFIED="1784909639511" TEXT="epoll">
<node CREATED="1784909640259" ID="ID_507142615" MODIFIED="1784909645150" TEXT="Linux-spezifische L&#xf6;sung"/>
<node CREATED="1785374094283" ID="ID_1130821537" MODIFIED="1785374151760" TEXT="implementiert analog zu einem Futex">
<arrowlink COLOR="#597699" DESTINATION="ID_1095241058" ENDARROW="Default" ENDINCLINATION="-218;-303;" ID="Arrow_ID_1783250058" STARTARROW="None" STARTINCLINATION="-666;46;"/>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1784909650811" ID="ID_1531049274" MODIFIED="1784909659550" TEXT="man registriert Interesse an bestimmten FDs"/>
<node CREATED="1784909660072" ID="ID_882314156" MODIFIED="1784909688207" TEXT="man bekommt per Kernel-Aufruf eine Liste der lesebereiten FDs"/>
<node CREATED="1784909688716" ID="ID_1964702359" MODIFIED="1784909707021" TEXT="ist O(1) da push vom Network-Stack"/>
</node>
</node>
<node CREATED="1784909736198" ID="ID_1140561950" MODIFIED="1784909738753" TEXT="im Detail">
<node CREATED="1784909739501" ID="ID_1315873664" MODIFIED="1784909745423" TEXT="das sind alles blockende Kernel-Calls"/>
<node CREATED="1784909751964" ID="ID_1277219779" MODIFIED="1784909761846" TEXT="nur werden die Daten intern bereits vorbereitet"/>
<node CREATED="1784909776690" ID="ID_988789751" MODIFIED="1784909785052" TEXT="Jeder Socket hat einen receive-Buffer"/>
<node CREATED="1784909814875" ID="ID_1511520490" MODIFIED="1784909824021" TEXT="dort kann man sich in eine wait-queue registrieren"/>
<node CREATED="1784909824946" ID="ID_943421877" MODIFIED="1784909849298" TEXT="beim Eintreffen von Daten wird der aktuelle Thread auf &quot;aktiv&quot; markiert"/>
<node CREATED="1784909851798" ID="ID_890255483" MODIFIED="1784909865847" TEXT="beim n&#xe4;chsten Scheduler-Turn wird er auf eine core gemapped"/>
</node>
<node CREATED="1784909882722" ID="ID_898978088" MODIFIED="1784909894254" TEXT="es gibt eine Unix-Signal-basierte Variante">
<node CREATED="1784909895312" ID="ID_1380240825" MODIFIED="1784909906371" TEXT="die wird aber extrem selten genutzt"/>
<node CREATED="1784909920762" ID="ID_409154508" MODIFIED="1784909936575" TEXT="ist kniffelig: man wei&#xdf; nicht f&#xfc;r welchen FD man signalisiert wurde"/>
</node>
<node CREATED="1784909970894" ID="ID_467441062" MODIFIED="1784910002009" TEXT="Achtung: lokale Files nicht f&#xfc;r poll/epoll geeignet">
<node CREATED="1784910003130" ID="ID_1349981115" MODIFIED="1784910020372" TEXT="sie implementieren nicht den &quot;readiness-contract&quot; des VFS-Layers"/>
<node CREATED="1784910020816" ID="ID_1067149107" MODIFIED="1784910030490" TEXT="sie haben keinnen Buffer-leer-Status"/>
<node CREATED="1784910033854" ID="ID_245837866" MODIFIED="1784910044737" TEXT="insofern &#xbb;erscheinen&#xab; sie immer &quot;ready&quot;"/>
<node CREATED="1784910045236" ID="ID_1620698915" MODIFIED="1784910058118" TEXT="aber der Lese-Aufruf blockt dann u.U. doch"/>
<node CREATED="1784910062689" ID="ID_637014950" MODIFIED="1784910077818" TEXT="Abhilfe: asio und File-Handles im DIRECT-Modus"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1784910098946" ID="ID_1349516830" MODIFIED="1784910117028" TEXT="selbst das Reactor-Modell braucht stets einen Kernel-Call">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1784910118219" ID="ID_560621411" MODIFIED="1784910129209" TEXT="das ist der wichtigste Vorteil von IO_URING"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1784562284612" ID="ID_1770923455" MODIFIED="1785373442117" TEXT="Performance-Aspekte">
<richcontent TYPE="NOTE"><html>
<head>
@ -958,11 +1007,12 @@
Ich verf&#252;ge &#252;ber vertieftes Wissen und einiges an Erfahrung in diesen Bereichen, sollte aber meine Kenntnisse &#252;berpr&#252;fen und festigen, um auch auf Fragen eingehen zu k&#246;nnen. Im Besonderen zu Kernel-nahen Themen wei&#223; ich ehr wenig.
</p>
</body>
</html></richcontent>
</html>
</richcontent>
<icon BUILTIN="yes"/>
<node CREATED="1784562287819" ID="ID_1068288733" MODIFIED="1784562292010" TEXT="Kontext-Switches"/>
<node CREATED="1784562292542" ID="ID_1603052289" MODIFIED="1784562294752" TEXT="Kernel-Calls"/>
<node CREATED="1784562295882" ID="ID_1400086239" MODIFIED="1784562305846" TEXT="Cache/Pipeline"/>
<node CREATED="1784562295882" ID="ID_1400086239" MODIFIED="1785373434667" TEXT="Cache/Pipeline">
<arrowlink DESTINATION="ID_1358858974" ENDARROW="Default" ENDINCLINATION="486;-286;" ID="Arrow_ID_713987634" STARTARROW="None" STARTINCLINATION="1350;0;"/>
</node>
<node CREATED="1784562308304" ID="ID_1632264826" MODIFIED="1784562316059" TEXT="Locking/Barriers">
<node CREATED="1784597020131" ID="ID_246135215" MODIFIED="1784597022117" TEXT="Begriffe">
<node CREATED="1784597025507" ID="ID_1545286772" MODIFIED="1784597032928" TEXT="Barrier vs. Memory Barrier vs Fence">
@ -1000,8 +1050,7 @@
Doug Lea's &quot;<b>JSR-133 Cookbook for Compiler Writers</b>&quot;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
<node CREATED="1784903807771" ID="ID_904190729" MODIFIED="1784905020229" TEXT="Adve &amp; Gharachorloo, &quot;Shared Memory Consistency Models: A Tutorial&quot; (1996)">
@ -1014,8 +1063,7 @@
Gilt als Quelle f&#252;r Doug Lea
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<node CREATED="1784904506202" ID="ID_511399832" LINK="https://www.cs.cmu.edu/afs/cs/academic/class/15740-f18/www/papers/ieeemicro96-adve-consistency.pdf" MODIFIED="1784905020229" TEXT="Scan einer Publikation 1996">
<node CREATED="1784904643053" ID="ID_1228994940" LINK="https://web.archive.org/web/20260121164830/https://www.cs.cmu.edu/afs/cs/academic/class/15740-f18/www/papers/ieeemicro96-adve-consistency.pdf" MODIFIED="1784905020229" TEXT="A"/>
</node>
@ -1035,8 +1083,7 @@
loads before must complete before loads after
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1784903888399" ID="ID_296525436" MODIFIED="1784905020229" TEXT="StoreStore write-write fence">
<richcontent TYPE="NOTE"><html>
@ -1048,8 +1095,7 @@
stores before must become visible before stores after
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1784903888399" ID="ID_655305278" MODIFIED="1784905020229" TEXT="LoadStore read-write fence">
<richcontent TYPE="NOTE"><html>
@ -1061,8 +1107,7 @@
loads before must complete before stores after
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1784903888400" ID="ID_636786121" MODIFIED="1784905020229" TEXT="StoreLoad write-read fence">
<richcontent TYPE="NOTE"><html>
@ -1074,8 +1119,7 @@
stores before must become visible before loads after
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -1101,8 +1145,7 @@
<code http-equiv="content-type" content="text/html; charset=utf-8" class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">atomic_thread_fence</code>, not a synonym for <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">memory_order</code>.&quot;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -1118,8 +1161,7 @@
<a rel="mw:WikiLink" href="https://en.wikipedia.org/wiki/Douglas_C._Schmidt" title="Douglas C. Schmidt">Douglas C. Schmidt</a><br /><u>Pattern-Oriented Software Architecture Volume 2</u>:<br />Patterns for Concurrent and Networked Objects
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1784908524543" ID="ID_1085065643" LINK="https://www.researchgate.net/publication/215835789_Pattern-Oriented_Software_Architecture_Patterns_for_Concurrent_and_Networked_Objects_Volume_2" MODIFIED="1784908532546" TEXT="online auf ResearchGate.net">
<node CREATED="1784908575496" ID="ID_981331086" MODIFIED="1784908579812" TEXT="Proactor: S.181"/>
@ -1161,8 +1203,7 @@
ABER: gemeinsamer Speicherzugriff <b>kostet immer</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1784906659191" ID="ID_59883588" MODIFIED="1784906668665" TEXT="&#xbb;cache coherence protocol traffic&#xab;"/>
<node CREATED="1784906746716" ID="ID_1799583572" MODIFIED="1784906767217" TEXT="typischerweise mehr als der Store-Buffer-flush f&#xfc;r seq_cst">
@ -1179,8 +1220,7 @@
ABER: der Compiler kann auch <b>umordnen</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
@ -1194,15 +1234,15 @@
Bezug zu <b>liburing</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="idea"/>
<node CREATED="1784906876690" ID="ID_698949310" MODIFIED="1784906877398" TEXT="io_uring_smp_store_release() / io_uring_smp_load_acquire()"/>
<node CREATED="1784906878482" ID="ID_786453150" MODIFIED="1784906887132" TEXT="verwendet acquire / release-Semantik"/>
<node CREATED="1784906895393" ID="ID_388911767" MODIFIED="1784906905154" TEXT="braucht keine sequentielle Konsistenz"/>
</node>
<node CREATED="1784907052250" ID="ID_1271354149" MODIFIED="1784907068596" TEXT="Operationskosten vs. tats&#xe4;chliche Kosten">
<node CREATED="1784907070048" ID="ID_1700979751" MODIFIED="1784907080731" TEXT="drei Situation / Regimes zu unterscheiden">
<node CREATED="1784907070048" ID="ID_1700979751" MODIFIED="1785374442764" TEXT="drei Situation / Regimes zu unterscheiden">
<linktarget COLOR="#59757b" DESTINATION="ID_1700979751" ENDARROW="Default" ENDINCLINATION="-189;281;" ID="Arrow_ID_1440622046" SOURCE="ID_920472395" STARTARROW="None" STARTINCLINATION="-155;25;"/>
<node CREATED="1784907081695" ID="ID_8314744" MODIFIED="1784907094681" TEXT="Microbenchmark: hei&#xdf; und unter Druck">
<node CREATED="1784907141593" ID="ID_267156252" MODIFIED="1784907149370" TEXT="Zugriffe 3-5 x langsamer"/>
<node CREATED="1784907149877" ID="ID_248586022" MODIFIED="1784907156913" TEXT="niedrige 2-stellige Nanosekunden">
@ -1225,11 +1265,11 @@
&#160;gehalten werden
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1784907095381" ID="ID_1358858974" MODIFIED="1784907104877" TEXT="real call-chain yet hot cache">
<node CREATED="1784907095381" ID="ID_1358858974" MODIFIED="1785373434667" TEXT="real call-chain yet hot cache">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_1358858974" ENDARROW="Default" ENDINCLINATION="486;-286;" ID="Arrow_ID_713987634" SOURCE="ID_1400086239" STARTARROW="None" STARTINCLINATION="1350;0;"/>
<node CREATED="1784907242553" ID="ID_854501852" MODIFIED="1784907254508" TEXT="man sieht Cache-Miss-Kosten"/>
<node CREATED="1784907255224" ID="ID_191201973" MODIFIED="1784907288063" TEXT="LLC (low-levelCache) hit: mitlere 2-stellige ns"/>
<node CREATED="1784907289483" ID="ID_30976624" MODIFIED="1784907303133" TEXT="Cache-to-DRAM : 100ns"/>
@ -1252,8 +1292,7 @@
<body>
&quot;A synchronization primitive's instruction-level cost is what a hot microbenchmark measures; its systemic cost &#8212; coherence traffic under contention, and blocking/wake latency when it isn't contended &#8212; is what your production tail latency measures, and the two can differ by two to four orders of magnitude.&quot;
</body>
</html>
</richcontent>
</html></richcontent>
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<icon BUILTIN="wizard"/>
</node>
@ -1267,8 +1306,7 @@
Verbindung zum <b>Proactor</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="back"/>
<node CREATED="1784908718133" ID="ID_161622462" MODIFIED="1784908739198" TEXT="IO-dominiert &#x27f9; hei&#xdf;">
<node CREATED="1784908742591" ID="ID_1531538522" MODIFIED="1784908749941" TEXT="der Proactor schl&#xe4;ft nie"/>
@ -1294,8 +1332,7 @@
<strong http-equiv="content-type" content="text/html; charset=utf-8">server-vacation</strong>&#160;model
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -1309,54 +1346,208 @@
man kann einen Kernel-Thread konfiguieren, der die Submission-Queue pollt. Dort konfiguriert man eine Einschlafe-Periode. Wenn der Poller schl&#228;ft, setzt er ein Bit und mu&#223; von der Applikation explizit wieder reaktiviert werden.
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1785373456739" ID="ID_295523448" MODIFIED="1785373463022" TEXT="Basis-Mechanismen">
<node CREATED="1785373485441" ID="ID_941680751" MODIFIED="1785373500804" TEXT="die Kosten setzen sich stets aus mehreren Komponenten zusammen">
<node CREATED="1785373502656" ID="ID_1749694308" MODIFIED="1785373513287" TEXT="Atomic / Memory-Barrier f&#xfc;r eine Flag"/>
<node CREATED="1785373514436" ID="ID_285943102" MODIFIED="1785373526134" TEXT="typischwerwise Zugriff mit atomic-CAS"/>
<node CREATED="1785373528313" ID="ID_488098307" MODIFIED="1785373553521" TEXT="bei Contention &#x27f9; mu&#xdf; warten"/>
<node CREATED="1785373554116" ID="ID_1023699101" MODIFIED="1785373564672" TEXT="dazu in eine wait-queue im Kernel"/>
<node CREATED="1785373565532" ID="ID_462807653" MODIFIED="1785373574271" TEXT="und dann den Thread schlafen legen"/>
</node>
<node CREATED="1785373585511" ID="ID_1095241058" MODIFIED="1785374146516" TEXT="moderne Implementierung dieses Mechanismus: Futex">
<linktarget COLOR="#597699" DESTINATION="ID_1095241058" ENDARROW="Default" ENDINCLINATION="-218;-303;" ID="Arrow_ID_1783250058" SOURCE="ID_1130821537" STARTARROW="None" STARTINCLINATION="-666;46;"/>
<node CREATED="1785373600344" ID="ID_1992394136" MODIFIED="1785373608186" TEXT="&quot;fast userspace mutex&quot;">
<node CREATED="1785373640222" ID="ID_1176006855" LINK="https://kernel-internals.org/locking/futex/" MODIFIED="1785373651076" TEXT="ist eine Linux-spezifische Implementierung"/>
<node CREATED="1785373651891" ID="ID_852212282" MODIFIED="1785373656476" TEXT="der Mechanismus ist generisch">
<node CREATED="1785373696131" ID="ID_1324517392" MODIFIED="1785373774336">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Windows has <code http-equiv="content-type" content="text/html; charset=utf-8" class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]"><font face="Monospaced" color="#733a3a">WaitOnAddress</font></code><font face="Monospaced" color="#733a3a">/<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">WakeByAddressSingle</code>/<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">WakeByAddressAll</code></font>
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1785373716197" ID="ID_1245015075" MODIFIED="1785373788200">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
FreeBSD has <code http-equiv="content-type" content="text/html; charset=utf-8" class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]"><font face="Monospaced" color="#7a5454">_umtx_op</font></code>
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
<node CREATED="1784909413276" ID="ID_249945275" MODIFIED="1784909418755" TEXT="alte / andere IO-Modelle">
<node CREATED="1784909419840" ID="ID_468319825" MODIFIED="1784909424853" TEXT="poll/epoll">
<node CREATED="1784909439497" ID="ID_1084860008" MODIFIED="1784909467251" TEXT="alle beantworten: &quot;welchen von diesen N Sockets kann ich jetzt lesen?&quot;"/>
<node CREATED="1784909430431" ID="ID_1550519100" MODIFIED="1784909431498" TEXT="select">
<node CREATED="1784909493440" ID="ID_1776306601" MODIFIED="1784909501801" TEXT="die &#xe4;lteste L&#xf6;sung"/>
<node CREATED="1784909502349" ID="ID_2286932" MODIFIED="1784909521102" TEXT="man gibt dem Kernel eine Bitmask die interessante FildDescriptors markiert"/>
<node CREATED="1784909521832" ID="ID_1755337748" MODIFIED="1784909530992" TEXT="der Kernel setzt dort Bit"/>
<node CREATED="1784909532281" ID="ID_1850235470" MODIFIED="1784909544907" TEXT="man sieht dann selber welche FD-Nummer man anschauen sollte"/>
<node CREATED="1784909546095" ID="ID_242092869" MODIFIED="1784909559545" TEXT="limitiert durch die feste Bitmask-Gr&#xf6;&#xdf;e (1024)"/>
<node CREATED="1785373803889" ID="ID_1512882398" MODIFIED="1785373807427" TEXT="syscalls">
<node CREATED="1785373825289" ID="ID_174764098" MODIFIED="1785373826006" TEXT="futex(FUTEX_WAIT, addr, expected)">
<node CREATED="1785373829201" ID="ID_951216369" MODIFIED="1785373833165" TEXT="macht einen CAS"/>
<node CREATED="1785373833721" ID="ID_1842215225" MODIFIED="1785373848586" TEXT="wenn *addr == expected &#x27f9; Schlafen"/>
</node>
<node CREATED="1784909581226" ID="ID_486293840" MODIFIED="1784909582678" TEXT="poll">
<node CREATED="1784909583578" ID="ID_50149205" MODIFIED="1784909592869" TEXT="gleiches Prinzip, aber API mit einer flexiblen Liste"/>
<node CREATED="1784909594154" ID="ID_1802655092" MODIFIED="1784909599505" TEXT="jeder Call ist O(n)"/>
</node>
<node CREATED="1784909637914" ID="ID_92373023" MODIFIED="1784909639511" TEXT="epoll">
<node CREATED="1784909640259" ID="ID_507142615" MODIFIED="1784909645150" TEXT="Linux-spezifische L&#xf6;sung"/>
<node CREATED="1784909650811" ID="ID_1531049274" MODIFIED="1784909659550" TEXT="man registriert Interesse an bestimmten FDs"/>
<node CREATED="1784909660072" ID="ID_882314156" MODIFIED="1784909688207" TEXT="man bekommt per Kernel-Aufruf eine Liste der lesebereiten FDs"/>
<node CREATED="1784909688716" ID="ID_1964702359" MODIFIED="1784909707021" TEXT="ist O(1) da push vom Network-Stack"/>
<node CREATED="1785373860741" ID="ID_1986824982" MODIFIED="1785373862088" TEXT="futex(FUTEX_WAKE, addr, n)">
<node CREATED="1785373863108" ID="ID_1980037133" MODIFIED="1785373891097">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
weckt n threads auf,
</p>
<p>
die in der wait-queue f&#252;r adr. stehen
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node CREATED="1784909736198" ID="ID_1140561950" MODIFIED="1784909738753" TEXT="im Detail">
<node CREATED="1784909739501" ID="ID_1315873664" MODIFIED="1784909745423" TEXT="das sind alles blockende Kernel-Calls"/>
<node CREATED="1784909751964" ID="ID_1277219779" MODIFIED="1784909761846" TEXT="nur werden die Daten intern bereits vorbereitet"/>
<node CREATED="1784909776690" ID="ID_988789751" MODIFIED="1784909785052" TEXT="Jeder Socket hat einen receive-Buffer"/>
<node CREATED="1784909814875" ID="ID_1511520490" MODIFIED="1784909824021" TEXT="dort kann man sich in eine wait-queue registrieren"/>
<node CREATED="1784909824946" ID="ID_943421877" MODIFIED="1784909849298" TEXT="beim Eintreffen von Daten wird der aktuelle Thread auf &quot;aktiv&quot; markiert"/>
<node CREATED="1784909851798" ID="ID_890255483" MODIFIED="1784909865847" TEXT="beim n&#xe4;chsten Scheduler-Turn wird er auf eine core gemapped"/>
</node>
<node CREATED="1784909882722" ID="ID_898978088" MODIFIED="1784909894254" TEXT="es gibt eine Unix-Signal-basierte Variante">
<node CREATED="1784909895312" ID="ID_1380240825" MODIFIED="1784909906371" TEXT="die wird aber extrem selten genutzt"/>
<node CREATED="1784909920762" ID="ID_409154508" MODIFIED="1784909936575" TEXT="ist kniffelig: man wei&#xdf; nicht f&#xfc;r welchen FD man signalisiert wurde"/>
<node CREATED="1785373936627" ID="ID_261363018" MODIFIED="1785373963603">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
beachte: der <i>uncontended-case</i>&#160;bleibt <b>komplett im userspace</b>
</p>
</body>
</html>
</richcontent>
<node CREATED="1785373966875" ID="ID_1767743436" MODIFIED="1785373975865" TEXT="d.h. der ist so schnell wie eine atomic-barrier"/>
<node CREATED="1785373976469" ID="ID_155107098" MODIFIED="1785373986417" TEXT="nur wenn wir eh blocken, machen wir einen syscall"/>
</node>
<node CREATED="1784909970894" ID="ID_467441062" MODIFIED="1784910002009" TEXT="Achtung: lokale Files nicht f&#xfc;r poll/epoll geeignet">
<node CREATED="1784910003130" ID="ID_1349981115" MODIFIED="1784910020372" TEXT="sie implementieren nicht den &quot;readiness-contract&quot; des VFS-Layers"/>
<node CREATED="1784910020816" ID="ID_1067149107" MODIFIED="1784910030490" TEXT="sie haben keinnen Buffer-leer-Status"/>
<node CREATED="1784910033854" ID="ID_245837866" MODIFIED="1784910044737" TEXT="insofern &#xbb;erscheinen&#xab; sie immer &quot;ready&quot;"/>
<node CREATED="1784910045236" ID="ID_1620698915" MODIFIED="1784910058118" TEXT="aber der Lese-Aufruf blockt dann u.U. doch"/>
<node CREATED="1784910062689" ID="ID_637014950" MODIFIED="1784910077818" TEXT="Abhilfe: asio und File-Handles im DIRECT-Modus"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1784910098946" ID="ID_1349516830" MODIFIED="1784910117028" TEXT="selbst das Reactor-Modell braucht stets einen Kernel-Call">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1784910118219" ID="ID_560621411" MODIFIED="1784910129209" TEXT="das ist der wichtigste Vorteil von IO_URING"/>
<node CREATED="1785374468131" ID="ID_1152412438" MODIFIED="1785374479713" TEXT="Hinweis: C++20 hat nun ein std::atomic::wait()">
<node CREATED="1785374486872" ID="ID_685239977" MODIFIED="1785374496979" TEXT="damit hat man direkt Zugriff auf ein Atomic+Futex"/>
<node CREATED="1785374497538" ID="ID_236549154" MODIFIED="1785374507225" TEXT="man kann damit selber custom-Locks implementieren"/>
<node CREATED="1785374522332" ID="ID_173017861" MODIFIED="1785374544060" TEXT="f&#xe4;llt transparent auf Mutex+Cond-Var zur&#xfc;ck (wenn nicht Linux)"/>
</node>
<node CREATED="1785374181810" ID="ID_27956831" MODIFIED="1785374210226" TEXT="alle &#xbb;wait-Mechanismen&#xab; kosten &#x201e;praktisch&#x201c; das Gleiche">
<node CREATED="1785374212038" ID="ID_370192999" MODIFIED="1785374215346" TEXT="das war nicht immer so"/>
<node CREATED="1785374218629" ID="ID_1002961055" MODIFIED="1785374240868" TEXT="die Unterschiede liegen im Nutzkontext"/>
<node CREATED="1785374251721" ID="ID_642192338" MODIFIED="1785374257091" TEXT="und vor allem in der workload">
<node CREATED="1785374257860" ID="ID_1630491542" MODIFIED="1785374260715" TEXT="Beispiel Future">
<node CREATED="1785374262221" ID="ID_791328949" MODIFIED="1785374270705" TEXT="Future wird nur ein einziges mal gepr&#xfc;ft"/>
<node CREATED="1785374271271" ID="ID_1622542937" MODIFIED="1785374276777" TEXT="in der Regel ist der Wert schon da"/>
<node CREATED="1785374277447" ID="ID_1273394515" MODIFIED="1785374296358" TEXT="&#x27f9; l&#xe4;uft in den &#xbb;uncontended&#xab; branch des unterliegenden Futex"/>
</node>
<node CREATED="1785374299082" ID="ID_1622886203" MODIFIED="1785374301662" TEXT="Beispiel Mutex">
<node CREATED="1785374302443" ID="ID_1801864697" MODIFIED="1785374308669" TEXT="ist ebenfalls durch ein Futex implementiert"/>
<node CREATED="1785374309201" ID="ID_1911827110" MODIFIED="1785374327674" TEXT="aber eine &#xbb;protected section&#xab; wird normalerweise contended"/>
<node CREATED="1785374328270" ID="ID_1014218563" MODIFIED="1785374340120" TEXT="und daher sieht man die Kosten f&#xfc;r das Warten / Aufwecken"/>
</node>
</node>
<node CREATED="1785374346803" ID="ID_920472395" MODIFIED="1785374449100" TEXT="und das Regime">
<arrowlink COLOR="#59757b" DESTINATION="ID_1700979751" ENDARROW="Default" ENDINCLINATION="-189;281;" ID="Arrow_ID_1440622046" STARTARROW="None" STARTINCLINATION="-155;25;"/>
<node CREATED="1785374352413" ID="ID_911760365" MODIFIED="1785374420663" TEXT="Regime-A : hot inner loop"/>
<node CREATED="1785374369293" ID="ID_1318591290" MODIFIED="1785374408490" TEXT="Regime-B : generisch aktiv und meist hei&#xdf;"/>
<node CREATED="1785374380979" ID="ID_512559122" MODIFIED="1785374393801" TEXT="Regime-C : Thread war schlafen"/>
</node>
</node>
</node>
</node>
<node CREATED="1784562287819" ID="ID_1068288733" MODIFIED="1785378606550" TEXT="Kontext-Switches"/>
<node CREATED="1784562292542" ID="ID_1603052289" MODIFIED="1785373446866" TEXT="Kernel-Calls">
<node CREATED="1785376102079" ID="ID_1536989433" MODIFIED="1785376127245" TEXT="kosten einen Aufwand im 3-stelligen ns-Bereich"/>
<node CREATED="1785376129817" ID="ID_1511137632" MODIFIED="1785376141879" TEXT="eine komplexe Sequenz">
<node CREATED="1785376143534" ID="ID_152207069" MODIFIED="1785376148074" TEXT="Einsprung &#xfc;ber eine Library"/>
<node CREATED="1785376148758" ID="ID_295125768" MODIFIED="1785376156969" TEXT="Ausl&#xf6;sen einer Trap">
<node CREATED="1785376177775" ID="ID_930548024" MODIFIED="1785376186620" TEXT="eine spezielle Assembly-Instruktion">
<node CREATED="1785376187454" ID="ID_164263068" MODIFIED="1785376195279" TEXT="x86 : syscall"/>
</node>
<node CREATED="1785376208543" ID="ID_1847650103" MODIFIED="1785376220339" TEXT="daraufhin wird instruction-pointer und einige Register gesichert"/>
<node CREATED="1785376241235" ID="ID_725013930" MODIFIED="1785376256368" TEXT="danach wird in h&#xf6;her priorisierten Modus geschaltet"/>
<node CREATED="1785376262807" ID="ID_1950591472" MODIFIED="1785376276097" TEXT="und an eine einzige vorkonfigurierte Addresse gesprungen">
<node CREATED="1785376292363" ID="ID_1115226790" MODIFIED="1785376299850" TEXT="diese wird beim Boot in ein Register gelegt"/>
<node CREATED="1785376300386" ID="ID_366808888" MODIFIED="1785376310031" TEXT="und kann vom userspace nicht manipuliert werden"/>
<node CREATED="1785376310664" ID="ID_1139400273" MODIFIED="1785376386487" TEXT="das stellt die Integrit&#xe4;t des Kernels sicher">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
man kann nur aufrufen, was der Kernel an Einsprungspunkten bietet; eigentlicher Kernel-Code ist nicht vom Userpace zug&#228;nglich
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
<node CREATED="1785376387374" ID="ID_10839834" MODIFIED="1785376421394" TEXT="im Kernel dann gibt es einen entry-Stup (sichert weiteren Prozessor-State)"/>
<node CREATED="1785376444393" ID="ID_1935728415" MODIFIED="1785376496241" TEXT="Page-Table swap / hier passieren Meltdown-Mititgations">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...um Ausspionieren des Kernel via speculative execution zu verhindern
</p>
</body>
</html>
</richcontent>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1785377263697" ID="ID_1250788650" MODIFIED="1785377268936" TEXT="Stichwort: KPTI page-table swap">
<icon BUILTIN="help"/>
</node>
</node>
<node CREATED="1785376498647" ID="ID_1822205437" MODIFIED="1785376509044" TEXT="danach noch Aktivit&#xe4;ten um Daten sichtbar zu machen"/>
</node>
<node CREATED="1785376518059" ID="ID_1257914148" MODIFIED="1785376526031" TEXT="Nebeneffekte: Cache">
<node CREATED="1785376527107" ID="ID_1748163345" MODIFIED="1785376537650" TEXT="der TLB wird geflushed"/>
<node CREATED="1785376539111" ID="ID_543560260" MODIFIED="1785376559166" TEXT="der Kernel-Pfad hat Cache-Lines belegt (die jetzt stale sind)"/>
<node CREATED="1785376566422" ID="ID_136776264" MODIFIED="1785376574840" TEXT="das verringert den nutzbaren Cache"/>
</node>
<node CREATED="1785376585693" ID="ID_1949566985" MODIFIED="1785376603757" TEXT="io_uring vermeidet diese Kosten (fast)">
<node CREATED="1785376605217" ID="ID_1055827511" MODIFIED="1785376611073" TEXT="mit SQPOLL sogar ganz"/>
<node CREATED="1785376611567" ID="ID_53028222" MODIFIED="1785376621074" TEXT="sonst: ein syscall pro batch"/>
</node>
</node>
<node CREATED="1785378610026" ID="ID_305120612" MODIFIED="1785378619580" TEXT="memory mapping / Buffer handover">
<node CREATED="1785378623250" ID="ID_523538154" MODIFIED="1785379303000" TEXT="die Virtual Memory Architecture (VMA) erm&#xf6;glicht zero-copy data access"/>
<node CREATED="1785379254871" ID="ID_519865367" MODIFIED="1785379261305" TEXT="DMA schreibt in einen Speicherblock"/>
<node CREATED="1785379280369" ID="ID_12699703" MODIFIED="1785379313432" TEXT="VMA kann das mappen in...">
<node CREATED="1785379314109" ID="ID_1246590305" MODIFIED="1785379322334" TEXT="den Kernel-Page-Cache"/>
<node CREATED="1785379323178" ID="ID_1435039698" MODIFIED="1785379332276" TEXT="in eine mem-mapped area im userspace"/>
</node>
<node CREATED="1785379355285" ID="ID_903959948" MODIFIED="1785379371231" TEXT="memory mapping geht typischwereise via trap/page fault">
<node CREATED="1785379376779" ID="ID_1210575438" MODIFIED="1785379387038" TEXT="erst bei Zugriff passiert eine Trap"/>
<node CREATED="1785379387490" ID="ID_1395999338" MODIFIED="1785379393300" TEXT="Aufwand &#xe4;hnlich wie ein Kernel-call"/>
<node CREATED="1785379395416" ID="ID_1593183459" MODIFIED="1785379411081" TEXT="dann wird gepr&#xfc;ft: sind die Daten bereits im Kernel-Page-Cache">
<node CREATED="1785379411798" ID="ID_758477303" MODIFIED="1785379418186" TEXT="ja: einfach das Mapping eintragen"/>
<node CREATED="1785379418573" ID="ID_821579792" MODIFIED="1785379427772" TEXT="nein: das IO auf den Weg bringen"/>
</node>
</node>
<node CREATED="1785379448249" ID="ID_391864672" MODIFIED="1785379459343" TEXT="ABER: Koh&#xe4;renz / Alignment sind das Problem">
<node CREATED="1785379460211" ID="ID_1126553137" MODIFIED="1785379475287" TEXT="normales read() kann an beliebigen Offset lesen"/>
<node CREATED="1785379477453" ID="ID_1182558436" MODIFIED="1785379498703" TEXT="sowas mu&#xdf; zwingend mit einer weiteren Kopie im Kernel realisiert werden"/>
<node CREATED="1785379507593" ID="ID_1859490386" MODIFIED="1785379522058" TEXT="nur wenn man O_DIRECT verwendet, kommt man ohne Kopie aus"/>
</node>
<node CREATED="1785379524914" ID="ID_668241807" MODIFIED="1785379537889" TEXT="Ausblick / Weiterung : zero-copy pipeline">
<node CREATED="1785379538807" ID="ID_1141220584" MODIFIED="1785379544840" TEXT="w&#xe4;re theoretisch m&#xf6;glich"/>
<node CREATED="1785379545284" ID="ID_976464777" MODIFIED="1785379554159" TEXT="wird derzeit im Kernel-Umfeld diskutiert"/>
<node CREATED="1785379554714" ID="ID_1096717282" MODIFIED="1785379577923" TEXT="also Kernel, DMA, Userland und GPU verwenden den gleichen Page-frame">
<node CREATED="1785379707206" ID="ID_657041630" MODIFIED="1785379708586" TEXT="EGL_EXT_image_dma_buf_import"/>
</node>
<node CREATED="1785379579783" ID="ID_98992954" MODIFIED="1785379593121" TEXT="es gibt diverse Constraints zu beachten">
<node CREATED="1785379593918" ID="ID_1333013861" MODIFIED="1785379636649" TEXT="vor allem : VRAM &#x2259; RAM"/>
<node CREATED="1785379637415" ID="ID_1927386268" MODIFIED="1785379647023" TEXT="das w&#xfc;rde also nur bei integrierter Grafik funktionieren"/>
</node>
<node CREATED="1785379657266" ID="ID_1701186306" MODIFIED="1785379678483" TEXT="ebenfalls (noch) nicht gekl&#xe4;rt: funktioniert es mit konkreten GPUs und IO-Controllern"/>
</node>
</node>
</node>