Scheduler: start and shutdown implemented and demonstrated in test

- An important step towards a complete »Scheduler Service«
- Correct timing pattern could be verified in detail by tracing
- Spurred some further concept and design work regarding Load-control
This commit is contained in:
Fischlurch 2023-10-29 20:06:41 +01:00
parent 8505059476
commit 22b4a9e4b2
6 changed files with 438 additions and 205 deletions

View file

@ -21,35 +21,29 @@
* *****************************************************/
/** @file activity-lang.cpp
** Implementation details of the scheduler activity language framework.
**
** @todo WIP-WIP-WIP 8/2023 »Playback Vertical Slice«
**
** Supporting implementation for the scheduler activity language framework.
** @note most of the language processing is defined as inline functions
** and uses fixed-size data storage in a dedicated custom allocator.
** Timing measurements confirmed the benefits, reducing invocations
** from ~50µs to <5µs in optimised mode, and this indeed matters,
** as the scheduler can be considered performance sensitive code.
*/
#include "vault/gear/activity-lang.hpp"
//#include "lib/symbol.hpp"
//#include "include/logging.h"
#include "lib/format-obj.hpp"
#include <string>
using std::string;
//using util::isnil;
using lib::time::Time;
using lib::time::TimeValue;
namespace vault{
namespace gear {
namespace { // internal details
} // internal details
namespace activity {
Hook::~Hook() { } // emit VTable here...
}
@ -130,9 +124,4 @@ namespace gear {
}
/**
*/
}} // namespace vault::gear

View file

@ -158,6 +158,13 @@ namespace gear {
/////////////////////////////////////////////////////////////////////////////OOO build integrated load state
}
/** statistics update on scaling down the WorkForce */
void
markWorkerExit()
{
///////do something deeply moving
}
/**
* did we already tend for the indicated next relevant head time?
* @note const and non-grooming

View file

@ -1,68 +0,0 @@
/*
Scheduler - coordination of render activities under timing and dependency constraints
Copyright (C) Lumiera.org
2023, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
/** @file scheduler.cpp
** Implementation of messaging, dispatch and prioritisation of render activities.
** The _scheduling_ functionality is assembled from low-level operational building blocks.
**
** @note as of X/2023 this is complete bs
** @todo WIP ///////////////////////TICKET #
**
** @see ////TODO_test usage example
** @see scheduler.cpp implementation
**
** @todo WIP-WIP-WIP 6/2023 »Playback Vertical Slice«
**
*/
#include "vault/gear/scheduler.hpp"
//#include "lib/symbol.hpp"
//#include "include/logging.h"
//#include <string>
//using std::string;
//using util::isnil;
namespace vault{
namespace gear {
namespace { // internal details
} // internal details
namespace activity {
Hook::~Hook() { } // emit VTable here...
}
// NA::~NA() { }
/**
*/
}} // namespace vault::gear

View file

@ -186,22 +186,28 @@ namespace gear {
}
/**
* Spark the engine self-regulation cycle and power up WorkForce
* Spark the engine self-regulation cycle and power up WorkForce.
* @note set off automatically when [put to use](\ref #seedCalcStream);
* while active, the [duty-cycle](\ref #handleDutyCycle) retains
* itself, albeit bound to disengage when falling empty.
*/
void
ignite()
{
TRACE (engine, "Ignite Scheduler Dispatch.");
handleDutyCycle (RealClock::now());
workForce_.activate();
if (not empty())
workForce_.activate();
}
/**
* Bring down processing destructively as fast as possible.
* Dismiss worker threads as soon as possible, and clear the queues.
* @warning Currently running Activities can not be aborted, but anything
* not yet scheduled will be discarded, irrespective of dependencies
* @warning Actually running Activities can not be aborted, but anything
* not yet scheduled will be discarded, irrespective of dependencies.
* @remark should never need to call this in regular operation,
* since an empty scheduler disengages automatically.
*/
void
terminateProcessing()
@ -251,12 +257,7 @@ namespace gear {
private:
void handleDutyCycle (Time now);
void
handleWorkerTermination (bool isFailure)
{
UNIMPLEMENTED("die harder");
}
void handleWorkerTermination (bool isFailure);
void triggerEmergency();
@ -529,6 +530,19 @@ namespace gear {
}
}
/**
* Callback invoked whenever a worker-thread is about to exit
* @param isFailuere if the exit was caused by uncaught exception
*/
inline void
Scheduler::handleWorkerTermination (bool isFailure)
{
if (isFailure)
triggerEmergency();
else
loadControl_.markWorkerExit();
}
/**
* Trip the emergency brake and unwind processing while retaining all state.
*/

View file

