Scheduler / Activity-Lang: simplify handling of blocked Gate

In the first draft version, a blocked Gate was handled by
»polling« the Gate regularly by scheduling a re-invocation
repeatedly into the future (by a stepping defined through
ExecutionCtx::getWaitDelay()).

Yet the further development of the Activity-Language indicates
that the ''Notification mechanism'' is sufficient to handle all
foreseeable aspects of dependency management. Consequently this
''Gate poling is no longer necessary,'' since on Notification
the Gate is automatically checked and the activation impulse
is immediately passed on; thus the re-scheduled check would
never get an opportunity actually to trigger the Gate; such
an active polling would only be necessary if the count down
latch in the Gate is changed by "external forces".

Moreover, the first Scheduler integration tests with TestChainLoad
indicate that the rescheduled polling can create a considerable
additional load when longer dependency chains miss one early
prerequisite, and this additional load (albeit processed
comparatively fast by the Scheduler) will be shifted along
needlessly for quite some time, until all of the activities
from the failed chain have passed their deadline. And what
is even more concerning, these useless checks have a tendency
to miss-focus the capacity management, as it seems there is
much work to do in a near horizon, which in fact may not be
the case altogether.

Thus the Gate implementation is now *changed to just SKIP*
when blocked. This helped to drastically improve the behaviour
of the Scheduler immediately after start-up -- further observation
indicated another adjustment: the first Tick-duty-cycle is now
shortened, because (after the additional "noise" from gate-rescheduling
was removed), the newly scaled-up work capacity has the tendency
to focus in the time horizon directly behind the first jobs added
to the timeline, which typically is now the first »Tick«.

🡆 this leads to a recommendation, to arrange the first job-planning
chunk in such a way that the first actual work jobs appear in the area
between 5ms and 10ms after triggering the Scheduler start-up.Scheduler¡†
This commit is contained in:
Fischlurch 2023-12-07 22:12:41 +01:00
parent 5abab5390d
commit 030e9aa8a2
5 changed files with 101 additions and 47 deletions

View file

@ -204,6 +204,8 @@ namespace gear {
* The Execution Context need to be passed to any Activity _activation;_
* it provides the _bindings_ for functionality defined only on a conceptual
* level, and provided by an opaque implementation (actually the Scheduler)
* @remark `getWaitDelay` was once used for Gate, but is now an obscure
* fall-back for _other notifications_ (retained for future use)
*/
template<class EXE>
constexpr void
@ -540,13 +542,13 @@ namespace gear {
template<class EXE>
activity::Proc
checkGate (Time now, EXE& executionCtx)
checkGate (Time now, EXE&)
{
REQUIRE (GATE == verb_);
if (data_.condition.isDead(now)) // beyond deadline
return activity::SKIP;
if (data_.condition.isHold()) // prerequisite count not(yet) fulfilled -> spin (=re-invoke later)
return dispatchSelfDelayed (now, executionCtx);
if (data_.condition.isHold()) // prerequisite count not(yet) fulfilled -> block further activation
return activity::SKIP;
else
return activity::PASS;
}
@ -726,7 +728,7 @@ namespace gear {
return postChain (now, executionCtx);
default:
return dispatchSelfDelayed (now, executionCtx);
} // Fallback: self-re-dispatch for async execution
} // Fallback: self-re-dispatch for async execution (-> getWaitDelay())
}

View file

