Scheduler: develop scheme for capacity redirection

...to make that abundantly clear: we do not aim at precision timing,
rather the goal is to redistribute capacity currently not usable...

Basically we're telling the worker "nothing to do right now, sorry,
but check back in <timespan> because I may need you then"
This commit is contained in:
Fischlurch 2023-10-23 23:55:54 +02:00
parent 08c13ed6fe
commit 3eaf623e98
3 changed files with 196 additions and 10 deletions

View file

@ -143,7 +143,7 @@ namespace gear {
{ }
private:
Wiring wiring_;
const Wiring wiring_;
TimeVar tendedHead_{Time::ANYTIME};
public:
@ -209,10 +209,31 @@ namespace gear {
}
Time
scatteredDelayTime (Capacity capacity)
Offset
scatteredDelayTime (Time now, Capacity capacity)
{
UNIMPLEMENTED ("establish a randomised targeted delay time");
auto scatter = [&](Duration horizon)
{
size_t step = 1;////////////////////////////////////////////////////TODO implement randomisation
return Offset{_raw(horizon) * step / wiring_.maxCapacity};
};
switch (capacity) {
case DISPATCH:
return Offset::ZERO;
case SPINTIME:
return Offset::ZERO;
case TENDNEXT:
return Offset{tendedHead_-now};
case NEARTIME:
return Offset{tendedHead_-now + scatter(WORK_HORIZON)};
case WORKTIME:
return Offset{tendedHead_-now + scatter(SLEEP_HORIZON)};
case IDLETIME:
return /*without start offset*/ scatter(SLEEP_HORIZON);
default:
NOTREACHED ("uncovered work capacity classification.");
}
}
};

View file