@ -77,6 +77,7 @@ namespace test {
{
simpleUsage();
verify_StartStop();
verify_Disengage();
invokeWorkFunction();
walkingDeadline();
}
@ -95,8 +96,8 @@ namespace test {
/** @test TODO get the scheduler into running state
* @todo WIP 10/23 define 🔁 implement
/** @test get the scheduler into running state
* @todo WIP 10/23 define implement
*/
void
verify_StartStop()
@ -105,12 +106,61 @@ namespace test {
EngineObserver watch;
Scheduler scheduler{bFlow, watch};
CHECK (isnil (scheduler));
Activity dummy{uint64_t(123), uint64_t(456)};
auto postIt = [&] { auto& schedCtx = Scheduler::ExecutionCtx::from(scheduler);
schedCtx.post (RealClock::now()+t200us, &dummy, schedCtx);
};
scheduler.ignite();
CHECK (isnil (scheduler)); // no start without any post()
postIt();
scheduler.ignite();
CHECK (not isnil (scheduler));
scheduler.terminateProcessing();
CHECK (isnil (scheduler));
postIt();
postIt();
scheduler.ignite();
CHECK (not isnil (scheduler));
//... and just walk away => scheduler unwinds cleanly from destructor
}// Note: BlockFlow and WorkForce unwinding is covered in dedicated tests
/** @test TODO verify the scheduler processes and winds down automatically
* when falling empty.
* @todo WIP 10/23 define 🔁 implement
*/
void
verify_Disengage()
{
BlockFlowAlloc bFlow;
EngineObserver watch;
Scheduler scheduler{bFlow, watch};
CHECK (isnil (scheduler));
Activity dummy{uint64_t(123), uint64_t(456)};
auto postIt = [&] { auto& schedCtx = Scheduler::ExecutionCtx::from(scheduler);
schedCtx.post (RealClock::now()+t200us, &dummy, schedCtx);
};
UNIMPLEMENTED("disengage");
scheduler.ignite();
CHECK (isnil (scheduler));
postIt();
scheduler.ignite();
CHECK (not isnil (scheduler));
SHOW_EXPR(_raw(RealClock::now()))
SHOW_EXPR(_raw(scheduler.layer1_.headTime()))
scheduler.terminateProcessing();
CHECK (isnil (scheduler));
SHOW_EXPR(_raw(RealClock::now()))
}

View file

@ -80928,7 +80928,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#f72a8f" DESTINATION="ID_424129996" ENDARROW="Default" ENDINCLINATION="-365;-20;" ID="Arrow_ID_1444084792" STARTARROW="None" STARTINCLINATION="-53;219;"/>
<arrowlink COLOR="#f72a8f" DESTINATION="ID_424129996" ENDARROW="Default" ENDINCLINATION="-547;-50;" ID="Arrow_ID_1444084792" STARTARROW="None" STARTINCLINATION="-53;219;"/>
<linktarget COLOR="#a35866" DESTINATION="ID_88816908" ENDARROW="Default" ENDINCLINATION="-7;123;" ID="Arrow_ID_1622612414" SOURCE="ID_145651869" STARTARROW="None" STARTINCLINATION="487;21;"/>
<icon BUILTIN="clanbomber"/>
</node>
@ -82380,7 +82380,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
<node CREATED="1697758577471" ID="ID_805214343" MODIFIED="1697758585886" TEXT="dagegen BlockFlow ist eine externe Komponente"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697844012851" ID="ID_1020998473" MODIFIED="1697844595733" TEXT="Execution-Context tats&#xe4;chlich bereitstellen">
<node COLOR="#435e98" CREATED="1697844012851" FOLDED="true" ID="ID_1020998473" MODIFIED="1698591450293" TEXT="Execution-Context tats&#xe4;chlich bereitstellen">
<linktarget COLOR="#e6ffa8" DESTINATION="ID_1020998473" ENDARROW="Default" ENDINCLINATION="-1456;-96;" ID="Arrow_ID_1485027520" SOURCE="ID_1906823317" STARTARROW="None" STARTINCLINATION="-811;38;"/>
<icon BUILTIN="forward"/>
<node CREATED="1697844618383" ID="ID_988917685" MODIFIED="1697844647556" TEXT="f&#xfc;r den Test wurde der stets nur gemockt">
@ -82394,8 +82394,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
<node CREATED="1697844649091" ID="ID_939726274" MODIFIED="1697844696080" TEXT="als Abstraktion wurde (bewu&#xdf;t) ein Template-Parameter gew&#xe4;hlt"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1697844697092" ID="ID_766922475" MODIFIED="1697845768002" TEXT="kokretes Funktions-Binding">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1697844697092" ID="ID_766922475" MODIFIED="1698591435338" TEXT="konkretes Funktions-Binding">
<icon BUILTIN="button_ok"/>
<node CREATED="1697844724057" ID="ID_1038347556" MODIFIED="1697844734323" TEXT="wieder ein &#xe4;hnliches Problem wie bei der WorkForce-Config"/>
<node CREATED="1697844740488" ID="ID_1999540950" MODIFIED="1697844761716" TEXT="hier aber einfacher: es wird stets nur eine Referenz ben&#xf6;tigt">
<icon BUILTIN="idea"/>
@ -82431,6 +82431,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
</node>
<node COLOR="#338800" CREATED="1698591423354" ID="ID_1641227911" MODIFIED="1698591431981" TEXT="funktioniert tats&#xe4;chlich">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1697929209697" FOLDED="true" ID="ID_862130924" MODIFIED="1697930318294" TEXT="wozu braucht &#x3bb;-post den ExecutionCtx(parameter)?">
<icon BUILTIN="button_cancel"/>
@ -82681,12 +82684,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-pink"/>
<node CREATED="1697933830568" ID="ID_425307167" MODIFIED="1697933841004" TEXT="Anforderung">
<icon BUILTIN="yes"/>
<node CREATED="1697933847838" ID="ID_52485323" MODIFIED="1697933874566" TEXT="wenn Activities anstehen, mu&#xdf; der Scheduler laufen">
<node COLOR="#435e98" CREATED="1697933847838" ID="ID_52485323" MODIFIED="1698592287031" TEXT="wenn Activities anstehen, mu&#xdf; der Scheduler laufen">
<node CREATED="1697935493785" ID="ID_1808648428" MODIFIED="1697935513050" TEXT="der initiale Z&#xfc;nd-Impuls daf&#xfc;r mu&#xdf; von au&#xdf;en kommen"/>
<node CREATED="1697935584350" ID="ID_1788226279" MODIFIED="1697935603608" TEXT="sobald er l&#xe4;uft, mu&#xdf; er auch seinen eigenen &#xbb;Tick&#xab; aktivieren"/>
</node>
<node CREATED="1697934020751" ID="ID_1139695361" MODIFIED="1697934032818" TEXT="wenn nichts mehr passiert, kann er sich deaktivieren">
<node CREATED="1697935611257" ID="ID_436115424" MODIFIED="1697935652768" TEXT="zun&#xe4;chst werden die Worker schlafen geschickt">
<node COLOR="#435e98" CREATED="1697934020751" FOLDED="true" ID="ID_1139695361" MODIFIED="1698592302604" TEXT="wenn nichts mehr passiert, kann er sich deaktivieren">
<node COLOR="#338800" CREATED="1697935611257" ID="ID_436115424" MODIFIED="1698591797688" TEXT="zun&#xe4;chst werden die Worker schlafen geschickt">
<icon BUILTIN="button_ok"/>
<node CREATED="1697935685080" ID="ID_1125666331" MODIFIED="1698079245795" TEXT="Vorsicht: vorausschauend handeln">
<icon BUILTIN="yes"/>
</node>
@ -82700,15 +82704,28 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1697935831136" ID="ID_328104821" MODIFIED="1697935849059" TEXT="polling workers stellen aber selbst eine Belastung dar">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697935831136" ID="ID_328104821" MODIFIED="1698591669794" TEXT="polling workers stellen aber selbst eine Belastung dar">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1697938335223" ID="ID_490005829" MODIFIED="1697938354584" TEXT="und zwar wegen Contention und generellen OS-Resourcen"/>
<node CREATED="1697938355148" ID="ID_1006912313" MODIFIED="1697938372181" TEXT="aber nicht kurzzeitig &#x2014; daf&#xfc;r sind die Worker ja da"/>
<node CREATED="1698591580181" ID="ID_1995552985" MODIFIED="1698591724502">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
bedeutet &#10233; ein <i>momentan </i>nicht ben&#246;tigter Worker <font color="#161699">darf duchaus mal 200&#181;s schlafen</font>
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#949caf" DESTINATION="ID_1878267826" ENDARROW="Default" ENDINCLINATION="27;-65;" ID="Arrow_ID_150643318" STARTARROW="None" STARTINCLINATION="-182;6;"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697935894004" ID="ID_1878267826" MODIFIED="1697935929293" TEXT="&#x27f9; mu&#xdf; also eine explizite Verz&#xf6;gerung einbauen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697938430466" ID="ID_1280875799" MODIFIED="1697941924835" TEXT="Stufen-Schema">
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1697935894004" ID="ID_1878267826" MODIFIED="1698591764257" TEXT="&#x27f9; kann also eine &#xbb;gezielte Verz&#xf6;gerung&#xab; einbauen">
<linktarget COLOR="#949caf" DESTINATION="ID_1878267826" ENDARROW="Default" ENDINCLINATION="27;-65;" ID="Arrow_ID_150643318" SOURCE="ID_1995552985" STARTARROW="None" STARTINCLINATION="-182;6;"/>
<node COLOR="#435e98" CREATED="1697938430466" ID="ID_1280875799" MODIFIED="1698591781723" TEXT="Stufen-Schema">
<linktarget COLOR="#7f95ab" DESTINATION="ID_1280875799" ENDARROW="Default" ENDINCLINATION="10;121;" ID="Arrow_ID_1356077365" SOURCE="ID_1342732339" STARTARROW="None" STARTINCLINATION="284;21;"/>
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="list"/>
<node CREATED="1697938486782" ID="ID_1684596361" MODIFIED="1697938500100" TEXT="kurzfristig &#x27f6; yield-wait"/>
<node CREATED="1697938912817" ID="ID_1435841099" MODIFIED="1697938952106" TEXT="zeitnah &#x27f6; gezielte Pause">
<node CREATED="1697939077160" ID="ID_1342346924" MODIFIED="1697939096276" TEXT="ein Thread-sleep in der Work-Function"/>
@ -82716,14 +82733,16 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697939007756" ID="ID_1814410393" MODIFIED="1697939068200" TEXT="idle-Time &#x27f6; schlafen schicken"/>
</node>
<node CREATED="1698079285650" ID="ID_1194794962" MODIFIED="1698079299495" TEXT="freie Kapazit&#xe4;t &#x201e;flie&#xdf;t&#x201c;">
<node CREATED="1698079285650" ID="ID_1194794962" MODIFIED="1698591930089" TEXT="freie Kapazit&#xe4;t &#x201e;flie&#xdf;t&#x201c;">
<arrowlink COLOR="#6e86a3" DESTINATION="ID_1003033592" ENDARROW="Default" ENDINCLINATION="269;-465;" ID="Arrow_ID_17847755" STARTARROW="None" STARTINCLINATION="-268;33;"/>
<node CREATED="1698079326197" ID="ID_1517718994" MODIFIED="1698079334136" TEXT="ein Teil setzt sich ab"/>
<node CREATED="1698079334681" ID="ID_1880078243" MODIFIED="1698079345414" TEXT="aber auch von den Schl&#xe4;fern gibt es einen R&#xfc;ckstrom"/>
<node CREATED="1698079346272" ID="ID_1708377480" MODIFIED="1698079371100" TEXT="Konzentration je nach Arbeitsdichte"/>
</node>
</node>
</node>
<node CREATED="1697935657451" ID="ID_1200603474" MODIFIED="1697935676437" TEXT="diese beenden sich dann nach einiger Zeit von selbst">
<node COLOR="#338800" CREATED="1697935657451" ID="ID_1200603474" MODIFIED="1698592239675" TEXT="diese beenden sich dann nach einiger Zeit von selbst">
<icon BUILTIN="button_ok"/>
<node CREATED="1697936056094" ID="ID_1569058603" MODIFIED="1697936822180" TEXT="Scheduler mu&#xdf; daf&#xfc;r sorgen, da&#xdf; das auch m&#xf6;glich wird">
<richcontent TYPE="NOTE"><html>
<head/>
@ -82758,10 +82777,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1697936154433" ID="ID_1597069116" MODIFIED="1697936164028" TEXT="schlie&#xdf;lich bleibt nur noch der Tick &#xfc;brig">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697936179454" ID="ID_446529044" MODIFIED="1697936204128" TEXT="der Tick mu&#xdf; erkennen, da&#xdf; allein auf der Welt ist">
<node COLOR="#338800" CREATED="1697936154433" ID="ID_1597069116" MODIFIED="1698592272887" TEXT="schlie&#xdf;lich bleibt nur noch der Tick &#xfc;brig">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1697936179454" ID="ID_446529044" MODIFIED="1698592226617" TEXT="der Tick mu&#xdf; erkennen, da&#xdf; allein auf der Welt ist">
<arrowlink COLOR="#4885aa" DESTINATION="ID_191013179" ENDARROW="Default" ENDINCLINATION="-9;-192;" ID="Arrow_ID_1602192304" STARTARROW="None" STARTINCLINATION="169;410;"/>
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1697936205251" ID="ID_131464995" MODIFIED="1697936223185" TEXT="das ist so nicht offensichtlich">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697936205251" ID="ID_131464995" MODIFIED="1698591975161" TEXT="das ist so nicht offensichtlich">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1697936244473" ID="ID_671338782" MODIFIED="1697936373448" TEXT="der Tick kann feststellen, da&#xdf; nur er selber als n&#xe4;chstes ansteht">
@ -82769,6 +82790,20 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="idea"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1698592246469" ID="ID_521847725" MODIFIED="1698592271417">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
wenn sich der Tick nicht mehr erneuert,
</p>
<p>
ist der Scheduler stehen geblieben
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node CREATED="1697935467508" ID="ID_370682037" MODIFIED="1697935479215" TEXT="Reserve-Kapazit&#xe4;t bei Bedarf aktivieren">
@ -82850,6 +82885,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1698591834291" ID="ID_1003033592" MODIFIED="1698591949478" STYLE="bubble" TEXT="Freie Kapazit&#xe4;t &#xbb;flie&#xdf;t&#xab;">
<linktarget COLOR="#6e86a3" DESTINATION="ID_1003033592" ENDARROW="Default" ENDINCLINATION="269;-465;" ID="Arrow_ID_17847755" SOURCE="ID_1194794962" STARTARROW="None" STARTINCLINATION="-268;33;"/>
<font NAME="SansSerif" SIZE="16"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697940307771" ID="ID_844059029" MODIFIED="1697940319855" TEXT="Regulierungs-Schema (1.Wurf)">
<icon BUILTIN="flag-yellow"/>
@ -83330,17 +83369,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698159441179" ID="ID_486995126" MODIFIED="1698523800078" TEXT="Scheduler-Tick">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698159441179" ID="ID_486995126" MODIFIED="1698605578216" TEXT="Scheduler-Tick">
<linktarget COLOR="#fffcc5" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="579;-95;" ID="Arrow_ID_1801107947" SOURCE="ID_671338782" STARTARROW="None" STARTINCLINATION="292;11;"/>
<linktarget COLOR="#994d72" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="-91;14;" ID="Arrow_ID_973238030" SOURCE="ID_1391329454" STARTARROW="None" STARTINCLINATION="71;5;"/>
<linktarget COLOR="#4f89b7" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="232;35;" ID="Arrow_ID_1502519432" SOURCE="ID_1247362696" STARTARROW="None" STARTINCLINATION="108;-12;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698523819504" HGAP="114" ID="ID_1592332331" MODIFIED="1698523829332" TEXT="Rahmen schaffen" VSHIFT="8">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1698524392305" ID="ID_1232693946" MODIFIED="1698524394773" TEXT="handleDutyCycle()"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698532933228" ID="ID_1847975334" MODIFIED="1698532967908" TEXT="Periode und Deadline f&#xfc;r Ticks">
<linktarget COLOR="#f03375" DESTINATION="ID_1847975334" ENDARROW="Default" ENDINCLINATION="-449;34;" ID="Arrow_ID_1046093983" SOURCE="ID_233989928" STARTARROW="None" STARTINCLINATION="222;-17;"/>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1698523819504" HGAP="114" ID="ID_1592332331" MODIFIED="1698605640201" TEXT="Rahmen schaffen" VSHIFT="8">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698524392305" ID="ID_1232693946" MODIFIED="1698605649969" TEXT="handleDutyCycle()">
<icon BUILTIN="info"/>
</node>
<node COLOR="#338800" CREATED="1698532933228" ID="ID_1847975334" MODIFIED="1698605594973" TEXT="Periode und Deadline f&#xfc;r Ticks">
<linktarget COLOR="#3364f0" DESTINATION="ID_1847975334" ENDARROW="Default" ENDINCLINATION="-449;34;" ID="Arrow_ID_1046093983" SOURCE="ID_233989928" STARTARROW="None" STARTINCLINATION="222;-17;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1698534503171" ID="ID_1796088889" MODIFIED="1698540893762" TEXT="wo (vor)konfiguriert?">
<icon BUILTIN="help"/>
<node CREATED="1698540895030" ID="ID_111536775" MODIFIED="1698540902950" TEXT="scheduler.hpp"/>
@ -83354,8 +83395,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698523868063" HGAP="124" ID="ID_26600563" MODIFIED="1698523884552" TEXT="Selbst-&#xdc;berwachung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698523868063" HGAP="124" ID="ID_26600563" MODIFIED="1698605584160" TEXT="Selbst-&#xdc;berwachung">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698534832254" ID="ID_1414543996" MODIFIED="1698534887888" TEXT="Plan: der DutyCycle ist Status-Asessment">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1698534900965" ID="ID_488282572" MODIFIED="1698534907381" TEXT="er ist idempotent"/>
@ -83404,6 +83445,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#9e4279" DESTINATION="ID_1011726550" ENDARROW="Default" ENDINCLINATION="235;181;" ID="Arrow_ID_1299019434" STARTARROW="None" STARTINCLINATION="425;-47;"/>
<icon BUILTIN="hourglass"/>
</node>
<node COLOR="#338800" CREATED="1698592008108" ID="ID_191013179" MODIFIED="1698592226617" TEXT="bei Leerlauf: Scheduler deaktivieren">
<arrowlink COLOR="#3e9b94" DESTINATION="ID_202320750" ENDARROW="Default" ENDINCLINATION="-1156;-61;" ID="Arrow_ID_727945119" STARTARROW="None" STARTINCLINATION="61;1261;"/>
<linktarget COLOR="#4885aa" DESTINATION="ID_191013179" ENDARROW="Default" ENDINCLINATION="-9;-192;" ID="Arrow_ID_1602192304" SOURCE="ID_446529044" STARTARROW="None" STARTINCLINATION="169;410;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1698595424284" ID="ID_1679334387" MODIFIED="1698595479659">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
stelle fest: das wirkt (unbeabsichtigterweise) auch als <b>Z&#252;nd-Barriere</b>
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698595445913" ID="ID_284194667" MODIFIED="1698605519364" TEXT="man mu&#xdf; also stets schon etwas in die Queue geschickt haben, bevor man z&#xfc;ndet">
<arrowlink COLOR="#389bcf" DESTINATION="ID_1513214570" ENDARROW="Default" ENDINCLINATION="365;-28;" ID="Arrow_ID_554717849" STARTARROW="None" STARTINCLINATION="333;12;"/>
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698530480307" ID="ID_355476974" MODIFIED="1698541315516" TEXT="Warnung: Selbstschutz vor de-Allokation">
<arrowlink COLOR="#ff2f19" DESTINATION="ID_269636711" ENDARROW="Default" ENDINCLINATION="-577;-1106;" ID="Arrow_ID_1849442376" STARTARROW="None" STARTINCLINATION="173;762;"/>
<linktarget COLOR="#ed3471" DESTINATION="ID_355476974" ENDARROW="Default" ENDINCLINATION="-616;43;" ID="Arrow_ID_729257748" SOURCE="ID_1982008339" STARTARROW="None" STARTINCLINATION="689;49;"/>
@ -83422,6 +83483,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1698521316395" ID="ID_1194473945" MODIFIED="1698521326921" TEXT="kann im Test die Timing/Sleep-Muster zeigen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698605671588" ID="ID_1693880533" MODIFIED="1698605786967" TEXT="konnte im Start/Stop-Test explizit das Timing/Aufruf-Muster sehen">
<arrowlink COLOR="#96abb4" DESTINATION="ID_114745098" ENDARROW="Default" ENDINCLINATION="694;-113;" ID="Arrow_ID_336093338" STARTARROW="None" STARTINCLINATION="522;22;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372200013" ID="ID_1863445864" MODIFIED="1698372206543" TEXT="Scheduler start/stop">
@ -83440,10 +83505,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="idea"/>
<node CREATED="1698522320375" ID="ID_1572899444" MODIFIED="1698522328008" TEXT="solange der Tick tickt, kann er nicht leer sein"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698522456723" ID="ID_1793836905" MODIFIED="1698522465322" TEXT="Zustands&#xfc;berg&#xe4;nge realisieren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698522466298" ID="ID_1846809868" MODIFIED="1698522524910" TEXT="ignite() &#x27f6; Tick etablieren">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698522456723" ID="ID_1793836905" MODIFIED="1698605370497" TEXT="Zustands&#xfc;berg&#xe4;nge realisieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698522466298" ID="ID_1846809868" MODIFIED="1698604976684" TEXT="ignite() &#x27f6; Tick etablieren">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1698523669922" HGAP="21" ID="ID_1926013578" MODIFIED="1698545591203" TEXT="ggfs. internen Reset?" VSHIFT="-14">
<arrowlink COLOR="#ecfdbe" DESTINATION="ID_1951108355" ENDARROW="Default" ENDINCLINATION="-66;-3;" ID="Arrow_ID_632624217" STARTARROW="None" STARTINCLINATION="16;2;"/>
<icon BUILTIN="help"/>
@ -83459,23 +83524,24 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698523685888" ID="ID_993061444" MODIFIED="1698523699870" TEXT="die WorkForce starten">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698523685888" ID="ID_993061444" MODIFIED="1698605364232" TEXT="die WorkForce starten">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698523713636" ID="ID_1082114161" MODIFIED="1698523721739" TEXT="hier k&#xf6;nnte man schrittweise vorgehen">
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698523722518" ID="ID_153443695" MODIFIED="1698523747167" TEXT="vorerst aber starten wir sofort mit Maximal-Leistung">
<node BACKGROUND_COLOR="#d4c1ad" COLOR="#990000" CREATED="1698523722518" ID="ID_153443695" MODIFIED="1698605359529" TEXT="vorerst aber starten wir sofort mit Maximal-Leistung">
<arrowlink COLOR="#8a8699" DESTINATION="ID_174276213" ENDARROW="Default" ENDINCLINATION="-1083;-69;" ID="Arrow_ID_1348822312" STARTARROW="None" STARTINCLINATION="617;33;"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1698523751770" ID="ID_903457471" MODIFIED="1698523767446" TEXT="(WorkForce wird sich selbst nach 2sec herunterregeln)"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698522492081" ID="ID_1777263362" MODIFIED="1698522515173" TEXT="terminateProcessing &#xd83e;&#xdc32; Gewalt!">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698522970735" ID="ID_728729079" MODIFIED="1698523703142" TEXT="die WorkForce kalt machen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698522492081" ID="ID_1777263362" MODIFIED="1698604971384" TEXT="terminateProcessing &#xd83e;&#xdc32; Gewalt!">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698522970735" ID="ID_728729079" MODIFIED="1698592324950" TEXT="die WorkForce kalt machen">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1698522979070" ID="ID_27890829" MODIFIED="1698523707098" TEXT="der Destruktor wartet">
<node COLOR="#435e98" CREATED="1698522979070" ID="ID_27890829" MODIFIED="1698592326794" TEXT="der Destruktor wartet vor der Tür...">
<icon BUILTIN="idea"/>
<node CREATED="1698523569872" ID="ID_158276586" MODIFIED="1698523584913" TEXT="die Selbstmord-Flag wurde gesetzt"/>
<node CREATED="1698523585621" ID="ID_896793694" MODIFIED="1698523606526" TEXT="Worker sterben sobald sie zur&#xfc;ckkommen"/>
@ -83483,8 +83549,33 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="clanbomber"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698522985869" ID="ID_319295239" MODIFIED="1698523708965" TEXT="danach die Queue leeren">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698522985869" ID="ID_319295239" MODIFIED="1698605559677" TEXT="danach die Queue leeren">
<arrowlink COLOR="#4d8aab" DESTINATION="ID_1362227170" ENDARROW="Default" ENDINCLINATION="715;-39;" ID="Arrow_ID_940715985" STARTARROW="None" STARTINCLINATION="229;23;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1698604835846" ID="ID_581650151" MODIFIED="1698604964634" TEXT="nebenbei explizit verifiziert">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
hab mir den jeweiligen Quellcode angeschaut und keine Probleme gesehen
</li>
<li>
auch auf Stackoverflow gibt es Hinweise, da&#223; das so gehen soll (obwohl es kein richtiges API daf&#252;r gibt)
</li>
<li>
Timing-Messungen zeigen: braucht 100&#181;s
</li>
<li>
danach kommt die gleiche Scheduler-Instanz wieder auf die Beine und verh&#228;lt sich unauff&#228;llig.
</li>
<li>
auch ist der erneute Start nicht feststellbar langsamer; das Hochfahren der WorkForce braucht ohnehin 1ms
</li>
</ul>
</body>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698523062280" ID="ID_1393673316" MODIFIED="1698523095951" TEXT="BlockFlow besser nicht anfassen">
<icon BUILTIN="messagebox_warning"/>
@ -83507,7 +83598,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698532728431" ID="ID_233989928" MODIFIED="1698532974876" TEXT="mit Tick und Allokation integrieren">
<arrowlink COLOR="#f03375" DESTINATION="ID_1847975334" ENDARROW="Default" ENDINCLINATION="-449;34;" ID="Arrow_ID_1046093983" STARTARROW="None" STARTINCLINATION="222;-17;"/>
<arrowlink COLOR="#3364f0" DESTINATION="ID_1847975334" ENDARROW="Default" ENDINCLINATION="-449;34;" ID="Arrow_ID_1046093983" STARTARROW="None" STARTINCLINATION="222;-17;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698532793030" ID="ID_696019318" MODIFIED="1698533136478" TEXT="verbindliche Tasks erm&#xf6;glichen">
@ -83519,8 +83610,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698533674384" ID="ID_1227874220" MODIFIED="1698534658603" TEXT="Scheduler-Emergency vorsehen">
<arrowlink COLOR="#ea5540" DESTINATION="ID_1515660165" ENDARROW="Default" ENDINCLINATION="-1517;105;" ID="Arrow_ID_1696922321" STARTARROW="None" STARTINCLINATION="912;-77;"/>
<linktarget COLOR="#d54a7e" DESTINATION="ID_1227874220" ENDARROW="Default" ENDINCLINATION="-1477;121;" ID="Arrow_ID_677451247" SOURCE="ID_748059800" STARTARROW="None" STARTINCLINATION="-536;-12;"/>
<linktarget COLOR="#9a5079" DESTINATION="ID_1227874220" ENDARROW="Default" ENDINCLINATION="133;12;" ID="Arrow_ID_967532278" SOURCE="ID_979357340" STARTARROW="None" STARTINCLINATION="241;-7;"/>
<linktarget COLOR="#d54a7e" DESTINATION="ID_1227874220" ENDARROW="Default" ENDINCLINATION="-1477;121;" ID="Arrow_ID_677451247" SOURCE="ID_748059800" STARTARROW="None" STARTINCLINATION="-536;-12;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
@ -87487,7 +87578,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="forward"/>
</node>
<node COLOR="#5b280f" CREATED="1692727511559" ID="ID_424129996" MODIFIED="1692741760893" TEXT="Nachteil: mu&#xdf; dann Mehrfach-Aktivierungen blocken">
<linktarget COLOR="#f72a8f" DESTINATION="ID_424129996" ENDARROW="Default" ENDINCLINATION="-365;-20;" ID="Arrow_ID_1444084792" SOURCE="ID_88816908" STARTARROW="None" STARTINCLINATION="-53;219;"/>
<linktarget COLOR="#f72a8f" DESTINATION="ID_424129996" ENDARROW="Default" ENDINCLINATION="-547;-50;" ID="Arrow_ID_1444084792" SOURCE="ID_88816908" STARTARROW="None" STARTINCLINATION="-53;219;"/>
<linktarget COLOR="#653694" DESTINATION="ID_424129996" ENDARROW="Default" ENDINCLINATION="-196;-12;" ID="Arrow_ID_609240876" SOURCE="ID_802575724" STARTARROW="None" STARTINCLINATION="367;18;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1692741724945" ID="ID_41961311" MODIFIED="1692741732215" TEXT="geht aber relativ einfach...."/>
@ -89006,10 +89097,182 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1698521856803" ID="ID_1548722737" MODIFIED="1698521890994" TEXT="verify_StartStop">
<node CREATED="1698521924261" ID="ID_1936048598" MODIFIED="1698521938620" TEXT="explizit in Gang setzen"/>
<node CREATED="1698521939608" ID="ID_501619176" MODIFIED="1698521945915" TEXT="sehen da&#xdf; er &#xbb;l&#xe4;uft&#xab;"/>
<node CREATED="1698521946743" ID="ID_783620032" MODIFIED="1698521949779" TEXT="wieder anhalten"/>
<node COLOR="#338800" CREATED="1698521856803" ID="ID_1548722737" MODIFIED="1698604615321" TEXT="verify_StartStop">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698592367530" ID="ID_1513214570" MODIFIED="1698605544097" TEXT="tats&#xe4;chlich Activities einplanen">
<linktarget COLOR="#389bcf" DESTINATION="ID_1513214570" ENDARROW="Default" ENDINCLINATION="365;-28;" ID="Arrow_ID_554717849" SOURCE="ID_284194667" STARTARROW="None" STARTINCLINATION="333;12;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1698595265649" HGAP="27" ID="ID_1194558258" MODIFIED="1698595394206" VSHIFT="6">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
ohne <i>das </i>wird n&#228;mlich gar kein Tick-Zyklus aufgemacht
</p>
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...da ich das handleDutyCycle eben auch zum &#8222;z&#252;nden&#8220; verwenden m&#246;chte, entsteht hier so etwas wie eine zus&#228;tzliche Z&#252;nd-Barriere; war nicht geplant, gef&#228;llt mir aber: man mu&#223; also auch Holz in den Ofen stecken, bevor man z&#252;ndet...
</p>
</body>
</html></richcontent>
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
<node COLOR="#338800" CREATED="1698521924261" ID="ID_1936048598" MODIFIED="1698596926165" TEXT="explizit in Gang setzen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698521939608" ID="ID_501619176" MODIFIED="1698596927547" TEXT="sehen da&#xdf; er &#xbb;l&#xe4;uft&#xab;">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698592367530" ID="ID_1362227170" MODIFIED="1698605559677" TEXT="wieder anhalten">
<linktarget COLOR="#4d8aab" DESTINATION="ID_1362227170" ENDARROW="Default" ENDINCLINATION="715;-39;" ID="Arrow_ID_940715985" SOURCE="ID_319295239" STARTARROW="None" STARTINCLINATION="229;23;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698592552588" HGAP="25" ID="ID_533479899" MODIFIED="1698601875401" TEXT="starten und Destruktor im laufenden Zustand aufrufen" VSHIFT="5">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1698597769948" HGAP="30" ID="ID_122236829" MODIFIED="1698597786923" TEXT="Timings beobachtet" VSHIFT="6">
<icon BUILTIN="list"/>
<node CREATED="1698598469549" ID="ID_1138554689" MODIFIED="1698600198874" TEXT="Erster Aufruf / Fehlz&#xfc;ndung: 50&#xb5;s"/>
<node CREATED="1698598501393" ID="ID_74579066" MODIFIED="1698600214538">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
Post+erfolgreiche Z&#252;ndung: <b>1ms</b>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1698598597804" ID="ID_469136225" MODIFIED="1698600221833">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
gewaltsam Angehalten: <b>60ms</b>
</p>
</body>
</html></richcontent>
<node COLOR="#435e98" CREATED="1698601411556" HGAP="71" ID="ID_1350044649" MODIFIED="1698603209784" VSHIFT="9">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<u>korrekt</u>!
</p>
<ul>
<li>
tend-next auf den Tick &#8788; 50ms
</li>
<li>
WorkForce wartet beim Shutdown pauschal 20ms (IDLE_WAIT)
</li>
</ul>
</body>
</html></richcontent>
<edge COLOR="#339fc5"/>
<font NAME="SansSerif" SIZE="10"/>
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1698598661062" ID="ID_1625946073" MODIFIED="1698598671206" TEXT="erneuter Post: 60&#xb5;s"/>
<node CREATED="1698598695895" ID="ID_746587515" MODIFIED="1698598708241" TEXT="noch &apos;n Post: 9&#xb5;s"/>
<node CREATED="1698598780502" ID="ID_97969711" MODIFIED="1698600227433">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
nochmal z&#252;nden: <b>1ms</b>
</p>
</body>
</html></richcontent>
</node>
<node COLOR="#5b280f" CREATED="1698599903981" HGAP="2" ID="ID_1418129606" MODIFIED="1698600447671" TEXT="Messungen dominiert von Cache-Effekten" VSHIFT="15">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Cache-Effekte k&#246;nnen mehrere 100&#181;s ausmchen. Dennoch ist dieses Pattern mit leichten Schwankungen reproduzierbar in vielen L&#228;ufen, und zeigt auch fast keinen Unterschied, wenn mit -O3 gebaut. Man beachte im Besonderen da&#223; bei der ersten Fehlz&#252;ndung die WorkForce nicht hochskaliert wird. Da steckt also die Zeit, und das ist auch mit dem WorkForce_test konsistent.
</p>
</body>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1698601884014" HGAP="-6" ID="ID_254540476" MODIFIED="1698601930336" STYLE="bubble" VSHIFT="7">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<b>Fazit</b>: Verhalten wie erwartet
</p>
</body>
</html></richcontent>
<icon BUILTIN="forward"/>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1698601933709" HGAP="25" ID="ID_114745098" MODIFIED="1698605786967" VSHIFT="2">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<ul>
<li>
der erste gestartete Thread macht alle Dispaches in Serie
</li>
<li>
danach wird er per tendNext gezielt auf den Tick +50ms geschickt
</li>
<li>
alle anderen Threads gehen in h&#246;chstens einen Wartezyklus
</li>
<li>
der WorkForce-Destruktor wartet jeweils auf den tendNext-Thread
</li>
</ul>
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Im Detail nachvollzogen durch Trace-Log der aktuellen Zeit, incl. Thread-Nummer
</p>
<ul>
<li>
man konnte jeweils deutliche Cache-Effekte beobachten
</li>
<li>
abgesehen davon waren die Timings stabil
</li>
<li>
die separat im Test gemessenen Zeiten passen perfekt mit den Zeiten und dem Muster aus dem Trace zusammen
</li>
<li>
die Threads brauchen in der Tat eine Zeitspanne von 100-200&#181;s, bis sie aktiv werden
</li>
<li>
insofern variiert es von Lauf zu Lauf erheblich, wie viele Threads &#252;berhaupt den Schlaf-Auftrag bekommen
</li>
</ul>
</body>
</html></richcontent>
<linktarget COLOR="#96abb4" DESTINATION="ID_114745098" ENDARROW="Default" ENDINCLINATION="694;-113;" ID="Arrow_ID_336093338" SOURCE="ID_1693880533" STARTARROW="None" STARTINCLINATION="522;22;"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698592173326" ID="ID_1298598152" MODIFIED="1698592641089" TEXT="verify_Disengage">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698592075524" ID="ID_202320750" MODIFIED="1698592208068" TEXT="Test f&#xfc;r selbst&#xe4;ndiges Deaktivieren bei leerer Queue">
<linktarget COLOR="#3e9b94" DESTINATION="ID_202320750" ENDARROW="Default" ENDINCLINATION="-1156;-61;" ID="Arrow_ID_727945119" SOURCE="ID_191013179" STARTARROW="None" STARTINCLINATION="61;1261;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698592582560" ID="ID_953889358" MODIFIED="1698592600782" TEXT="mu&#xdf; daf&#xfc;r ca 2sec warten">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1698592605242" ID="ID_233491478" MODIFIED="1698592613559" TEXT="auf Dauer kann man diesen Test deaktivieren"/>
<node CREATED="1698592614124" ID="ID_696418800" MODIFIED="1698592633653" TEXT="oder wir f&#xfc;hren l&#xe4;ngerfristig mal verschiedene Test-Tiefen ein"/>
</node>
</node>
<node COLOR="#338800" CREATED="1698247388556" ID="ID_1402046356" MODIFIED="1698448243571" TEXT="invokeWorkFunction">
<icon BUILTIN="button_ok"/>
@ -91746,6 +92009,20 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698454491296" ID="ID_1287561281" LINK="#ID_410477206" MODIFIED="1698454517684" TEXT="macht Code complex, z.B. Grooming-Token-Behandlung"/>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1698605224248" ID="ID_1700976561" MODIFIED="1698605230805" TEXT="Auslegung der Laststeuerung">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1698605001334" ID="ID_174276213" MODIFIED="1698605242320" TEXT="ist weicheres Anfahren der WorkFoce sinnvoll?">
<linktarget COLOR="#8a8699" DESTINATION="ID_174276213" ENDARROW="Default" ENDINCLINATION="-1083;-69;" ID="Arrow_ID_1348822312" SOURCE="ID_153443695" STARTARROW="None" STARTINCLINATION="617;33;"/>
<icon BUILTIN="help"/>
<node CREATED="1698605282416" ID="ID_778966135" MODIFIED="1698605308782" TEXT="man k&#xf6;nnte sich schrittweise rantasten &#x2014; m&#xfc;&#xdf;te dann aber auch bei Bedarf hochskalieren">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1698605255428" ID="ID_185275385" MODIFIED="1698605272798" TEXT="derzeit wird einfach mal die komplette WorkForce gestartet"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698605273458" ID="ID_232164751" MODIFIED="1698605317281" TEXT="auf meinem 8-Kerner braucht das 1ms">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
</node>
</node>
@ -92463,16 +92740,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1698526392894" ID="ID_1798534041" MODIFIED="1698526620878" TEXT="der Scheduler k&#xf6;nnte ohne Deadline leben, aber der BlockFlow erzwingt sie">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
F&#252;r die Implementierung des Schedulers sind Deadlines technisch irrelevant &#8212; deshalb habe ich aktuell auch die ganze Implementierung gecodet, und noch keine Deadline-Behandlung eingebaut. Aber sowohl logisch, als auch im Hinblick auf die Allokationen <b>mu&#223;</b>&#160;jede Activity eine Deadline haben. Eine Activity ohne Deadline w&#228;re ultimativ verbindlich: <i>irgendwann nach </i>ihrem Startzeitpunkt <i>mu&#223; sie aktiviert werden, </i>und jede sp&#228;tere Activity ist durch sie verdeckt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698533069058" ID="ID_1475771662" MODIFIED="1698533129903" TEXT="klares Trennkriterium einf&#xfc;hren">
<linktarget COLOR="#ee3a6b" DESTINATION="ID_1475771662" ENDARROW="Default" ENDINCLINATION="-1121;-88;" ID="Arrow_ID_211999245" SOURCE="ID_696019318" STARTARROW="None" STARTINCLINATION="1410;120;"/>
@ -92485,9 +92759,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698526632870" ID="ID_1680559422" MODIFIED="1698526704177">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Problem: wenn R&#252;ckstau im Scheduler entsteht,
@ -92496,8 +92768,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
wird jede Deadline irgendwann &#252;berfahren
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="broken-line"/>
<node CREATED="1698526724569" HGAP="36" ID="ID_68181204" MODIFIED="1698528287374" TEXT="und dann..." VSHIFT="30">
<icon BUILTIN="smiley-oh"/>
@ -92508,55 +92779,43 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698528278314" HGAP="56" ID="ID_906006078" MODIFIED="1698528284150" TEXT="Dilemma" VSHIFT="13">
<node CREATED="1698528304615" ID="ID_402115905" MODIFIED="1698528981338" TEXT="Epochen k&#xf6;nnen nicht beliebig lange blockiert sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...es gibt zwar einen Block-Mechanismus (das Epoch-Gate), doch damit l&#228;&#223;t man den Block-Pool anwachsen und die lineare Suche durch die Bl&#246;cke macht sich bald bemerkbar
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1698528350522" ID="ID_1884380820" MODIFIED="1698528623316" TEXT="Epochen k&#xf6;nnen nicht beliebig gro&#xdf; werden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...weil dann der &#220;berlauf-Mechanismus zu weit in die Zukunft ausgreift, und sich die Steuerung in absehbarer Zeit<i>&#160;nicht mehr f&#228;ngt.</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1698528368302" ID="ID_516251987" MODIFIED="1698528683619" TEXT="bei normaler Gr&#xf6;&#xdf;e sind keine beliebig weiten Zeitschritte m&#xf6;glich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Daher ist es nicht m&#246;glich, eben sehr gro&#223;e/lange Tasks vorzuplanen; man erzeugt eine Flut leerer Bl&#246;cke dazwischen, und die Suchzeiten degenerieren
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1698528414600" ID="ID_842501295" MODIFIED="1698528848581" TEXT="darf nach &#xfc;berschrittener Deadline die Activity nicht (mehr) dereferenzieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Damit scheiden die naheliegenden <i>Reparatur-Ans&#228;tze</i>&#160;weitgehend aus: es ist nicht m&#246;glich, eine &#8222;&#252;berfahrene&#8220; Activity <i>in die Zukunft </i>zu kopieren, denn wenn die Deadline verstrichen ist, kann sie auch bereits verworfen worden sein, und es ist nicht mehr feststellbar, um was es sich handelte
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -92580,16 +92839,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698530385776" ID="ID_365804773" MODIFIED="1698530398452" TEXT="Innen-&#xdc;berwachung: der Tick">
<node CREATED="1698533322431" ID="ID_1153107499" MODIFIED="1698534741599">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
der Tick selber ist eine <b>verbindliche Aktivit&#228;t</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<linktarget COLOR="#fd2f46" DESTINATION="ID_1153107499" ENDARROW="Default" ENDINCLINATION="524;-25;" ID="Arrow_ID_251741761" SOURCE="ID_1189633297" STARTARROW="None" STARTINCLINATION="420;464;"/>
<icon BUILTIN="idea"/>
</node>
@ -92617,31 +92873,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698529860655" ID="ID_315208147" MODIFIED="1698529868790" TEXT="es mu&#xdf; einen sauberen Abbruch geben">
<node CREATED="1698529876100" ID="ID_1032670149" MODIFIED="1698530090626" TEXT="pausieren der Render-Prozesse">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
sollte automatisch passieren, wenn die internen Gesundheits-Checks scheitern
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1698529893418" ID="ID_945666348" MODIFIED="1698529916172" TEXT="gestartete Berechnungen laufen weiter"/>
<node CREATED="1698529917111" ID="ID_138084659" MODIFIED="1698529933793" TEXT="das &#xfc;brige System mu&#xdf; gesund bleiben"/>
<node CREATED="1698529943153" ID="ID_1379758104" MODIFIED="1698530377336" TEXT="Notfall-Shutdown wird dann problematisch">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...wenn wir noch einen Worker-Pool haben, der mit langlaufenden berechnungen geblockt ist, dann wird jeder regul&#228;re emergency-Shutdown im Destruktor h&#228;ngen bleiben.Wenn es erst mal so weit gekommen ist, kann man nicht einmal mehr den User richtig benachrichtigen; ein hartes <font face="Monospaced">exit()</font>&#160; dagegen w&#252;rde die bereits geleistete Arbeit einfach verwerfen.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698529979672" ID="ID_1042828147" MODIFIED="1698529998709" TEXT="Alternative bieten">
@ -92909,9 +93159,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1698530968938" ID="ID_187393453" MODIFIED="1698531103087" STYLE="bubble">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p style="text-align: center">
Der Scheduler arbeitet nur in einem begrenzten Bereich
@ -92923,8 +93171,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Dann ist ein spezielle Notzustand zu aktivieren
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<edge COLOR="#930246"/>
<icon BUILTIN="info"/>
</node>
@ -92943,16 +93190,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="hourglass"/>
<node CREATED="1698532052993" ID="ID_503858341" MODIFIED="1698532312084" TEXT="Problem: Berechnunsstand feststellen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...der gesamte Entwurf bisher beruht auf Ereignis-Verkn&#252;pfung und sieht keine generische Erfassung aller tats&#228;chlich berechneten Schritte vor. Wenn also die Scheduler-Emergency ausgel&#246;st wird, ist ein zuf&#228;llig verteiltes Muster an Einzel-Jobs abgeschlossen, und der Rest fehlt. Wollte man hier einen generischen Ansatz f&#252;r das Wiederanlaufen schaffen, so m&#252;&#223;te man alle Berechnungsprozesse unter eine einzige Abstraktion subsummieren k&#246;nnen. Das halte ich f&#252;r gef&#228;hrlich...
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698532335022" ID="ID_849438801" MODIFIED="1698532356066" TEXT="Konsequenz &#x27f9; Player-Clients brauchen Recovery-Mechanismus">
<icon BUILTIN="flag-yellow"/>
@ -93067,16 +93311,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698535547327" ID="ID_1921664973" MODIFIED="1698535562301" TEXT="deckt die Randbereiche im Betriebsmuster ab">
<node CREATED="1698535641170" ID="ID_623035212" MODIFIED="1698535714220" TEXT="soll als Plan-B f&#xfc;r Grenzf&#xe4;lle dienen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Beispiel: ein &#187;final Render&#171; bei dem pro Frame mehr als 30 Sekunden Rechenzeit notwendig sind; dies w&#252;rde die Auslegung des Schedulers sprengen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1698535623469" ID="ID_1256815125" MODIFIED="1698535635467" TEXT="erm&#xf6;glicht Performance-Optimierung des Schedulers"/>
</node>