@ -141,7 +141,7 @@ namespace gear {
const auto IDLE_WAIT = 20ms; ///< sleep-recheck cycle for workers deemed _idle_
const size_t DISMISS_CYCLES = 100; ///< number of wait cycles before an idle worker terminates completely
Offset POLL_WAIT_DELAY{FSecs(1,1000)}; ///< delay until re-evaluating a condition previously found unsatisfied
Offset POLL_WAIT_DELAY{FSecs(1,1000)}; ///< delay until re-evaluating after notification (obscure feature, retained for future use)
Offset DUTY_CYCLE_PERIOD{FSecs(1,20)}; ///< period of the regular scheduler »tick« for state maintenance.
Offset DUTY_CYCLE_TOLERANCE{FSecs(1,10)}; ///< maximum slip tolerated on duty-cycle start before triggering Scheduler-emergency
}
@ -746,7 +746,9 @@ cout<<" ·‖ "+markThread()+": @ "+relT(now)+" HT:"+relT(layer1_.headTime())+
* more computational expensive work; IO and possibly blocking operations should be
* avoided here though. Exceptions emanating from here will shut down the engine.
* @param forceContinuation whether a follow-up DutyCycle _must_ happen,
* irrespective if the queue has still further entries (idle detection)
* irrespective if the queue has still further entries. Used
* on first Tick-Cycle directly after ignition, which is
* then also shortened (to improve scheduling precision)
*/
inline void
Scheduler::handleDutyCycle (Time now, bool forceContinuation)
@ -771,7 +773,7 @@ cout<<"‖▷▷▷‖ "+markThread()+": @ "+relT(now)+(empty()? string(" EMPTY"
if (not empty() or forceContinuation)
{// prepare next duty cycle »tick«
Time nextTick = now + DUTY_CYCLE_PERIOD;
Time nextTick = now + (forceContinuation? WORK_HORIZON : DUTY_CYCLE_PERIOD);
Time deadline = nextTick + DUTY_CYCLE_TOLERANCE;
Activity& tickActivity = activityLang_.createTick (deadline);
ActivationEvent tickEvent{tickActivity, nextTick, deadline, ManifestationID(), true};

View file

@ -585,7 +585,7 @@ namespace test {
_DiagnosticFun<SIG_done>::Type done;
_DiagnosticFun<SIG_tick>::Type tick;
function<Offset()> getWaitDelay = [] { return POLL_WAIT_DELAY; };
function<Offset()> getWaitDelay = [] { return POLL_WAIT_DELAY; };
function<Time()> getSchedTime = [this]{ return SCHED_TIME_MARKER;};
FakeExecutionCtx (ActivityDetector& detector)

View file

@ -247,8 +247,11 @@ namespace test {
/** @test behaviour of Activity::GATE:
* the count-down condition determines if activation _passes_
* or will _spin around_ for later re-try
* the count-down condition determines if activation _passes;_
* otherwise the Gate will just return activity::SKIP
* @remark in the original design, the Gate would poll for changes
* by re-scheduling itself into the Future; this behaviour
* turned out to be unnecessary and problematic.
*/
void
verifyActivity_Gate_block()
@ -264,11 +267,7 @@ namespace test {
CHECK (activity::SKIP == wiring.activate (tt, detector.executionCtx));
CHECK (23 == gate.data_.condition.rest); // prerequisite-count not altered
Time reScheduled = tt + detector.executionCtx.getWaitDelay();
CHECK (tt < reScheduled);
CHECK (detector.verifyInvocation("tap-GATE").arg("33.333 ⧐ Act(GATE")
.beforeInvocation("CTX-post").arg(reScheduled, "Act(GATE", "≺test::CTX≻"));
CHECK (detector.verifyInvocation("tap-GATE").arg("33.333 ⧐ Act(GATE"));
}
@ -299,14 +298,11 @@ namespace test {
Activity& wiring = detector.buildGateWatcher (gate);
Time tt{333,33};
Time reScheduled = tt + detector.executionCtx.getWaitDelay(); // retrieve the next time to retry
CHECK (tt < reScheduled);
// an attempt to activate blocks (and re-schedules for later retry)
// an attempt to activate blocks (returing SKIP, nothing else happens)
CHECK (activity::SKIP == wiring.activate (tt, detector.executionCtx));
CHECK (1 == gate.data_.condition.rest); // unchanged (and locked)...
CHECK (detector.verifyInvocation("tap-GATE").arg("33.333 ⧐ Act(GATE")
.beforeInvocation("CTX-post").arg(reScheduled, "Act(GATE", "≺test::CTX≻"));
CHECK (detector.verifyInvocation("tap-GATE").arg("33.333 ⧐ Act(GATE"));
detector.incrementSeq();
// Gate receives a notification from some prerequisite Activity
@ -314,17 +310,17 @@ namespace test {
CHECK (0 == gate.data_.condition.rest); // condition has been decremented...
CHECK (detector.verifyInvocation("tap-GATE").seq(0).arg("33.333 ⧐ Act(GATE")
.beforeInvocation("CTX-post").seq(0).arg(reScheduled, "Act(GATE", "≺test::CTX≻")
.beforeInvocation("tap-GATE").seq(1).arg("33.333 --notify-↯> Act(GATE")
.beforeInvocation("CTX-post").seq(1).arg(tt, "after-GATE", "≺test::CTX≻"));
CHECK (gate.data_.condition.dead == Time::MIN);
detector.incrementSeq();
Time ttt{444,44};
// when the re-scheduled check happens later, it is blocked to prevent double activation
// when another activation happens later, it is blocked to prevent double activation
CHECK (activity::SKIP == wiring.activate (ttt, detector.executionCtx));
CHECK (detector.verifyInvocation("tap-GATE").seq(2).arg("44.444 ⧐ Act(GATE"));
CHECK (detector.ensureNoInvocation("CTX-post").seq(2));
CHECK (detector.ensureNoInvocation("CTX-post").seq(2)
.afterInvocation("tap-GATE").seq(2));
CHECK (gate.data_.condition.dead == Time::MIN);
detector.incrementSeq();
@ -426,8 +422,7 @@ namespace test {
detector.incrementSeq();
gate.data_.condition.incDependencies(); // Gate is blocked
CHECK (activity::PASS == ActivityLang::dispatchChain (&post, detector.executionCtx)); // start execution (case/seq == 1)
CHECK (detector.verifyInvocation("Gate") .seq(1).arg("1.011 ⧐ Act(GATE") // ...the Gate was activated...
.beforeInvocation("CTX-post").seq(1).arg("2.011","Act(GATE","≺test::CTX≻")); // ...but was found blocked and re-scheduled itself to 2.011
CHECK (detector.verifyInvocation("Gate").seq(1).arg("1.011 ⧐ Act(GATE")); // ...the Gate was activated, but blocked...
CHECK (detector.ensureNoInvocation("after-Gate").seq(1) // verify activation was not passed out behind Gate
.afterInvocation("Gate").seq(1));
CHECK (detector.ensureNoInvocation("CTX-tick").seq(1) // verify also the λ-tick was not invoked this time

View file

@ -81220,8 +81220,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#435e98" CREATED="1690069297302" ID="ID_33956976" MODIFIED="1690492032363" TEXT="sonst....">
<icon BUILTIN="help"/>
<node CREATED="1690069315708" ID="ID_1571780277" MODIFIED="1690069346741" TEXT="...soll sich das Gate &#xbb;selbst in die Zukunft schieben&#xab;">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1693499693849" ID="ID_1878976712" MODIFIED="1693501299248" TEXT="ist dieses Feature &#xfc;berhaupt notwendig?">
<linktarget COLOR="#9671cb" DESTINATION="ID_1878976712" ENDARROW="Default" ENDINCLINATION="-1051;64;" ID="Arrow_ID_1465904567" SOURCE="ID_1514365592" STARTARROW="None" STARTINCLINATION="624;46;"/>
<node COLOR="#435e98" CREATED="1693499693849" ID="ID_1878976712" MODIFIED="1701988097696" TEXT="ist dieses Feature &#xfc;berhaupt notwendig?">
<linktarget COLOR="#717ecb" DESTINATION="ID_1878976712" ENDARROW="Default" ENDINCLINATION="-1051;64;" ID="Arrow_ID_1465904567" SOURCE="ID_1514365592" STARTARROW="None" STARTINCLINATION="624;46;"/>
<icon BUILTIN="help"/>
<node CREATED="1693500036651" ID="ID_891303584" MODIFIED="1693500110260" TEXT="aus generisch-logischen Gr&#xfc;nden eingef&#xfc;hrt">
<icon BUILTIN="info"/>
@ -81237,7 +81237,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1693500320700" ID="ID_1158823061" MODIFIED="1693501668230">
<node BACKGROUND_COLOR="#fefc4e" COLOR="#351d75" CREATED="1693500320700" ID="ID_1158823061" MODIFIED="1701988093280">
<richcontent TYPE="NODE"><html>
<head/>
<body>
@ -81248,6 +81248,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<arrowlink COLOR="#ff8c4a" DESTINATION="ID_130475381" ENDARROW="Default" ENDINCLINATION="-1002;56;" ID="Arrow_ID_501288232" STARTARROW="None" STARTINCLINATION="1201;66;"/>
<arrowlink COLOR="#ff835a" DESTINATION="ID_1677810131" ENDARROW="Default" ENDINCLINATION="266;-21;" ID="Arrow_ID_1264674848" STARTARROW="None" STARTINCLINATION="-317;19;"/>
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="bell"/>
</node>
</node>
@ -81294,10 +81295,17 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1690069846556" ID="ID_1000629107" MODIFIED="1690495286268" TEXT="ansonsten ist das ein &#x3bb;-POST mit festem Delay">
<node COLOR="#5b280f" CREATED="1690069846556" ID="ID_1000629107" MODIFIED="1701984491877" TEXT="ansonsten ist das ein &#x3bb;-POST mit festem Delay">
<arrowlink DESTINATION="ID_817512371" ENDARROW="Default" ENDINCLINATION="-55;19;" ID="Arrow_ID_1228234954" STARTARROW="None" STARTINCLINATION="-170;11;"/>
<icon BUILTIN="button_cancel"/>
<node COLOR="#ff0000" CREATED="1701984496259" HGAP="41" ID="ID_533015811" MODIFIED="1701988198479" TEXT="dieses Feature wurde zur&#xfc;ckgebaut" VSHIFT="4">
<arrowlink COLOR="#5a1f28" DESTINATION="ID_1360004322" ENDARROW="Default" ENDINCLINATION="250;-608;" ID="Arrow_ID_1804880639" STARTARROW="Default" STARTINCLINATION="641;48;"/>
<linktarget COLOR="#3bb887" DESTINATION="ID_533015811" ENDARROW="Default" ENDINCLINATION="138;478;" ID="Arrow_ID_668218713" SOURCE="ID_441526961" STARTARROW="None" STARTINCLINATION="633;-427;"/>
<icon BUILTIN="closed"/>
</node>
</node>
<node CREATED="1701984534846" ID="ID_1475563814" MODIFIED="1701984545944" TEXT="lediglich SKIP zur&#xfc;ckgeben"/>
</node>
<node CREATED="1693501591528" ID="ID_332217879" MODIFIED="1693501601917" TEXT="Steuer-Logik">
<node CREATED="1693501607721" ID="ID_182057848" MODIFIED="1693501620284" TEXT="prim&#xe4;r-Chain">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1693501621611" ID="ID_1677810131" MODIFIED="1693501660623" TEXT="gilt als Regelfall">
@ -85173,6 +85181,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1701923303140" ID="ID_1723619656" MODIFIED="1701923339093" TEXT="Duty-Cycle re-Schedule wirkt nicht auf Laststeuerung zur&#xfc;ck">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1701988592702" ID="ID_207157868" MODIFIED="1701988669753" TEXT="1. Duty-Cycle-Tick erfolgt bereits nach WORK_HORIZON">
<linktarget COLOR="#5fb119" DESTINATION="ID_207157868" ENDARROW="Default" ENDINCLINATION="120;6;" ID="Arrow_ID_1550924182" SOURCE="ID_1888744514" STARTARROW="None" STARTINCLINATION="458;59;"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1701978652233" ID="ID_1168441343" MODIFIED="1701978661408" TEXT="(jetzt schon)"/>
@ -89935,7 +89946,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1688336697451" FOLDED="true" ID="ID_360159435" MODIFIED="1693695232010" TEXT="SchedulerActivity_test">
<node COLOR="#338800" CREATED="1688336697451" FOLDED="true" ID="ID_360159435" MODIFIED="1701984582513" TEXT="SchedulerActivity_test">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1688337038457" ID="ID_1859527374" MODIFIED="1693695203513">
<richcontent TYPE="NODE"><html>
@ -90016,7 +90027,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1692718437941" ID="ID_1363192893" MODIFIED="1692723165688" TEXT="verifyActivity_Notify_dispatch">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1689199390484" FOLDED="true" ID="ID_212018049" MODIFIED="1692727125029" TEXT="verifyActivity_Gate">
<node COLOR="#338800" CREATED="1689199390484" FOLDED="true" ID="ID_212018049" MODIFIED="1701984590792" TEXT="verifyActivity_Gate">
<linktarget COLOR="#2c8d69" DESTINATION="ID_212018049" ENDARROW="Default" ENDINCLINATION="556;74;" ID="Arrow_ID_1693904148" SOURCE="ID_1220469732" STARTARROW="None" STARTINCLINATION="472;34;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1692723178576" ID="ID_214653366" MODIFIED="1692726894947" TEXT="pass">
@ -90027,6 +90038,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1692723183479" ID="ID_785522791" MODIFIED="1692726896672" TEXT="block">
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1701984639575" ID="ID_1360004322" MODIFIED="1701987034971" TEXT="Verhalten ge&#xe4;ndert: sperrt lediglich">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Weitere Beobachtungen im Scheduler ergaben, da&#223; das <i>polling</i>&#160; tats&#228;chlich gef&#228;hrlichen Overhead produziert; zudem ist es nach aktuellem Stand <i>grunds&#228;tzlich nicht notwendig, </i>da alle Gate-&#196;nderungen per Notification kommen (und dann direkt durchsteuern k&#246;nnen)
</p>
</body>
</html></richcontent>
<linktarget COLOR="#5a1f28" DESTINATION="ID_1360004322" ENDARROW="Default" ENDINCLINATION="250;-608;" ID="Arrow_ID_1804880639" SOURCE="ID_533015811" STARTARROW="Default" STARTINCLINATION="641;48;"/>
<icon BUILTIN="button_cancel"/>
</node>
</node>
<node COLOR="#338800" CREATED="1692723186655" ID="ID_343855322" MODIFIED="1692726899386" TEXT="opened">
<icon BUILTIN="button_ok"/>
@ -95908,7 +95931,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701906066106" ID="ID_424174148" MODIFIED="1701906077289" TEXT="Scheduler-Funktionstest">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701906105012" ID="ID_729619994" MODIFIED="1701906725490" TEXT="TestChainLoad entwickeln">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701906105012" ID="ID_729619994" LINK="#ID_1544079509" MODIFIED="1701980947285" TEXT="TestChainLoad entwickeln">
<icon BUILTIN="pencil"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1701906154358" ID="ID_439708583" MODIFIED="1701906163997" TEXT="einfacher Funktionstest">
@ -95916,15 +95939,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1701906177051" ID="ID_471638542" MODIFIED="1701906193332" TEXT="grunds&#xe4;tzlich: Scheduling + Lebenszyklus funktioniert">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701906207551" ID="ID_871293537" MODIFIED="1701906232476" TEXT="Problem Gate-Reschedule">
<node COLOR="#435e98" CREATED="1701906207551" ID="ID_871293537" MODIFIED="1701987912416" TEXT="Problem Gate-Reschedule">
<icon BUILTIN="broken-line"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701906235780" ID="ID_592712385" MODIFIED="1701906357352" TEXT="erzeugt zus&#xe4;tzliche unn&#xf6;tige Last">
<arrowlink COLOR="#803055" DESTINATION="ID_151250915" ENDARROW="Default" ENDINCLINATION="36;-166;" ID="Arrow_ID_59026636" STARTARROW="None" STARTINCLINATION="372;30;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1701906369489" ID="ID_481308712" MODIFIED="1701906446732" TEXT="Feature zur&#xfc;ckbauen">
<arrowlink COLOR="#7f2e8d" DESTINATION="ID_441526961" ENDARROW="Default" ENDINCLINATION="-237;-146;" ID="Arrow_ID_888469229" STARTARROW="None" STARTINCLINATION="-914;101;"/>
<icon BUILTIN="hourglass"/>
<node COLOR="#338800" CREATED="1701906369489" ID="ID_481308712" MODIFIED="1701988171195" TEXT="Feature zur&#xfc;ckbauen">
<arrowlink COLOR="#2e6a8d" DESTINATION="ID_441526961" ENDARROW="Default" ENDINCLINATION="-569;-456;" ID="Arrow_ID_888469229" STARTARROW="None" STARTINCLINATION="-914;101;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1701906481921" ID="ID_898143170" MODIFIED="1701978733301" TEXT="ignite() / Hochfahren unzuverl&#xe4;ssig">
@ -101485,13 +101508,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701881202174" ID="ID_1765434890" MODIFIED="1701881210203" TEXT="das ist der aktive Dependency-Wait">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1701881769919" ID="ID_151250915" MODIFIED="1701906357352" TEXT="das werden sukzessive immer mehr">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701881769919" ID="ID_151250915" MODIFIED="1701988039887" TEXT="das werden sukzessive immer mehr">
<linktarget COLOR="#803055" DESTINATION="ID_151250915" ENDARROW="Default" ENDINCLINATION="36;-166;" ID="Arrow_ID_59026636" SOURCE="ID_592712385" STARTARROW="None" STARTINCLINATION="372;30;"/>
<icon BUILTIN="clanbomber"/>
<node CREATED="1701881804925" ID="ID_747214446" MODIFIED="1701881818175" TEXT="sie werden dann zwar immer hinter die &#xbb;hei&#xdf;en&#xab; Jobs verschoben"/>
<node CREATED="1701881818739" ID="ID_610188573" MODIFIED="1701881833464" TEXT="aber die Abarbeitung bindet dort Kapazit&#xe4;t"/>
</node>
<node CREATED="1701881211253" ID="ID_1126056119" MODIFIED="1701881790492" TEXT="&#x27f9; zeigt nochmal, da&#xdf; wir den (aktuell) nicht brauchen">
<arrowlink COLOR="#fd2951" DESTINATION="ID_1419536205" ENDARROW="Default" ENDINCLINATION="384;-33;" ID="Arrow_ID_676818938" STARTARROW="None" STARTINCLINATION="-211;12;"/>
<node COLOR="#435e98" CREATED="1701881211253" ID="ID_1126056119" MODIFIED="1701988027249" TEXT="&#x27f9; zeigt nochmal, da&#xdf; wir den Re-Schedule (aktuell) nicht brauchen">
<arrowlink COLOR="#2985fd" DESTINATION="ID_1419536205" ENDARROW="Default" ENDINCLINATION="384;-33;" ID="Arrow_ID_676818938" STARTARROW="None" STARTINCLINATION="-305;13;"/>
</node>
</node>
</node>
@ -101549,6 +101573,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1701976654013" ID="ID_802885873" LINK="#ID_1311823420" MODIFIED="1701978114323" TEXT="soweit ich nun sehen kann: Scheduling + Kapazit&#xe4;ts-Steuerung funkioniert sauber">
<linktarget COLOR="#6478c8" DESTINATION="ID_802885873" ENDARROW="Default" ENDINCLINATION="36;-60;" ID="Arrow_ID_676956631" SOURCE="ID_1657524395" STARTARROW="None" STARTINCLINATION="-30;44;"/>
<icon BUILTIN="ksmiletris"/>
<node COLOR="#435e98" CREATED="1701988308352" ID="ID_1470787845" MODIFIED="1701988376758" TEXT="nach R&#xfc;ckbau Gate-reschedule: gar keine Aktivierungen mehr vor dem 1.Tick">
<linktarget COLOR="#87a2c3" DESTINATION="ID_1470787845" ENDARROW="Default" ENDINCLINATION="-589;23;" ID="Arrow_ID_859866906" SOURCE="ID_876475062" STARTARROW="None" STARTINCLINATION="323;48;"/>
<node CREATED="1701988379490" ID="ID_1481005436" MODIFIED="1701988386817" TEXT="auf den ersten Blick &#xfc;berraschend"/>
<node COLOR="#338800" CREATED="1701988387361" ID="ID_1837846683" LINK="#ID_1311823420" MODIFIED="1701988415752" TEXT="works as designed">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
<node COLOR="#338800" CREATED="1701988452465" ID="ID_1888744514" MODIFIED="1701988727574" TEXT="doch angepa&#xdf;t">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
das ist zwar logisch, erscheint mir aber dennoch nicht <i>&#187;zielf&#252;hrend&#171;&#160; &#8212; </i>daher eine Anpassung des Standard-Verhaltens, so da&#223; der erste Tick schneller erfolgt
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#5fb119" DESTINATION="ID_207157868" ENDARROW="Default" ENDINCLINATION="120;6;" ID="Arrow_ID_1550924182" STARTARROW="None" STARTINCLINATION="458;59;"/>
<arrowlink COLOR="#648792" DESTINATION="ID_430095540" ENDARROW="Default" ENDINCLINATION="1364;-167;" ID="Arrow_ID_1412593575" STARTARROW="None" STARTINCLINATION="-219;29;"/>
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1701912974750" ID="ID_1155210741" MODIFIED="1701912984629" TEXT="Lauf endet zu fr&#xfc;h">
<icon BUILTIN="broken-line"/>
@ -101687,7 +101731,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<node CREATED="1701977495476" ID="ID_1672299096" MODIFIED="1701978187469" TEXT="Genauigkeit f&#xfc;r die ersten Jobs ist limitiert">
<linktarget COLOR="#6b768b" DESTINATION="ID_1672299096" ENDARROW="Default" ENDINCLINATION="1783;-96;" ID="Arrow_ID_397737048" SOURCE="ID_18962140" STARTARROW="None" STARTINCLINATION="-625;41;"/>
<node CREATED="1701978229129" ID="ID_430095540" MODIFIED="1701978253938" TEXT="1.Fenster ~ 5ms (2-7ms)"/>
<node CREATED="1701978229129" ID="ID_430095540" MODIFIED="1701978253938" TEXT="1.Fenster ~ 5ms (2-7ms)">
<linktarget COLOR="#648792" DESTINATION="ID_430095540" ENDARROW="Default" ENDINCLINATION="1364;-167;" ID="Arrow_ID_1412593575" SOURCE="ID_1888744514" STARTARROW="None" STARTINCLINATION="-219;29;"/>
</node>
<node CREATED="1701978275403" ID="ID_743131147" MODIFIED="1701978364723" TEXT="weitere Fenster: N&#xb7;SLEEP_HORIZON + WORK_HORIZON"/>
<node CREATED="1701978370646" ID="ID_197187391" MODIFIED="1701978382001" TEXT="sonst: bis zu 15ms Vers&#xe4;umnis m&#xf6;glich"/>
</node>
@ -102755,22 +102801,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693499916691" ID="ID_1453759334" MODIFIED="1693499934621" TEXT="zu &#xfc;berpr&#xfc;fen">
<icon BUILTIN="stop"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1693499718350" ID="ID_1514365592" MODIFIED="1693501314685" TEXT="mu&#xdf; sich das Gate selbst re-triggern?">
<arrowlink COLOR="#9671cb" DESTINATION="ID_1878976712" ENDARROW="Default" ENDINCLINATION="-1051;64;" ID="Arrow_ID_1465904567" STARTARROW="None" STARTINCLINATION="624;46;"/>
<node COLOR="#435e98" CREATED="1693499718350" ID="ID_1514365592" MODIFIED="1701988213814" TEXT="mu&#xdf; sich das Gate selbst re-triggern?">
<arrowlink COLOR="#717ecb" DESTINATION="ID_1878976712" ENDARROW="Default" ENDINCLINATION="-1051;64;" ID="Arrow_ID_1465904567" STARTARROW="None" STARTINCLINATION="624;46;"/>
<icon BUILTIN="help"/>
<node CREATED="1701881472367" HGAP="51" ID="ID_781800145" LINK="#ID_1173195975" MODIFIED="1701881532578" TEXT="Beobachtungen bei Integrationstest" VSHIFT="-3">
<node CREATED="1701881485084" ID="ID_489329965" MODIFIED="1701881495050" TEXT="vers&#xe4;umte Dependencies"/>
<node CREATED="1701881495512" ID="ID_493533202" MODIFIED="1701881503806" TEXT="verursachen viel re-Scheduling"/>
<node CREATED="1701881504453" ID="ID_140918266" MODIFIED="1701881508775" TEXT="kommen nie zum Zug"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1701881732254" HGAP="34" ID="ID_1419536205" MODIFIED="1701881866754" TEXT="st&#xf6;rt die Kapazit&#xe4;tssteuerung">
<linktarget COLOR="#fd2951" DESTINATION="ID_1419536205" ENDARROW="Default" ENDINCLINATION="384;-33;" ID="Arrow_ID_676818938" SOURCE="ID_1126056119" STARTARROW="None" STARTINCLINATION="-211;12;"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701881732254" HGAP="34" ID="ID_1419536205" MODIFIED="1701988020039" TEXT="st&#xf6;rt die Kapazit&#xe4;tssteuerung">
<linktarget COLOR="#2985fd" DESTINATION="ID_1419536205" ENDARROW="Default" ENDINCLINATION="384;-33;" ID="Arrow_ID_676818938" SOURCE="ID_1126056119" STARTARROW="None" STARTINCLINATION="-305;13;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1701881918852" ID="ID_1586334243" MODIFIED="1701881934143" TEXT="diese re-Schedules bleiben bis zur Deadline am Leben"/>
<node CREATED="1701882125719" ID="ID_819275916" MODIFIED="1701882163401" TEXT="re-Schedule derzeit konfiguriert auf 1ms (POLL_WAIT_DELAY)"/>
<node CREATED="1701882199696" ID="ID_978437089" MODIFIED="1701882219601" TEXT="realistische Deadlines liegen im Bereich 10..100ms"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701882221309" ID="ID_1636417837" MODIFIED="1701882277390" TEXT="gef&#xe4;hrlich oft unn&#xf6;tige Aufrufe">
<icon BUILTIN="broken-line"/>
<node COLOR="#435e98" CREATED="1701988235325" HGAP="23" ID="ID_876475062" MODIFIED="1701988370081" TEXT="jetzt nicht mehr" VSHIFT="3">
<arrowlink COLOR="#87a2c3" DESTINATION="ID_1470787845" ENDARROW="Default" ENDINCLINATION="-589;23;" ID="Arrow_ID_859866906" STARTARROW="None" STARTINCLINATION="323;48;"/>
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node CREATED="1701882279733" ID="ID_806964435" MODIFIED="1701882314270" TEXT="t&#xe4;uscht einen falschen Fokus vor">
<icon BUILTIN="messagebox_warning"/>
@ -102779,9 +102829,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701882361576" ID="ID_1442219035" MODIFIED="1701882370437" TEXT="erzeugt Contention"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701882376639" ID="ID_441526961" MODIFIED="1701906446732" TEXT="Fazit: Feature zur&#xfc;ckbauen">
<linktarget COLOR="#7f2e8d" DESTINATION="ID_441526961" ENDARROW="Default" ENDINCLINATION="-237;-146;" ID="Arrow_ID_888469229" SOURCE="ID_481308712" STARTARROW="None" STARTINCLINATION="-914;101;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1701882376639" ID="ID_441526961" MODIFIED="1701988198479" TEXT="Fazit: Feature zur&#xfc;ckbauen">
<arrowlink COLOR="#3bb887" DESTINATION="ID_533015811" ENDARROW="Default" ENDINCLINATION="138;478;" ID="Arrow_ID_668218713" STARTARROW="None" STARTINCLINATION="633;-427;"/>
<linktarget COLOR="#2e6a8d" DESTINATION="ID_441526961" ENDARROW="Default" ENDINCLINATION="-569;-456;" ID="Arrow_ID_888469229" SOURCE="ID_481308712" STARTARROW="None" STARTINCLINATION="-914;101;"/>
<icon BUILTIN="yes"/>
<node CREATED="1701987112212" ID="ID_1919183787" MODIFIED="1701987129985" TEXT="es &#xe4;ndert sich nur punktuell die Logik im Activity::GATE"/>
<node CREATED="1701987130575" ID="ID_223494117" MODIFIED="1701987168316" TEXT="der executionCtx.waitDelay() bleibt bestehen (als Fallback f&#xfc;r Notification)">
<icon BUILTIN="bell"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1701882467764" ID="ID_694134930" MODIFIED="1701882478850" TEXT="Umgang mit vers&#xe4;umten Dependencies">