@ -27,6 +27,7 @@
#include "lib/test/run.hpp"
#include "vault/gear/load-controller.hpp"
#include "vault/real-clock.hpp"
//#include "lib/time/timevalue.hpp"
//#include "lib/format-cout.hpp"
//#include "lib/util.hpp"
@ -34,7 +35,7 @@
//#include <utility>
using test::Test;
//using std::move;
using std::move;
//using util::isSameObject;
@ -46,6 +47,7 @@ namespace test {
// using lib::time::Offset;
// using lib::time::Time;
using Capacity = LoadController::Capacity;
using Wiring = LoadController::Wiring;
@ -67,6 +69,7 @@ namespace test {
classifyHorizon();
tendNextActivity();
classifyCapacity();
scatteredReCheck();
walkingDeadline();
setupLalup();
}
@ -228,6 +231,34 @@ namespace test {
}
/** @test verify the re-distribution of free capacity by targeted delay
* @todo WIP 10/23 🔁 define implement
*/
void
scatteredReCheck()
{
Wiring setup;
setup.maxCapacity = 16;
LoadController lctrl{move(setup)};
auto isBetween = [](auto lo, auto hi, auto val)
{
return lo <= val and val < hi;
};
TimeVar now = RealClock::now();
Time next{now + FSecs(10)};
lctrl.tendNext (next);
CHECK (Time::ZERO == lctrl.scatteredDelayTime (now, Capacity::DISPATCH) );
CHECK (Time::ZERO == lctrl.scatteredDelayTime (now, Capacity::SPINTIME) );
CHECK ( next == lctrl.scatteredDelayTime (now, Capacity::TENDNEXT) );
CHECK (isBetween ( next, next+WORK_HORIZON , lctrl.scatteredDelayTime (now, Capacity::NEARTIME)));
CHECK (isBetween ( next, next+SLEEP_HORIZON, lctrl.scatteredDelayTime (now, Capacity::WORKTIME)));
CHECK (isBetween (Time::ZERO, SLEEP_HORIZON , lctrl.scatteredDelayTime (now, Capacity::IDLETIME)));
}
/** @test TODO
* @todo WIP 10/23 🔁 define implement
*/

View file

@ -82300,8 +82300,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Parametrisierung: maxCapacity = <font face="Monospaced" color="#868686">work::Config::</font><font face="Monospaced" color="#3f2c83">COMPUTATION_CAPACITY</font>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698090324855" ID="ID_1784536173" MODIFIED="1698090336812" TEXT="Zugriff auf BlockFlow-Auslastung">
<icon BUILTIN="hourglass"/>
@ -82728,6 +82727,119 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1697983546449" ID="ID_1801117774" MODIFIED="1698079545463" TEXT="scatteredDelayTime()">
<icon BUILTIN="forward"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698093070813" ID="ID_940807400" MODIFIED="1698093078487" TEXT="Parameter">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1698093149583" ID="ID_1430906257" MODIFIED="1698093152974" TEXT="inhaltlich ben&#xf6;tigt">
<node CREATED="1698093101030" ID="ID_1059393148" MODIFIED="1698093114592" TEXT="Startpunkt"/>
<node CREATED="1698093082201" ID="ID_1834606392" MODIFIED="1698093166710" TEXT="Zeitspanne"/>
<node CREATED="1698093141241" ID="ID_1715483141" MODIFIED="1698093145868" TEXT="Bezugspunkt"/>
<node CREATED="1698093116183" ID="ID_1914540136" MODIFIED="1698093121297" TEXT="Zufalls-Quelle"/>
</node>
<node COLOR="#435e98" CREATED="1698093201025" ID="ID_511277140" MODIFIED="1698097593295" TEXT="Zeit-Datentyp?">
<icon BUILTIN="help"/>
<node CREATED="1698093265376" ID="ID_1783179603" MODIFIED="1698093269668" TEXT="Verwendungszweck">
<node CREATED="1698093270800" ID="ID_1916220892" MODIFIED="1698093280466" TEXT="this_thread::sleep_for">
<node CREATED="1698093301715" ID="ID_1918932110" MODIFIED="1698093307270" TEXT="braucht chrono::duration"/>
<node CREATED="1698093343943" ID="ID_358242861" MODIFIED="1698093348872" TEXT="Genauigkeit ist implizit"/>
</node>
<node CREATED="1698093284117" ID="ID_840363847" MODIFIED="1698093288433" TEXT="this_thread::sleep_until">
<node CREATED="1698093289757" ID="ID_1416947114" MODIFIED="1698093315397" TEXT="braucht chrono::time_point"/>
<node CREATED="1698093292997" ID="ID_727329476" MODIFIED="1698093300063" TEXT="per Typ an die unterliegende Clock gebunden"/>
</node>
</node>
<node CREATED="1698093350477" ID="ID_371292667" MODIFIED="1698093353800" TEXT="Kontext">
<node CREATED="1698093354789" ID="ID_1741496299" MODIFIED="1698093371688" TEXT="der gesamte Scheduler verwendet lumiera::Time"/>
<node CREATED="1698093376559" ID="ID_633041348" MODIFIED="1698093384628" TEXT="das sind &#xb5;-Ticks">
<icon BUILTIN="info"/>
<node CREATED="1698093411613" ID="ID_1048787060" MODIFIED="1698093507603" TEXT="Genauigkeit ist grenzwertig">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Die Zeitangaben im std::chrono-Framework reichen bis in den Nano-Bereich, und es gibt einen high-precision-Timer
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1698093418798" ID="ID_1005113032" MODIFIED="1698097058330" TEXT="aber f&#xfc;r derzeitige &#x26a0; Systeme hinreichend">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...andererseits wei&#223; ich, da&#223; man schon einfachste Scheduling-Delays ab mindestens 400ns mi&#223;t, und da&#223; das Starten eines Thread auf meinem System mindestens 100&#181;s braucht. Der aktuelle Scheduler unter Linux (CFS) verwendet keine festen Time-Slices mehr, aber man versucht definitiv die Kontext-Switches zu minimieren. Latenzen oder Scheduling-Zyklen f&#252;r normale (nicht-realtime)-Prozesse liegen im Bereich <b>von Millisekunden</b>. Andererseits arbeitet die C++-Chrono-Funktion sleep_for nachweislich <i>im Schnitt</i>&#160;bis in den zweistelligen &#181;s-Bereich genau
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1698097066647" ID="ID_486321067" MODIFIED="1698097088638" TEXT="Anwendungszweck ist Kapazit&#xe4;ts-Verteilung">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1698097112840" ID="ID_512066576" MODIFIED="1698097575285" TEXT="Fazit: bei Lumiera-Zeittypen bleiben">
<arrowlink COLOR="#8494c7" DESTINATION="ID_1504658001" ENDARROW="Default" ENDINCLINATION="-3062;-49;" ID="Arrow_ID_1741608203" STARTARROW="None" STARTINCLINATION="1460;105;"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node CREATED="1698097633547" HGAP="9" ID="ID_454818161" MODIFIED="1698097650675" TEXT="&#x27f9; Schlu&#xdf;folgerungen" VSHIFT="8">
<node CREATED="1698097652193" ID="ID_507081898" MODIFIED="1698097676649" TEXT="brauche an irgend einem Ende die aktuelle Zeit"/>
<node CREATED="1698097678445" ID="ID_1655075680" LINK="#ID_102946038" MODIFIED="1698097733701" TEXT="diese aktuelle Zeit sollte auch als Zufalls-Quelle dienen"/>
<node CREATED="1698097835356" ID="ID_1972633500" MODIFIED="1698097847906" TEXT="aus Performance-Gr&#xfc;nden sollte diese Zeit ein Parameter sein"/>
<node CREATED="1698097848806" ID="ID_1030706126" MODIFIED="1698097864752" TEXT="dagegen den Bezugspunkt kann man aus tended-next gewinnen"/>
<node CREATED="1698097910006" ID="ID_1800439542" MODIFIED="1698100816307">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
die Funktion liefert eine <b>Duration</b>
</p>
</body>
</html>
</richcontent>
<arrowlink DESTINATION="ID_735254473" ENDARROW="Default" ENDINCLINATION="-57;47;" ID="Arrow_ID_806787669" STARTARROW="None" STARTINCLINATION="69;10;"/>
<icon BUILTIN="forward"/>
<node CREATED="1698097935810" ID="ID_1458098203" MODIFIED="1698097945269" TEXT="in &#xb5;-Tick-Aufl&#xf6;sung"/>
<node CREATED="1698097946017" ID="ID_1013671224" MODIFIED="1698097965475" TEXT="&#x27f6; chrono::microseconds"/>
<node CREATED="1698100685330" ID="ID_735254473" MODIFIED="1698100816307" TEXT="naja... Offset geht auch...">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...und spart einen zus&#228;tzlichen clamp-Schritt und den Absolutwert (den das OS sowiso machen wird)
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#a9b4c1" DESTINATION="ID_735254473" ENDARROW="Default" ENDINCLINATION="-57;47;" ID="Arrow_ID_806787669" SOURCE="ID_1800439542" STARTARROW="None" STARTINCLINATION="69;10;"/>
<icon BUILTIN="smiley-oh"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698101257233" ID="ID_254738750" MODIFIED="1698101462139" TEXT="Implementierung">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1698101262893" ID="ID_664525403" MODIFIED="1698101459058" TEXT="l&#xe4;uft auf eine Fallunterscheidung hinaus">
<icon BUILTIN="button_ok"/>
<node CREATED="1698101300800" ID="ID_1888321367" MODIFIED="1698101337767" TEXT="jetzt &#x27fc; nix"/>
<node CREATED="1698101338355" ID="ID_43153407" MODIFIED="1698101370639" TEXT="TENDNEXT ist logischerweise &#x27fc; &#x394; next"/>
<node CREATED="1698101372287" ID="ID_1451931012" MODIFIED="1698101450569" TEXT="NEARTIME &#x27fc; &#x394; + scatter WORK_HORIZON"/>
<node CREATED="1698101394396" ID="ID_144988262" MODIFIED="1698101446121" TEXT="WORKTIME &#x27fc; &#x394; + scatter SLEEP_HORIZON"/>
<node CREATED="1698101413705" ID="ID_1574790196" MODIFIED="1698101438499" TEXT="IDLETIME &#x27fc; ebenso, aber ohne &#x394;"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1698101272892" ID="ID_826560450" MODIFIED="1698101293954" TEXT="Randomisierung per Zeit">
<icon BUILTIN="flag-pink"/>
</node>
</node>
</node>
</node>
</node>
@ -90370,6 +90482,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697982054792" ID="ID_712555328" MODIFIED="1697982065291" TEXT="wieviele Activities werden von Schl&#xe4;fern &#xfc;bernommen"/>
<node CREATED="1697982086540" ID="ID_1123632550" MODIFIED="1697982105925" TEXT="waiting-due time speziell wenn von Schl&#xe4;fer &#xfc;bernommen"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698097719743" ID="ID_102946038" MODIFIED="1698097741666" TEXT="G&#xfc;te der Randomisierung per Systemzeit pr&#xfc;fen">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697981156144" ID="ID_190534528" MODIFIED="1697981425435" TEXT="Datenerfassung &#xfc;ber EngineObserver realisieren">
<icon BUILTIN="flag-yellow"/>
@ -90903,7 +91018,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1687652249218" ID="ID_1174002353" MODIFIED="1687652266192" TEXT="Overload und Priorit&#xe4;ts-Klassen">
<node CREATED="1687652249218" ID="ID_1174002353" MODIFIED="1698097252826" TEXT="Laststeuerung und Priorit&#xe4;ts-Klassen">
<node CREATED="1687652267839" ID="ID_739691729" LINK="https://en.wikipedia.org/wiki/Earliest_deadline_first_scheduling" MODIFIED="1687652334909" TEXT="was wir hier machen ist analog EDS">
<richcontent TYPE="NOTE"><html>
<head/>
@ -90930,6 +91045,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1698097270027" ID="ID_1129105536" MODIFIED="1698097290884" TEXT="Timing-Genauigkeit">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1698097298079" ID="ID_578937577" MODIFIED="1698097305903" TEXT="was brauchen wir wirklich?">
<icon BUILTIN="help"/>
</node>
<node CREATED="1698097312895" ID="ID_1679874959" MODIFIED="1698097325877" TEXT="System-Gegebenheiten">
<icon BUILTIN="info"/>
<node CREATED="1698097328174" ID="ID_80995931" MODIFIED="1698097345126" TEXT="die std::chrono - Implementierungen schlagen sich ganz ordentlich"/>
<node CREATED="1698097345681" ID="ID_1504658001" MODIFIED="1698097575285" TEXT="aber ohne weitere Ma&#xdf;nahmen kann man keine Genauigkeiten unter 1ms erwarten">
<linktarget COLOR="#8494c7" DESTINATION="ID_1504658001" ENDARROW="Default" ENDINCLINATION="-3062;-49;" ID="Arrow_ID_1741608203" SOURCE="ID_512066576" STARTARROW="None" STARTINCLINATION="1460;105;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1698097389049" ID="ID_600802835" MODIFIED="1698097410164" TEXT="es gibt high-resolution time sources im Kernel und die chrono::high_resolution_clock">
<node CREATED="1698097412552" ID="ID_35271353" MODIFIED="1698097417835" TEXT="damit kann man Spinnen"/>
<node CREATED="1698097418447" ID="ID_589008501" MODIFIED="1698097427939" TEXT="ob man das soll ist eine andere Frage">
<icon BUILTIN="smiley-oh"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693499887783" ID="ID_1870927644" MODIFIED="1693499914940" TEXT="f&#xfc;r sp&#xe4;ter...">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693499916691" ID="ID_1453759334" MODIFIED="1693499934621" TEXT="zu &#xfc;berpr&#xfc;fen">
@ -95388,7 +95522,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1482365415326" HGAP="71" ID="ID_886002365" MODIFIED="1557498707240" TEXT="Standard C++" VSHIFT="-25">
<node CREATED="1688646174430" ID="ID_1246578113" MODIFIED="1688646186652" TEXT="base language knowledge">
<icon BUILTIN="info"/>
<node CREATED="1688646188508" ID="ID_464419365" MODIFIED="1688648419999" TEXT="POD and unions">
<node CREATED="1688646188508" FOLDED="true" ID="ID_464419365" MODIFIED="1688648419999" TEXT="POD and unions">
<linktarget COLOR="#534e96" DESTINATION="ID_464419365" ENDARROW="Default" ENDINCLINATION="-729;124;" ID="Arrow_ID_1095556572" SOURCE="ID_683405596" STARTARROW="None" STARTINCLINATION="-1826;106;"/>
<node CREATED="1688646230670" ID="ID_1200807820" MODIFIED="1688646259534" TEXT="POD &#x27fa; &#x201e;no compiler magic happens&#x201c;">
<node CREATED="1688646260810" ID="ID_1731163706" LINK="https://stackoverflow.com/a/146589" MODIFIED="1688646437208" TEXT="basic built-in types and aggretates thereof"/>
@ -95590,7 +95724,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1695776592132" ID="ID_1103669600" LINK="https://en.cppreference.com/w/cpp/language/class_template_argument_deduction#Deduction_for_class_templates" MODIFIED="1695779285785" TEXT="via Class Template Argument Deduction (CTAD)">
<node CREATED="1695776592132" FOLDED="true" ID="ID_1103669600" LINK="https://en.cppreference.com/w/cpp/language/class_template_argument_deduction#Deduction_for_class_templates" MODIFIED="1695779285785" TEXT="via Class Template Argument Deduction (CTAD)">
<linktarget COLOR="#7c86a6" DESTINATION="ID_1103669600" ENDARROW="Default" ENDINCLINATION="-1340;79;" ID="Arrow_ID_344305057" SOURCE="ID_505417061" STARTARROW="None" STARTINCLINATION="-2530;150;"/>
<linktarget COLOR="#7c86a6" DESTINATION="ID_1103669600" ENDARROW="Default" ENDINCLINATION="-1340;79;" ID="Arrow_ID_171962477" SOURCE="ID_313781081" STARTARROW="None" STARTINCLINATION="-729;83;"/>
<node CREATED="1695776635546" ID="ID_536392621" MODIFIED="1695776837788" TEXT="geht normalerweise nicht &#x2014; da keine &#xbb;universelle Referenz&#xab;">