Block-Flow: maintain an »Epoch« within the raw allocation Extent

- the idea is to use slot-0 in each extent for administrative metadata
- to that end, a specialised GATE-Activity is placed into slot-0
- decision to use the next-pointer for managing the next free slot
- thus we need the help of the underlying ExtentFamily for navigating Extents

Decision to refrain from any attempt to "fix" excessive memory usage,
caused by Epochs still blocked by pending IO operations. Rather, we
assume the engine uses sane parametrisation (possibly with dynamic adjustment)
Yet still there will be some safety limit, but when exceeding this limit,
the allocator will just throw, thereby killing the playback/render process
This commit is contained in:
Fischlurch 2023-07-09 01:32:27 +02:00
parent 533112a4b0
commit ccf0710903
7 changed files with 347 additions and 46 deletions

View file

@ -135,7 +135,7 @@ namespace lib {
* - it is not just a disguised pointer (meaning, it's more expensive)
* - it checks validity on every operation and may throw
* - it has a distinct back-link to the source container
* - the source container needs to provide hasNext() and iterNext() free functions.
* - the source container needs to support `checkPoint()` and `iterNext()` free functions.
* - we may need friendship to implement those extension points on the container
* - the end-of-iteration can be detected by bool check
* @note it is possible to "hide" a smart-ptr within the CON template parameter.
@ -303,7 +303,7 @@ namespace lib {
inline bool operator== (IterAdapter<P1,CON> const& il, IterAdapter<P2,CON> const& ir) { return il.pos_ == ir.pos_; }
template<class P1, class P2, class CON>
inline bool operator!= (IterAdapter<P1,CON> const& il, IterAdapter<P2,CON> const& ir) { return !(il == ir); }
inline bool operator!= (IterAdapter<P1,CON> const& il, IterAdapter<P2,CON> const& ir) { return not (il == ir); }

View file

@ -181,7 +181,7 @@ namespace gear {
explicit
Activity (Verb verb)
Activity (Verb verb) noexcept
: verb_{verb}
, next{nullptr}
{
@ -193,7 +193,7 @@ namespace gear {
/* ==== special case initialisation ==== */
Activity (size_t o1, size_t o2)
Activity (size_t o1, size_t o2) noexcept
: Activity{FEED}
{
data_.feed.one = o1;
@ -201,42 +201,42 @@ namespace gear {
}
explicit
Activity (Activity* target)
Activity (Activity* target) noexcept
: Activity{NOTIFY}
{
data_.notification.target = target;
}
explicit
Activity (int expectNotifications, Time deadline = Time::NEVER)
Activity (int expectNotifications, Time deadline = Time::NEVER) noexcept
: Activity{GATE}
{
data_.condition.rest = expectNotifications;
data_.condition.dead = deadline;
}
Activity (Time when, Activity* followUp)
Activity (Time when, Activity* followUp) noexcept
: verb_{POST}
, next{followUp}
{
data_.timeWindow = {when,when};
}
Activity (Time start, Time after, Activity* followUp)
Activity (Time start, Time after, Activity* followUp) noexcept
: verb_{POST}
, next{followUp}
{
data_.timeWindow = {start,after};
}
Activity()
Activity() noexcept
: Activity{TICK}
{ }
private:
void
setDefaultArg (Verb verb)
setDefaultArg (Verb verb) noexcept
{
data_ = {0,0};
switch (verb) {

View file

@ -34,7 +34,7 @@
** activities, necessitating timely clean-up of obsolete descriptors.
** Used memory should be recycled, calling for an arrangement of
** pooled allocation tiles, extending the underlying block
** allocation on increased throughput.
** allocation on increased throughput.
**
** @note currently this rather marks the intended memory management pattern,
** while the actual allocations are still performed on the heap.
@ -60,6 +60,7 @@
//#include "lib/util.hpp"
//#include <string>
#include <utility>
namespace vault{
@ -75,30 +76,66 @@ namespace gear {
const size_t INITIAL_FRAMES = 50;
const size_t INITIAL_ALLOC = 1 + (INITIAL_FRAMES * ACTIVITIES_PER_FRAME) / EPOCH_SIZ;
/** raw allocator to provide a sequence of Extents to place Activity records */
using Allocator = mem::ExtentFamily<Activity, EPOCH_SIZ>;
}
/**
*
* Allocation Extent holding _scheduler Activities_ to be performed altogether
* before a common _deadline._ Other than the underlying raw Extent, the Epoch
* maintains a deadline time and keeps track of storage slots already claimed.
* This is achieved by using the Activity record in the first slot as a GATE term
* to maintain those administrative information.
* @remark rationale is to discard the Extent as a whole, once the deadline passed.
*/
class Epoch
: public Allocator::Extent
{
/// @warning will be faked, not constructed
Epoch() = delete;
public:
/**
* specifically rigged GATE Activity,
* used for managing Epoch metadata
* - the Condition::rest tracks pending async IO operations
* - the Condition::deadline is the nominal deadline of this Epoch
* - the field `next` points to the next free allocation Slot to use
*/
struct EpochGate
: Activity
{
/** @note initially by default there is...
* - effectively no deadline
* - no IO operations pending (i.e. we can just discard the Epoch)
* - the `next` usable Slot is the last Storage slot, and will be
* decremented until there is only one slot left (EpochGate itself)
* @warning EpochGate is assumed to sit in the Epoch's first slot
*/
EpochGate()
: Activity{int(0), Time::ANYTIME}
{
UNIMPLEMENTED ("initialise allocation usage marker to zero");
// initialise allocation usage marker: start at last usable slot
next = this + (Epoch::SIZ() - 1);
ENSURE (next != this);
}
// default copyable
bool
hasFreeSlot()
{ // see C++ § 5.9 : comparison of pointers within same array
return next > this;
}
Activity*
claimNextSlot()
{
REQUIRE (hasFreeSlot());
return next--;
}
};
static Epoch&
@ -116,8 +153,12 @@ namespace gear {
}
};
/**
* Basic (abstracted) view of...
* Allocation scheme for the Scheduler, based on Epoch(s).
* Scheduling entails to provide a chain of Activity definitions,
* which will then »flow« through the priority queue until invocation.
*
* @see SchedulerCommutator
* @see BlockFlow_test
@ -132,10 +173,51 @@ namespace gear {
: alloc_{INITIAL_ALLOC}
{ }
Activity&
createActivity (Activity::Verb verb, Time deadline)
/**
* Local handle to allow allocating a collection of Activities,
* all sharing a common deadline. Internally, these records are
* maintained in fixed-sized _extents_ and thus allocations may
* _overflow_ — leading to allocation of further extents. However,
* this extension is handled transparently by the embedded iterator.
*/
class AllocatorHandle
{
UNIMPLEMENTED ("place new allocation");
Allocator::iterator extent;
public:
template<typename...ARGS>
Activity&
create (ARGS&& ...args)
{
return *new(claimSlot()) Activity {std::forward<ARGS> (args)...};
}
private:
Epoch&
currEpoch()
{
REQUIRE (bool(extent));
return static_cast<Epoch&> (extent->access()); ////////////////////////////OOO is it possible to adapt the iterator, so that dereferentiation directly yields the Extent?
}
void*
claimSlot() ///< EX_SANE
{
if (currEpoch().gate().hasFreeSlot())
{
return currEpoch().gate().claimNextSlot();
}
else // Epoch overflow
{ // use following Epoch; possibly allocate
UNIMPLEMENTED ("advance to next epoch");
}
}
};
AllocatorHandle
until (Time deadline)
{
UNIMPLEMENTED ("search through existing Epochs to locate the latest one to support given deadline");
}
void

View file

@ -46,7 +46,8 @@
#include "vault/common.hpp"
//#include "lib/symbol.hpp"
#include "lib/nocopy.hpp"
#include "lib/iter-adapter.hpp"
#include "lib/nocopy.hpp"
//#include "lib/util.hpp"
//#include <string>
@ -76,6 +77,7 @@ namespace mem {
: std::array<T,siz>
{
using Payload = T;
using SIZ = std::integral_constant<size_t,siz>;
};
private:
@ -101,6 +103,7 @@ namespace mem {
}
};
using Extents = std::vector<Storage>;
using RawIter = typename Extents::iterator;
Extents extents_;
@ -119,6 +122,23 @@ namespace mem {
{
extents_.reserve (expectedMaxExtents);
}
/** allow transparent iteration of Extents, expanding storage on demand */
using iterator = lib::IterAdapter<RawIter, ExtentFamily*>; ////////////////////OOO consider to use a Extent* instead of the RawIter??
/* == Iteration control API (used by IterAdapter via ADL) == */
friend bool
checkPoint (ExtentFamily* exFam, RawIter& pos)
{
UNIMPLEMENTED ("ExtentFamily iteration control: check and adapt position");
}
friend void
iterNext (ExtentFamily* exFam, RawIter& pos)
{
UNIMPLEMENTED ("ExtentFamily iteration control: access next Extent, possibly expand allocation");
}
};

View file

@ -144,9 +144,9 @@ namespace test{
template<class ITER>
friend void
iterNext (const TestContainer*, ITER& pos)
{
++pos;
}
{
++pos;
}
/** Implementation of Iteration-logic: detect iteration end.
* @note the problem here is that this implementation chooses to use
@ -161,15 +161,15 @@ namespace test{
template<class ITER>
friend bool
checkPoint (const TestContainer* src, ITER& pos)
{
REQUIRE (src);
if ((pos != ITER()) && (pos != src->numberz_.end()))
return true;
else
{
pos = ITER();
return false;
} }
{
REQUIRE (src);
if ((pos != ITER()) && (pos != src->numberz_.end()))
return true;
else
{
pos = ITER();
return false;
} }
};
} // (END) impl test dummy container

View file

@ -76,7 +76,7 @@ namespace test {
{
BlockFlow bFlow;
Time deadline = randTime();
Activity tick = bFlow.createActivity(Activity::TICK, deadline);
Activity tick = bFlow.until(deadline).create();
///////////////////////////////////////////////////////////////////////////////OOO diagnostic function to check allocation
bFlow.discardBefore (deadline + Time{0,5});

View file

@ -78646,7 +78646,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#6f1a2f" DESTINATION="ID_1770745874" ENDARROW="Default" ENDINCLINATION="10;-56;" ID="Arrow_ID_207766086" SOURCE="ID_1953816732" STARTARROW="None" STARTINCLINATION="-118;8;"/>
<node CREATED="1688057954745" ID="ID_1000550033" MODIFIED="1688057976503" TEXT="die Schrittweite zu belegender Epochen ist dynamisch reguliert"/>
<node CREATED="1688057988746" ID="ID_852809059" MODIFIED="1688058006097" TEXT="Epochen werden bis zu einem gewissen Limit bei Bedarf ge&#xf6;ffnet"/>
<node CREATED="1688058008286" ID="ID_1395550013" MODIFIED="1688058062859" TEXT="dar&#xfc;ber hinausgehende Activities werden per &#xbb;post&#xab; dargestellt"/>
<node COLOR="#5b280f" CREATED="1688058008286" ID="ID_1395550013" MODIFIED="1688776318888" TEXT="dar&#xfc;ber hinausgehende Activities werden per &#xbb;post&#xab; dargestellt">
<icon BUILTIN="button_cancel"/>
<node CREATED="1688776325334" ID="ID_1313006156" MODIFIED="1688776352816" TEXT="Nein! das sprengt den Rahmen">
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1688776353810" ID="ID_841571212" LINK="#ID_263429425" MODIFIED="1688776374015" TEXT="stattdessen als Exception werten">
<icon BUILTIN="yes"/>
</node>
</node>
<node CREATED="1688058076006" ID="ID_47142249" MODIFIED="1688337534216">
<richcontent TYPE="NODE"><html>
<head>
@ -78741,6 +78749,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<linktarget COLOR="#537a8e" DESTINATION="ID_253828146" ENDARROW="Default" ENDINCLINATION="399;21;" ID="Arrow_ID_1328212863" SOURCE="ID_900655074" STARTARROW="None" STARTINCLINATION="508;-25;"/>
</node>
</node>
</node>
@ -78879,11 +78888,38 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688855104720" ID="ID_1636566408" MODIFIED="1688855162693" TEXT="Daten: (backlink, vector-iterator)">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688855122802" ID="ID_1154748375" MODIFIED="1688855159922" TEXT="Support in ExtentFamily">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688855142439" ID="ID_520029458" MODIFIED="1688855157703" TEXT="checkPoint (src,pos)">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688855167035" ID="ID_599034767" MODIFIED="1688855187689" TEXT="iterNext(src,pos)">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1688509796132" ID="ID_361634809" MODIFIED="1688509960392" TEXT="fragt sich blo&#xdf;: wird &#xfc;berhaupt ein Iterator gebraucht?">
</node>
</node>
<node COLOR="#435e98" CREATED="1688509796132" ID="ID_361634809" MODIFIED="1688853056871" TEXT="fragt sich blo&#xdf;: wird &#xfc;berhaupt ein Iterator gebraucht?">
<arrowlink COLOR="#7e3acf" DESTINATION="ID_836380061" ENDARROW="Default" ENDINCLINATION="47;-174;" ID="Arrow_ID_166794449" STARTARROW="None" STARTINCLINATION="-280;14;"/>
<icon BUILTIN="hourglass"/>
<node CREATED="1688852868967" ID="ID_1480472415" MODIFIED="1688853067930" TEXT="Antwort: ja &#x2014; und zwar integriert mit dem Wachstum">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...da wir den Platz im EpochGuard bereits anderweitig komplett aussch&#246;pfen, mu&#223; die ExtentFamily auch beim Navigieren &#252;ber die Sequenz der Epochen hinweg helfen. Und im Besonderen eine Navigation &#252;ber das Ende hinaus mu&#223; <b>transparent eine Erweiterung der Allokation</b>&#160; bewirken. Habe mich entschlossen, die Limitierung als Ausnahme/Exteption zu definieren, so da&#223; im Regelfall die ExtentFamily einfach immer weiter wachsen soll
</p>
</body>
</html></richcontent>
<icon BUILTIN="forward"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688853104969" ID="ID_1620391720" MODIFIED="1688853131602" TEXT="Iteration mu&#xdf; transparent &#xfc;ber Allokations-Erweiterung / &#xdc;berlauf hinweggehen">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688398893220" ID="ID_675575195" MODIFIED="1688398901316" TEXT="belegen / freigeben">
@ -78907,7 +78943,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#eb4070" DESTINATION="ID_1454374119" ENDARROW="Default" ENDINCLINATION="-596;80;" ID="Arrow_ID_208594716" STARTARROW="None" STARTINCLINATION="-331;-16;"/>
<linktarget COLOR="#7e3acf" DESTINATION="ID_836380061" ENDARROW="Default" ENDINCLINATION="47;-174;" ID="Arrow_ID_166794449" SOURCE="ID_361634809" STARTARROW="None" STARTINCLINATION="-280;14;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688510160724" ID="ID_915708936" MODIFIED="1688510165585" TEXT="Action allozieren">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688510160724" ID="ID_915708936" MODIFIED="1688772898446" TEXT="Activity allozieren">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1688510169558" ID="ID_435186748" MODIFIED="1688510256314" TEXT="werden grunds&#xe4;tzlich einzeln behandelt">
<richcontent TYPE="NOTE"><html>
@ -78926,10 +78962,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688510405600" ID="ID_974318886" MODIFIED="1688510436943" TEXT="&#x27fc; liefert: Slot f&#xfc;r Placement-New">
<node CREATED="1688511764027" ID="ID_494303010" MODIFIED="1688511780582" TEXT="den fr&#xfc;hest m&#xf6;glichen der diese Deadline unterst&#xfc;tzt"/>
<node CREATED="1688511807398" ID="ID_160731598" MODIFIED="1688511817680" TEXT="erzeugt implizit alle Epochen dazwischen"/>
<node CREATED="1688511820828" ID="ID_1443383285" MODIFIED="1688511836189" TEXT="kann scheitern wenn zu weit in der Zukunft &#x27fc; nullptr"/>
<node CREATED="1688511820828" ID="ID_1443383285" MODIFIED="1688775531341" TEXT="kann scheitern wenn zu weit in der Zukunft &#x27fc; &#x21af;"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1688559559278" ID="ID_27532065" MODIFIED="1688560429832" TEXT="unklar: wenn zu weit in der Zukunft">
<arrowlink COLOR="#fd1a6e" DESTINATION="ID_1315709817" ENDARROW="Default" ENDINCLINATION="21;-31;" ID="Arrow_ID_1483237280" STARTARROW="None" STARTINCLINATION="-202;16;"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1688559559278" ID="ID_27532065" MODIFIED="1688775478883" TEXT="unklar: kann die Allokation entgleisen?">
<arrowlink COLOR="#fd1a6e" DESTINATION="ID_1315709817" ENDARROW="Default" ENDINCLINATION="21;-31;" ID="Arrow_ID_1483237280" STARTARROW="None" STARTINCLINATION="-205;14;"/>
<icon BUILTIN="flag-pink"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688560442660" ID="ID_143148462" MODIFIED="1688560448084" TEXT="Activity placement-New">
@ -78948,6 +78984,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688512195210" ID="ID_455793213" MODIFIED="1688512207091" TEXT="Aufr&#xe4;umen vor gegebener Zeit">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1688775777543" ID="ID_827708076" MODIFIED="1688775793070" TEXT="wird ausgel&#xf6;st in der TICK-Activity">
<icon BUILTIN="info"/>
</node>
<node CREATED="1688512231159" ID="ID_960172052" MODIFIED="1688512246837" TEXT="gegeben: eine aktuell behandelte (Start)Zeit"/>
<node CREATED="1688512252777" ID="ID_831223782" MODIFIED="1688512279796">
<richcontent TYPE="NODE"><html>
@ -78968,28 +79007,102 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1688513876713" ID="ID_1973420609" MODIFIED="1688513883828" TEXT="obsolete Epochen verwerfen"/>
<node CREATED="1688513885200" ID="ID_47111804" MODIFIED="1688513903849" TEXT="auf der ersten nicht-obsoleten Epoche stehen bleiben"/>
</node>
<node CREATED="1688775652096" ID="ID_1474151969" MODIFIED="1688775660022" TEXT="Form der Schnittstelle">
<icon BUILTIN="idea"/>
<node CREATED="1688775668422" ID="ID_767496240" MODIFIED="1688775676057" TEXT="dar&#xfc;ber sitzt ein Builder"/>
<node CREATED="1688775685500" ID="ID_773772497" MODIFIED="1688775698085" TEXT="dieser wiederum soll im Job-Planning eingebaut werden"/>
<node CREATED="1688775841388" ID="ID_1141871093" LINK="#ID_1753772146" MODIFIED="1688775893436" TEXT="Informationen zum Zeitfenster sind dort kontextuell gegeben"/>
<node CREATED="1688775908470" ID="ID_1274434865" MODIFIED="1688775921263" TEXT="&#x27f9; sinnvoll ist eine Term-Struktur">
<node COLOR="#3a5db3" CREATED="1688775957367" ID="ID_1429644643" MODIFIED="1688776009083" TEXT="blockFlow.until(deadline).create(Args...)">
<font NAME="Monospaced" SIZE="12"/>
</node>
<node CREATED="1688776029061" ID="ID_909971028" LINK="#ID_414891440" MODIFIED="1688776135974" TEXT="Builder-Objekt k&#xf6;nnte ein AllocatorHandle sein">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688515962746" HGAP="25" ID="ID_468510160" MODIFIED="1688559368790" TEXT="Strukturen" VSHIFT="4">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688515974697" ID="ID_1054833524" MODIFIED="1688516009303" TEXT="h&#xe4;lt eine ExtentFamily&lt;Action,siz&gt;">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688515974697" ID="ID_1054833524" MODIFIED="1688772907535" TEXT="h&#xe4;lt eine ExtentFamily&lt;Activity,siz&gt;">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688555107931" ID="ID_285024973" MODIFIED="1688555140175" TEXT="Datentyp: Epoch">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1688555107931" ID="ID_285024973" MODIFIED="1688862187262" TEXT="Datentyp: Epoch">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688555141913" ID="ID_406773800" MODIFIED="1688555169035" TEXT="als Subtyp der Extent-Storage">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688855335861" ID="ID_805170537" MODIFIED="1688855478519" TEXT="verwaltet ein EpochGate">
<arrowlink COLOR="#87335c" DESTINATION="ID_262514506" ENDARROW="Default" ENDINCLINATION="-51;-3;" ID="Arrow_ID_1549134996" STARTARROW="None" STARTINCLINATION="57;6;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688855508871" ID="ID_1411819334" MODIFIED="1688855516993" TEXT="verwaltet einen F&#xfc;llstand">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1688855600025" ID="ID_250176571" MODIFIED="1688855663180" TEXT="notgedrungenerma&#xdf;en als Pointer">
<arrowlink COLOR="#5d59c8" DESTINATION="ID_1249055593" ENDARROW="Default" ENDINCLINATION="-17;-67;" ID="Arrow_ID_246272817" STARTARROW="None" STARTINCLINATION="115;9;"/>
<icon BUILTIN="smily_bad"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688855675271" ID="ID_1730018277" MODIFIED="1688855696429" TEXT="wird r&#xfc;ckw&#xe4;rts laufend verwendet">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1688855956754" ID="ID_649163779" MODIFIED="1688855974112" TEXT="initialisiert auf das letzte Element im Extent"/>
<node CREATED="1688855974789" ID="ID_842856173" MODIFIED="1688855979243" TEXT="jeweils dekrementiert"/>
</node>
<node CREATED="1688855917759" ID="ID_970541500" MODIFIED="1688855950792" TEXT="Abbruchbedingung: next == &amp; EpochGate">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688516187452" ID="ID_843039397" MODIFIED="1688516195292" TEXT="Zusatz-Infos zu verwalten">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688516199288" ID="ID_1824919687" MODIFIED="1688516212258" TEXT="Epochen-Deadline">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1688516220648" ID="ID_1169377280" MODIFIED="1688516237353" TEXT="steht in einem Gate im 1.Slot"/>
<node CREATED="1688553471328" ID="ID_262514506" MODIFIED="1688553490999" TEXT="daf&#xfc;r eigenen Sub-Typ anliegen: EpochGate"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688553471328" HGAP="24" ID="ID_262514506" MODIFIED="1688855532469" TEXT="daf&#xfc;r eigenen Sub-Typ anliegen: EpochGate" VSHIFT="7">
<linktarget COLOR="#87335c" DESTINATION="ID_262514506" ENDARROW="Default" ENDINCLINATION="-51;-3;" ID="Arrow_ID_1549134996" SOURCE="ID_805170537" STARTARROW="None" STARTINCLINATION="57;6;"/>
<icon BUILTIN="yes"/>
<node CREATED="1688855534850" ID="ID_568063333" MODIFIED="1688855541413" TEXT="eine Activity vom Typ GATE"/>
<node CREATED="1688855549226" ID="ID_739862110" MODIFIED="1688855565203" TEXT="wird aber speziell vorinitialisiert"/>
<node CREATED="1688855565956" ID="ID_1537513041" MODIFIED="1688855590150" TEXT="der next-Pointer zeigt hier auf den n&#xe4;chsten freien Slot"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688554963598" ID="ID_708490850" MODIFIED="1688554971708" TEXT="F&#xfc;llstand der Epoche">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1688554972581" ID="ID_278561305" MODIFIED="1688554979689" TEXT="wird auch im EpochGate abgelegt"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688777569396" ID="ID_1723162290" MODIFIED="1688777606098" TEXT="schwierig... Platz fehlt">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1688777608247" ID="ID_459855386" MODIFIED="1688777620049" TEXT="Activities sind bewu&#xdf;t sehr knapp bemessen"/>
<node CREATED="1688777622037" ID="ID_900655074" MODIFIED="1688777808298" TEXT="die beiden Felder vom Gate werden hier definitiv ben&#xf6;tigt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...denn speziell das Count-down-Feld ist gradezu der springende Punkt beim EpochGate (damit l&#246;sen wir das Problem, da&#223; IO-Operationen h&#228;ngenbleiben k&#246;nnen)
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#537a8e" DESTINATION="ID_253828146" ENDARROW="Default" ENDINCLINATION="399;21;" ID="Arrow_ID_1328212863" STARTARROW="None" STARTINCLINATION="508;-25;"/>
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688777811931" ID="ID_1249055593" MODIFIED="1688855648245" TEXT="bleibt nur der next-Pointer....">
<linktarget COLOR="#5d59c8" DESTINATION="ID_1249055593" ENDARROW="Default" ENDINCLINATION="-17;-67;" ID="Arrow_ID_246272817" SOURCE="ID_250176571" STARTARROW="None" STARTINCLINATION="115;9;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#5b280f" CREATED="1688777836110" ID="ID_526522381" MODIFIED="1688777868460" TEXT="schwierig... soll ich den jetzt &#xbb;umfunktionieren&#xab;?">
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688777870348" ID="ID_573178945" MODIFIED="1688777913750" TEXT="nein: sauber ist nur ein Pointer (auf den n&#xe4;chsten freien Slot)">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1688777914661" ID="ID_1672637364" MODIFIED="1688777925779" TEXT="das l&#xe4;uft auf sowas wie einen Iterator hinaus">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#5b280f" CREATED="1688778128929" ID="ID_717553610" MODIFIED="1688778210329" TEXT="dann ist er allerdings nicht mehr als linked-List nutzbar">
<arrowlink COLOR="#fe0d3a" DESTINATION="ID_1590074187" ENDARROW="Default" ENDINCLINATION="23;-55;" ID="Arrow_ID_708564411" STARTARROW="None" STARTINCLINATION="-39;2;"/>
<icon BUILTIN="broken-line"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1688555006558" ID="ID_11354677" MODIFIED="1688555057586" TEXT="Beschlu&#xdf;: KISS">
<icon BUILTIN="yes"/>
@ -78997,6 +79110,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1688555027213" ID="ID_1516151909" MODIFIED="1688555031529" TEXT="kein separater Index"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688555032021" ID="ID_1157610750" MODIFIED="1688555050479" TEXT="die EpochGate als LInked-List verwenden">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1688778164204" ID="ID_1590074187" MODIFIED="1688778220458" TEXT="geht nicht mehr">
<linktarget COLOR="#fe0d3a" DESTINATION="ID_1590074187" ENDARROW="Default" ENDINCLINATION="23;-55;" ID="Arrow_ID_708564411" SOURCE="ID_717553610" STARTARROW="None" STARTINCLINATION="-39;2;"/>
<icon BUILTIN="closed"/>
</node>
<node CREATED="1688778276909" ID="ID_110193234" MODIFIED="1688778291547" TEXT="dann mu&#xdf; hier der Basis-Allokator helfen">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
@ -79004,17 +79124,17 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688559356693" HGAP="9" ID="ID_1823374976" MODIFIED="1688559375797" TEXT="Grenzf&#xe4;lle" VSHIFT="7">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1688559379394" ID="ID_1315709817" MODIFIED="1688560429832" TEXT="zu weit in der Zukunft">
<linktarget COLOR="#fd1a6e" DESTINATION="ID_1315709817" ENDARROW="Default" ENDINCLINATION="21;-31;" ID="Arrow_ID_1483237280" SOURCE="ID_27532065" STARTARROW="None" STARTINCLINATION="-202;16;"/>
<linktarget COLOR="#fd1a6e" DESTINATION="ID_1315709817" ENDARROW="Default" ENDINCLINATION="21;-31;" ID="Arrow_ID_1483237280" SOURCE="ID_27532065" STARTARROW="None" STARTINCLINATION="-205;14;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1688559400839" ID="ID_980233005" MODIFIED="1688559420337" TEXT="problematisch: es kann nicht wirklich alloziert werden"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1688559421309" ID="ID_498818717" MODIFIED="1688559505993">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1688559421309" ID="ID_498818717" MODIFIED="1688774030997">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p style="text-align: center">
zwar wird ein POST geplant,
ein POST k&#246;nnte geplant werden,
</p>
<p style="text-align: center">
aber die angeh&#228;ngten Activities werden
@ -79026,6 +79146,69 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="clanbomber"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688774377755" HGAP="25" ID="ID_459856850" MODIFIED="1688774405179" TEXT="Einsch&#xe4;tzung" VSHIFT="4">
<edge COLOR="#7b323c"/>
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1688773732470" ID="ID_1175257683" MODIFIED="1688773790095" TEXT="dieser Fall pa&#xdf;t mir nicht so recht ins Konzept">
<icon BUILTIN="smily_bad"/>
</node>
<node CREATED="1688773743917" ID="ID_1124343559" MODIFIED="1688775166141" TEXT="er ist unwahrscheinlich &#x2014; man kann ihn aber nicht ausschlie&#xdf;en">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Ich gehe davon aus, da&#223; &#8222;dieser ganze Scheduler&#8220; so dimensioniert ist und sich selber derart einregelt, da&#223; er mit dem Flow der Berechnungen klarkommt. Aufgrund der dynamischen und offenen Natur dieser Konstruktion kann ich jedoch keine Garantien geben, da&#223; diese Steuerung stets funktioniert. Die Activity-Language schafft ja grade die M&#246;glichkeit, gegenw&#228;rtig noch gar nicht vorstellbare Steuerungs-Mechanismen sp&#228;ter noch realisieren zu k&#246;nnen, lediglich durch eine ver&#228;nderte Parametrisierung. Aber <i>zumindest ein Szenario des Scheiterns</i>&#160;kann aus aktueller Sicht bereits konstruiert werden: und zwar wenn durch eine &#220;berlastung des IO-Subsystems &#228;ltere Epochen noch nicht freigegeben werden k&#246;nnen, da an ihnen noch Buffer f&#252;r schwebende IO-Vorg&#228;nge h&#228;ngen. Ein laufend fortschreitender BlockFlow w&#252;rde dann sukzessive den verbleibenden Arbeitsspeicher belegen und blockieren.
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1688775167028" ID="ID_906899250" MODIFIED="1688775438783" TEXT="&#x27f9; es handelt sich um einen Schutzmechanismus">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Ein im BlockFlow aktiv verwaltetes Limit f&#252;r den Allokations-Pool stellt daher eine Sicherheitsbarriere dar, damit das System nicht insgesamt in einen degenerierten und unkontrollierbaren Betriebszustand gleitet (sog. &#8222;trashing&#8220;). Dem Zufolge sollte ein Ausl&#246;sen dieser Sicherung nicht in Reparatur-Versuche m&#252;nden, sondern schnellstm&#246;glich zu einem Scheitern des Playback/Rendervorganges f&#252;hren
</p>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688775205671" ID="ID_263429425" MODIFIED="1688775230379" TEXT="daher per Exception abbrechen">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688776216348" ID="ID_1377510140" MODIFIED="1688776233672" TEXT="&#xdc;berlauf einer Epoche">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1688776236442" ID="ID_1772819578" MODIFIED="1688776249385" TEXT="die Epoche ist mit einer festen Gr&#xf6;&#xdf;e vor-alloziert"/>
<node CREATED="1688776251767" ID="ID_1569050620" MODIFIED="1688776277483" TEXT="demnach kann sie zu klein sein und damit bereits vorzeitig voll"/>
<node CREATED="1688778417547" ID="ID_1014314478" MODIFIED="1688778430437" TEXT="in diesem Fall wechseln wir (vorzeitig) auf die n&#xe4;chste Epoche"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1688778436978" ID="ID_1329649699" MODIFIED="1688847252879" TEXT="...und justieren die Epochen-Dauer nach">
<icon BUILTIN="hourglass"/>
<node CREATED="1688846534217" ID="ID_1103016582" MODIFIED="1688846978585" TEXT="nicht ganz einfach: Zeitpunkt und Grad">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Es ist klar, wenn eine Epoche &#252;berl&#228;uft, aber in dem Moment ist noch nicht klar, welcher Prozentsatz des Platztes nun noch unterzubringen ist. Umgekehrt ist nicht klar, wann eine Epoche fertig besetzt ist; Hilfsweise k&#246;nnte man beim Aufr&#228;umen pr&#252;fen, was aber erst deutlich sp&#228;ter passiert &#8212; in beide Richtungen ist also die R&#252;ckkopplung verz&#246;gert und ungenau und kann daher zu Regelschwingungen f&#252;hren.
</p>
</body>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688847294057" ID="ID_1401641986" MODIFIED="1688847402052" TEXT="kurzfristig: bei &#xdc;berlauf einen Zuschlag geben">
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1688847321781" ID="ID_1927207477" MODIFIED="1688847391104" TEXT="gemittelt: optimalen F&#xfc;llgrad steuern"/>
</node>
<node CREATED="1688846986442" ID="ID_514303739" MODIFIED="1688847240923" TEXT="&#x27f9; besser als ein TimingObservable mit Mittelwertbildung handhaben">
<arrowlink COLOR="#a11225" DESTINATION="ID_1197144274" ENDARROW="Default" ENDINCLINATION="206;-20;" ID="Arrow_ID_945653766" STARTARROW="None" STARTINCLINATION="-233;10;"/>
</node>
</node>
</node>
</node>
</node>
@ -79091,6 +79274,22 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1688847198318" ID="ID_1502450935" MODIFIED="1688847204841" TEXT="Zugriff und Verwendung">
<icon BUILTIN="hourglass"/>
<node CREATED="1688847208788" ID="ID_1229178383" MODIFIED="1688847225405" TEXT="Zweck">
<icon BUILTIN="info"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688847011314" ID="ID_1197144274" MODIFIED="1688847240923" TEXT="steuern der Epochen-L&#xe4;nge">
<linktarget COLOR="#a11225" DESTINATION="ID_1197144274" ENDARROW="Default" ENDINCLINATION="206;-20;" ID="Arrow_ID_945653766" SOURCE="ID_514303739" STARTARROW="None" STARTINCLINATION="-233;10;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1688851183024" ID="ID_371629266" MODIFIED="1688851189173" TEXT="#1317 capture Scheduler allocator behaviour">
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1688851167818" ID="ID_1469698148" MODIFIED="1688851173747" TEXT="#1316 regulate Scheduler memory allocation">
<icon BUILTIN="hourglass"/>
</node>
</node>
</node>
</node>
</node>
</node>
</node>