summary of recherche regarding kernel calls
This commit is contained in:
parent
8fd1555955
commit
3e67eeac5d
1 changed files with 265 additions and 74 deletions
|
|
@ -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: "welchen von diesen N Sockets kann ich jetzt lesen?""/>
|
||||
<node CREATED="1784909430431" ID="ID_1550519100" MODIFIED="1784909431498" TEXT="select">
|
||||
<node CREATED="1784909493440" ID="ID_1776306601" MODIFIED="1784909501801" TEXT="die älteste Lö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öß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ö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 "aktiv" markiert"/>
|
||||
<node CREATED="1784909851798" ID="ID_890255483" MODIFIED="1784909865847" TEXT="beim nä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ß nicht für welchen FD man signalisiert wurde"/>
|
||||
</node>
|
||||
<node CREATED="1784909970894" ID="ID_467441062" MODIFIED="1784910002009" TEXT="Achtung: lokale Files nicht für poll/epoll geeignet">
|
||||
<node CREATED="1784910003130" ID="ID_1349981115" MODIFIED="1784910020372" TEXT="sie implementieren nicht den "readiness-contract" 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 »erscheinen« sie immer "ready""/>
|
||||
<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üge über vertieftes Wissen und einiges an Erfahrung in diesen Bereichen, sollte aber meine Kenntnisse überprüfen und festigen, um auch auf Fragen eingehen zu können. Im Besonderen zu Kernel-nahen Themen weiß 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 "<b>JSR-133 Cookbook for Compiler Writers</b>"
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1784903807771" ID="ID_904190729" MODIFIED="1784905020229" TEXT="Adve & Gharachorloo, "Shared Memory Consistency Models: A Tutorial" (1996)">
|
||||
|
|
@ -1014,8 +1063,7 @@
|
|||
Gilt als Quelle fü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>."
|
||||
</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="»cache coherence protocol traffic«"/>
|
||||
<node CREATED="1784906746716" ID="ID_1799583572" MODIFIED="1784906767217" TEXT="typischerweise mehr als der Store-Buffer-flush fü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ä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ß 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 @@
|
|||
 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>
|
||||
"A synchronization primitive's instruction-level cost is what a hot microbenchmark measures; its systemic cost — coherence traffic under contention, and blocking/wake latency when it isn't contended — is what your production tail latency measures, and the two can differ by two to four orders of magnitude."
|
||||
</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 ⟹ heiß">
|
||||
<node CREATED="1784908742591" ID="ID_1531538522" MODIFIED="1784908749941" TEXT="der Proactor schläft nie"/>
|
||||
|
|
@ -1294,8 +1332,7 @@
|
|||
<strong http-equiv="content-type" content="text/html; charset=utf-8">server-vacation</strong> 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äft, setzt er ein Bit und muß 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ü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 ⟹ muß 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=""fast userspace mutex"">
|
||||
<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: "welchen von diesen N Sockets kann ich jetzt lesen?""/>
|
||||
<node CREATED="1784909430431" ID="ID_1550519100" MODIFIED="1784909431498" TEXT="select">
|
||||
<node CREATED="1784909493440" ID="ID_1776306601" MODIFIED="1784909501801" TEXT="die älteste Lö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öß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 ⟹ 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ö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ü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 "aktiv" markiert"/>
|
||||
<node CREATED="1784909851798" ID="ID_890255483" MODIFIED="1784909865847" TEXT="beim nä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ß nicht fü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> 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ür poll/epoll geeignet">
|
||||
<node CREATED="1784910003130" ID="ID_1349981115" MODIFIED="1784910020372" TEXT="sie implementieren nicht den "readiness-contract" 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 »erscheinen« sie immer "ready""/>
|
||||
<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ällt transparent auf Mutex+Cond-Var zurück (wenn nicht Linux)"/>
|
||||
</node>
|
||||
<node CREATED="1785374181810" ID="ID_27956831" MODIFIED="1785374210226" TEXT="alle »wait-Mechanismen« kosten „praktisch“ 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ü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="⟹ läuft in den »uncontended« 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 »protected section« wird normalerweise contended"/>
|
||||
<node CREATED="1785374328270" ID="ID_1014218563" MODIFIED="1785374340120" TEXT="und daher sieht man die Kosten fü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ß"/>
|
||||
<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 über eine Library"/>
|
||||
<node CREATED="1785376148758" ID="ID_295125768" MODIFIED="1785376156969" TEXT="Auslö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ö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ä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ä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ä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ö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 ähnlich wie ein Kernel-call"/>
|
||||
<node CREATED="1785379395416" ID="ID_1593183459" MODIFIED="1785379411081" TEXT="dann wird geprü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ä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ß 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äre theoretisch mö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 ≙ RAM"/>
|
||||
<node CREATED="1785379637415" ID="ID_1927386268" MODIFIED="1785379647023" TEXT="das würde also nur bei integrierter Grafik funktionieren"/>
|
||||
</node>
|
||||
<node CREATED="1785379657266" ID="ID_1701186306" MODIFIED="1785379678483" TEXT="ebenfalls (noch) nicht geklärt: funktioniert es mit konkreten GPUs und IO-Controllern"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue