BufferProvider: planning of heuristics and implementation
Most relevant parts of the `LocalBufferStore` are already available and just need to be connected. One point poses a challenge however: when and how to trigger the heuristic clean-up of the local pool, so that ''on average neither too much memory is wasted, nor to much unnecessary allocations'' are performed... Signed-off-by: Ichthyostega <prg@ichthyostega.de>
This commit is contained in:
parent
7448b81d49
commit
c4db787b25
4 changed files with 458 additions and 34 deletions
|
|
@ -196,7 +196,7 @@ namespace mem {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ==== Implementation of the BufferProvider interface ==== */
|
/* ==== Implementation of the BufferStore interface ==== */
|
||||||
|
|
||||||
/** @note pre-anouncement is ignored */
|
/** @note pre-anouncement is ignored */
|
||||||
uint
|
uint
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,39 @@ namespace mem {
|
||||||
public:
|
public:
|
||||||
LocalBufferStore()
|
LocalBufferStore()
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
/* ==== Implementation of the BufferStore interface ==== */
|
||||||
|
|
||||||
|
uint
|
||||||
|
prepareBuffers (HashVal, uint numBuffers, size_t) override
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED ("announce");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** API: create a new buffer allocation */
|
||||||
|
BuffAlloc
|
||||||
|
provideBuffer (HashVal, size_t buffSiz, LocalTag specifics, int64_t) override
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED ("retrieve alloc");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** API: mark a buffer as _emitted_ */
|
||||||
|
void
|
||||||
|
mark_emitted (HashVal, BuffAlloc storageSlot) override
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED ("emit");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** API: mark a buffer as officially discarded */
|
||||||
|
void
|
||||||
|
detachBuffer (HashVal, BuffAlloc storageSlot) override
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED ("reclaim alloc");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,13 +20,18 @@
|
||||||
#include "test/test-helper.hpp"
|
#include "test/test-helper.hpp"
|
||||||
//#include "vault/mem/engine-buffer-metadata.hpp"
|
//#include "vault/mem/engine-buffer-metadata.hpp"
|
||||||
#include "vault/mem/local-buffer-store.hpp"
|
#include "vault/mem/local-buffer-store.hpp"
|
||||||
//#include "lib/depend-inject.hpp"
|
#include "vault/mem/engine-buffer-manager.hpp"
|
||||||
//#include "lib/thread.hpp"
|
#include "vault/mem/engine-buffer-allocator.hpp"
|
||||||
|
#include "lib/depend-inject.hpp"
|
||||||
|
#include "lib/thread.hpp"
|
||||||
//#include "lib/error.hpp"
|
//#include "lib/error.hpp"
|
||||||
|
#include "lib/util.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
//using std::this_thread::yield;
|
using util::isSameAdr;
|
||||||
//using lib::Thread;
|
using std::this_thread::yield;
|
||||||
|
using lib::Thread;
|
||||||
|
|
||||||
namespace vault {
|
namespace vault {
|
||||||
namespace mem {
|
namespace mem {
|
||||||
|
|
@ -61,17 +66,99 @@ namespace test {
|
||||||
virtual void
|
virtual void
|
||||||
run (Arg)
|
run (Arg)
|
||||||
{
|
{
|
||||||
seedRand();
|
// seedRand();
|
||||||
|
|
||||||
verify_DataTransfer();
|
verify_API();
|
||||||
verify_lulz();
|
verify_announce();
|
||||||
|
verify_allocate();
|
||||||
|
verify_release();
|
||||||
|
verify_heuristic();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @test */
|
/** @test */
|
||||||
void
|
void
|
||||||
verify_DataTransfer()
|
verify_API()
|
||||||
|
{
|
||||||
|
// provide a »central BufferPool« (as a transient instance for this test)
|
||||||
|
lib::DependInject<EngineBufferManager>::Local<EngineBufferManager> globalPool;
|
||||||
|
|
||||||
|
// provide the *test subject*,
|
||||||
|
// which implements the BufferStage API
|
||||||
|
// and uses a thread-local metadata table internally
|
||||||
|
LocalBufferStore localStore;
|
||||||
|
BufferProviderSetup::Store& storeAPI = localStore;
|
||||||
|
|
||||||
|
const size_t BUFFSIZ = 555;
|
||||||
|
const HashVal TYPEID = 12345;
|
||||||
|
const size_t CNT = 5;
|
||||||
|
const int64_t ARG = 7;
|
||||||
|
const LocalTag MARK{42};
|
||||||
|
|
||||||
|
const size_t ALLOC = HeapBufferAllocator::numTiles(BUFFSIZ) * HeapBufferAllocator::TILE_SIZ;
|
||||||
|
|
||||||
|
Thread testWorker{[&] /* === Play through one typical usage cycle === */ // ◁─────────────────┨ bla
|
||||||
|
{
|
||||||
|
uint avail = storeAPI.prepareBuffers(TYPEID, CNT, BUFFSIZ);
|
||||||
|
CHECK (0 == avail);
|
||||||
|
|
||||||
|
BuffAlloc storageSlot = storeAPI.provideBuffer (TYPEID, BUFFSIZ, MARK, ARG);
|
||||||
|
auto& [storage,buffSiz,specifics] = storageSlot;
|
||||||
|
CHECK (storage);
|
||||||
|
CHECK (BUFFSIZ <= buffSiz);
|
||||||
|
CHECK (ALLOC == buffSiz);
|
||||||
|
CHECK (MARK == specifics);
|
||||||
|
|
||||||
|
// can use that memory
|
||||||
|
char* buf = reinterpret_cast<char*> (storage);
|
||||||
|
std::string ranS{lib::randStr(555-1)};
|
||||||
|
auto* p = std::copy (ranS.begin(), ranS.end(), buf);
|
||||||
|
CHECK (ranS.length() == size_t(p - buf));
|
||||||
|
*p = '\0';
|
||||||
|
CHECK (ranS == buf);
|
||||||
|
|
||||||
|
storeAPI.mark_emitted (TYPEID, storageSlot);
|
||||||
|
storeAPI.detachBuffer (TYPEID, storageSlot);
|
||||||
|
|
||||||
|
avail = storeAPI.prepareBuffers(TYPEID, 2, BUFFSIZ);
|
||||||
|
CHECK (1 == avail);
|
||||||
|
|
||||||
|
BuffAlloc slot1 = storeAPI.provideBuffer (TYPEID, BUFFSIZ, MARK, ARG);
|
||||||
|
auto& [sto1,siz1,tag1] = slot1;
|
||||||
|
BuffAlloc slot2 = storeAPI.provideBuffer (TYPEID, BUFFSIZ, MARK, ARG);
|
||||||
|
auto& [sto2,siz2,tag2] = slot2;
|
||||||
|
CHECK (sto1);
|
||||||
|
CHECK (sto2);
|
||||||
|
CHECK (isSameAdr (storage, sto1));
|
||||||
|
CHECK (not isSameAdr (storage, sto1));
|
||||||
|
CHECK (BUFFSIZ <= siz1);
|
||||||
|
CHECK (BUFFSIZ <= siz2);
|
||||||
|
|
||||||
|
storeAPI.detachBuffer (TYPEID, slot2);
|
||||||
|
storeAPI.detachBuffer (TYPEID, slot1);
|
||||||
|
}}; // LocalMemPool winds down at end of thread
|
||||||
|
while (testWorker)
|
||||||
|
yield(); // wait for worker to finish
|
||||||
|
|
||||||
|
CHECK (globalPool); // the Mock was accessed (and thus instantiated)
|
||||||
|
|
||||||
|
// before shutdown, LocalMemPool has sent back all allocations;
|
||||||
|
// these should sit now in the EngineBufferManager's input queue
|
||||||
|
CHECK ( CNT+1 == watch(*globalPool).numAllocs());
|
||||||
|
CHECK ((CNT+1)*ALLOC == watch(*globalPool).bytesLeased());
|
||||||
|
|
||||||
|
// process in-queue and retrieve all allocations..
|
||||||
|
globalPool->processPendingRequests();
|
||||||
|
CHECK (0 == watch(*globalPool).bytesLeased());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @test
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
verify_announce()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -80,7 +167,25 @@ namespace test {
|
||||||
/** @test
|
/** @test
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
verify_lulz()
|
verify_allocate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @test
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
verify_release()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** @test
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
verify_heuristic()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -143862,6 +143862,26 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#ede2a7" COLOR="#242380" CREATED="1778802024913" ID="ID_575451700" MODIFIED="1778802301707">
|
||||||
|
<richcontent TYPE="NODE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
tatsächlich verfolge ich jetzt aber eine <i>elegante</i> andere Lösung....
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
...wodurch die Worker-Threads diese Aufgabe probabilistisch mit erledigen: wannimmer ein Worker eine Allokation angefordert hat, diese aber noch nicht zugestellt wurde, macht er mit globalem Lock eine Runde der Allokations-Arbeit
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
<arrowlink COLOR="#c9e1fe" DESTINATION="ID_1723782536" ENDARROW="Default" ENDINCLINATION="-2385;0;" ID="Arrow_ID_1515784613" STARTARROW="None" STARTINCLINATION="1597;63;"/>
|
||||||
|
<icon BUILTIN="idea"/>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1771436306089" ID="ID_862253994" MODIFIED="1771436308932" TEXT="für den Cache">
|
<node CREATED="1771436306089" ID="ID_862253994" MODIFIED="1771436308932" TEXT="für den Cache">
|
||||||
<node CREATED="1771436577677" ID="ID_636699078" MODIFIED="1771436613780" TEXT="grundsätzlich wäre das eine Hintergrund-Aktivität"/>
|
<node CREATED="1771436577677" ID="ID_636699078" MODIFIED="1771436613780" TEXT="grundsätzlich wäre das eine Hintergrund-Aktivität"/>
|
||||||
|
|
@ -143984,7 +144004,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<icon BUILTIN="hourglass"/>
|
<icon BUILTIN="hourglass"/>
|
||||||
<node CREATED="1771434625350" ID="ID_87043838" MODIFIED="1776718387608" TEXT="vorgreifende Vereinfachungen">
|
<node CREATED="1771434625350" ID="ID_87043838" MODIFIED="1776718387608" TEXT="vorgreifende Vereinfachungen">
|
||||||
<arrowlink COLOR="#1d52cb" DESTINATION="ID_675333491" ENDARROW="Default" ENDINCLINATION="-1046;-49;" ID="Arrow_ID_1903219737" STARTARROW="None" STARTINCLINATION="178;997;"/>
|
<arrowlink COLOR="#1d52cb" DESTINATION="ID_675333491" ENDARROW="Default" ENDINCLINATION="-1046;-49;" ID="Arrow_ID_1903219737" STARTARROW="None" STARTINCLINATION="178;997;"/>
|
||||||
<node CREATED="1771434938648" ID="ID_598910343" MODIFIED="1776718297756" TEXT="Anouncements ignorieren und jeweils per Heap allozieren">
|
<node COLOR="#5b280f" CREATED="1771434938648" ID="ID_598910343" MODIFIED="1778792994090" TEXT="Anouncements ignorieren und jeweils per Heap allozieren">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -143994,9 +144014,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
<icon BUILTIN="full-1"/>
|
<icon BUILTIN="full-1"/>
|
||||||
<icon BUILTIN="forward"/>
|
<icon BUILTIN="button_cancel"/>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1771434732657" ID="ID_1779414160" MODIFIED="1776718304320" TEXT="Verwaltung nur lokal im Thread">
|
<node COLOR="#5b280f" CREATED="1771434732657" ID="ID_1779414160" MODIFIED="1778793002887" TEXT="Verwaltung nur lokal im Thread">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -144006,7 +144026,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
<icon BUILTIN="full-2"/>
|
<icon BUILTIN="full-2"/>
|
||||||
<icon BUILTIN="hourglass"/>
|
<icon BUILTIN="button_cancel"/>
|
||||||
<node CREATED="1771434757430" ID="ID_460264122" MODIFIED="1771434936057" TEXT="es gibt dort bereits ein gewisses Pooling">
|
<node CREATED="1771434757430" ID="ID_460264122" MODIFIED="1771434936057" TEXT="es gibt dort bereits ein gewisses Pooling">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
|
|
@ -144019,7 +144039,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1771434769658" ID="ID_830753719" MODIFIED="1771434796468" TEXT="aber neu-Allokationen und Freigaben passieren direkt per Heap-Memory"/>
|
<node CREATED="1771434769658" ID="ID_830753719" MODIFIED="1771434796468" TEXT="aber neu-Allokationen und Freigaben passieren direkt per Heap-Memory"/>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1771435088490" ID="ID_1084049036" MODIFIED="1776718310328" TEXT="Zentraler Pool arbeitet identisch wie die thread-lokale Verwaltung">
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1771435088490" ID="ID_1084049036" MODIFIED="1778793214912" TEXT="Zentraler Pool arbeitet identisch wie die thread-lokale Verwaltung">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -144028,8 +144048,20 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
|
<arrowlink COLOR="#3b5dc9" DESTINATION="ID_1955682141" ENDARROW="Default" ENDINCLINATION="551;23;" ID="Arrow_ID_1141757705" STARTARROW="None" STARTINCLINATION="515;21;"/>
|
||||||
<icon BUILTIN="full-3"/>
|
<icon BUILTIN="full-3"/>
|
||||||
<icon BUILTIN="hourglass"/>
|
<icon BUILTIN="forward"/>
|
||||||
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#af054b" CREATED="1778793138391" ID="ID_1072005423" MODIFIED="1778793228369" TEXT="mußte doch bis auf diesen Level implementieren...">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
...habe mich ganz schön sauber in den internen Problemen und Widersprüchen des Design-Plans verstrickt, so daß ich letztlich die Struktur bereits weitgehend ausarbeiten mußte, um den Knoten aufzulösen...
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
<icon BUILTIN="smily_bad"/>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1776195345475" ID="ID_773105612" MODIFIED="1776195351345" TEXT="Problem der Code-Struktur">
|
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1776195345475" ID="ID_773105612" MODIFIED="1776195351345" TEXT="Problem der Code-Struktur">
|
||||||
|
|
@ -144813,6 +144845,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<linktarget COLOR="#1d52cb" DESTINATION="ID_675333491" ENDARROW="Default" ENDINCLINATION="-1046;-49;" ID="Arrow_ID_1903219737" SOURCE="ID_87043838" STARTARROW="None" STARTINCLINATION="178;997;"/>
|
<linktarget COLOR="#1d52cb" DESTINATION="ID_675333491" ENDARROW="Default" ENDINCLINATION="-1046;-49;" ID="Arrow_ID_1903219737" SOURCE="ID_87043838" STARTARROW="None" STARTINCLINATION="178;997;"/>
|
||||||
<node CREATED="1776720614578" ID="ID_1271966009" MODIFIED="1776720628696" TEXT="im ersten Schritt ohne Pooling, direkt auf den Heap"/>
|
<node CREATED="1776720614578" ID="ID_1271966009" MODIFIED="1776720628696" TEXT="im ersten Schritt ohne Pooling, direkt auf den Heap"/>
|
||||||
<node CREATED="1776720640172" ID="ID_953357896" MODIFIED="1776720658883" TEXT="dann eine einfache Pool-Steuerung dazubauen"/>
|
<node CREATED="1776720640172" ID="ID_953357896" MODIFIED="1776720658883" TEXT="dann eine einfache Pool-Steuerung dazubauen"/>
|
||||||
|
<node CREATED="1778793110179" ID="ID_1045866724" MODIFIED="1778793122185" TEXT="muß dann aber doch überlegen wie das async-messaging funktioniert"/>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776720939330" ID="ID_1122029657" MODIFIED="1776720953799" TEXT="eine Test-Instrumentierung muß mit entwickelt werden">
|
<node CREATED="1776720939330" ID="ID_1122029657" MODIFIED="1776720953799" TEXT="eine Test-Instrumentierung muß mit entwickelt werden">
|
||||||
<node CREATED="1776720954934" ID="ID_533496174" MODIFIED="1776721127952" TEXT="Vorbild ist der BlockFlow">
|
<node CREATED="1776720954934" ID="ID_533496174" MODIFIED="1776721127952" TEXT="Vorbild ist der BlockFlow">
|
||||||
|
|
@ -144910,13 +144943,253 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
<arrowlink COLOR="#a9837f" DESTINATION="ID_1559459005" ENDARROW="Default" ENDINCLINATION="-5;115;" ID="Arrow_ID_93328070" STARTARROW="Default" STARTINCLINATION="-339;11;"/>
|
<arrowlink COLOR="#a9837f" DESTINATION="ID_1559459005" ENDARROW="Default" ENDINCLINATION="-5;115;" ID="Arrow_ID_93328070" STARTARROW="Default" STARTINCLINATION="-339;11;"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1778792142467" ID="ID_471365898" MODIFIED="1778792259242" TEXT="nach detaillierter Abwägung entscheide ich, diese Redundanz zu ignorieren">
|
||||||
|
<arrowlink COLOR="#651733" DESTINATION="ID_1964767554" ENDARROW="Default" ENDINCLINATION="-12;-2292;" ID="Arrow_ID_1601176637" STARTARROW="None" STARTINCLINATION="-1569;56;"/>
|
||||||
|
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||||
|
<icon BUILTIN="yes"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778800010518" ID="ID_653507071" MODIFIED="1778800029578" TEXT="damit ergibt sich das Nutz-Muster">
|
||||||
|
<node CREATED="1778800031791" ID="ID_367166647" MODIFIED="1778800110299" TEXT="die Allocation-Pools arbeiten mit kleinen Alloc-Records">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
...die nur die minimalen Informationen enthalten, also die Speicheradresse und -Größe. Solche Allokationen <i>gehören</i>  stets dem EngineBufferManager, können aber verschickt und damit »verliehen« werden
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778800112467" ID="ID_101690828" MODIFIED="1778800147358" TEXT="der LocalMemPool hat eine rein-interne Datenhaltung für die Bewertung und Auswahl"/>
|
||||||
|
<node CREATED="1778800372961" ID="ID_1456498130" MODIFIED="1778800389062" TEXT="Allokationen dagegen sind rein ein Belang des Allocators"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776722100558" ID="ID_1140947088" MODIFIED="1776722105058" TEXT="LocalMemPool_test"/>
|
<node BACKGROUND_COLOR="#a9d8a7" COLOR="#338800" CREATED="1776722100558" ID="ID_1140947088" MODIFIED="1778800333726" STYLE="fork" TEXT="im Rahmen des Prototyping implementiert und getestet">
|
||||||
|
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
|
||||||
|
<arrowlink COLOR="#357fd6" DESTINATION="ID_1385383632" ENDARROW="Default" ENDINCLINATION="-1147;-1723;" ID="Arrow_ID_997338547" STARTARROW="None" STARTINCLINATION="-513;25;"/>
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776204787207" ID="ID_1425789996" MODIFIED="1776204792254" TEXT="vorerst nur anlegen">
|
<node CREATED="1778800412568" ID="ID_15988377" MODIFIED="1778800420157" TEXT="kann nun Implementierung einfügen">
|
||||||
|
<node COLOR="#338800" CREATED="1778800421847" ID="ID_1548904968" MODIFIED="1778800556897" TEXT="das Kommunikations-Schema wurde bereits abstrakt entwickelt und getestet">
|
||||||
|
<arrowlink COLOR="#11c58f" DESTINATION="ID_1722546045" ENDARROW="Default" ENDINCLINATION="-2280;-262;" ID="Arrow_ID_75214759" STARTARROW="None" STARTINCLINATION="-645;23;"/>
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1778801228103" ID="ID_215195213" MODIFIED="1778979214616" TEXT="minimale Funktionalität anstreben — weitgehend alles delegieren">
|
||||||
|
<icon BUILTIN="yes"/>
|
||||||
|
<node CREATED="1778802374835" ID="ID_1565150362" MODIFIED="1778802383352" TEXT="der Store muß selber keinerlei Tracking mehr machen"/>
|
||||||
|
<node CREATED="1778802388611" ID="ID_770567636" MODIFIED="1778802403241" TEXT="Allokationen werden vom LocalMemPool angefordert"/>
|
||||||
|
<node CREATED="1778802404433" ID="ID_1753143521" MODIFIED="1778802411586" TEXT="und lediglich an diesen zurückgegeben"/>
|
||||||
|
<node CREATED="1778802416765" ID="ID_911669908" MODIFIED="1778802488853" TEXT="Speicheradresse als Identität">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Auch der LocalMemPool arbeitet auf dieser Basis: er hat eine lineare Liste (die als klein angenommen wird, so daß lineare Suche genügt), in der eine Allokation wiedergefunden wird
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1778979188506" ID="ID_1435066016" MODIFIED="1778979206192" TEXT="Zugriff auf Thread-Local Mem-Pool und EngineBufferManager">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1778802491003" ID="ID_1880673250" MODIFIED="1778979225756" TEXT="brauche noch einen Trigger-Mechanismus für das heuristische Clean-up">
|
||||||
|
<icon BUILTIN="yes"/>
|
||||||
|
<node CREATED="1778805833301" ID="ID_493965127" MODIFIED="1778806330596" TEXT="man könnte nach jeder de-Allokation einen partiellen clean-up machen">
|
||||||
|
<node CREATED="1778805853860" ID="ID_1555068699" MODIFIED="1778806001396" TEXT="wäre wirksam, da nur unterhalb der Schwelle aufgeräumt wird">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Es würden dann oft gar keine Blöcke zurückgesandt, sofern die meisten freien Blöcke einen guten Score haben
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778805933680" ID="ID_1480655883" MODIFIED="1778806266138" TEXT="auch verwendete und reservierte Blöcke wären außen vor">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
ein reservierter (oder verwendeter) Block ist <i>festgehalten,</i> selbst wenn er keinen guten Score hat; erst nachdem er einmal tatsächlich gebraucht wurde, kommt er wieder in Zirkulation
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778805944800" ID="ID_1470728828" MODIFIED="1778806323720" TEXT="allerdings ist das (linear) aufwendig">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Es müßt nach jeder de-Allokation die ganze Blockliste gescannt werden, wobei erwartungsgemäß nach den meisten Scans nichts zur Freigabe gefunden wird
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
</richcontent>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778806342604" ID="ID_447948169" MODIFIED="1778806371642" TEXT="man könnte stattdessen das Prüf-Intervall vergrößern">
|
||||||
|
<node CREATED="1778806422659" ID="ID_209215056" MODIFIED="1778806429636" TEXT="das wäre ein einfacher Zähler"/>
|
||||||
|
<node CREATED="1778806430506" ID="ID_1204281805" MODIFIED="1778806482405" TEXT="aber Festlegen der richtigen Frequenz ist schwierig">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
...und würde letztlich doch wieder darauf hinauslaufen, daß man irgendwie einen wachsenden Leerlauf erkennt
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778806374342" ID="ID_1184281449" MODIFIED="1778806407316" TEXT="oder man könnte eine Kennzahl bilden, die den Overhead repräsentiert">
|
||||||
|
<node CREATED="1778806682396" ID="ID_1994737812" MODIFIED="1778806693783" TEXT="ist aber nicht unmittelbar klar, wie das gehen soll"/>
|
||||||
|
<node CREATED="1778806951977" ID="ID_578362748" MODIFIED="1778806975305" TEXT="für eine inhaltlich bezogene Kennzahl sind Integrale notwendig"/>
|
||||||
|
<node CREATED="1778806977102" ID="ID_248750955" MODIFIED="1778807108123" TEXT="und diese sind ebenfalls aufwendig zu berechnen — oder fehleranfällig">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
jede Integral-Berechnung bedingt mindestens einen vollen Scan — und dann hätte man auch einen Cleanup-Lauf machen können. Alternativ könnte man versuchen, Integrale (wie z.B. einen Durchschintts-Score) durch Fortschreiben mitzuführen. Das macht den Code aber komplex, schwer lesbar und fehleranfällig (weil man zuverlässig jeden Zugriff und jede Änderung erfassen muß)
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778807256655" ID="ID_780111085" MODIFIED="1778807348968" TEXT="zudem ist eine zeitweilig nur geringe Auslatung nicht notwendig problematisch">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Grade wenn die Berechnung kurzzeitige Speicherbedarfs-Spitzen aufweist, wäre es sogar schädlich, eine ungenutzte Reserve aggressiv wieder aufzuräumen
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778807528300" ID="ID_1103283661" MODIFIED="1778807637131" TEXT="obendrein kann der BufferStore nicht wissen, an welcher Stelle im Job-Zyklus der Worker ist">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Idealerweise würde ein heuristischer Clean-up stets am Ende eines Job erfolgen, aber nicht irgendwo mittendrin
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778807703620" ID="ID_259340071" MODIFIED="1778807710432" TEXT="theoretische Feststellungen">
|
||||||
|
<node CREATED="1778807713013" ID="ID_1591472662" MODIFIED="1778807729459" TEXT="bei guter Anpassung wächst der Score aller Blöcke gleichermaßen"/>
|
||||||
|
<node CREATED="1778807756996" ID="ID_1925785341" MODIFIED="1778807811257" TEXT="bei Kapazitätsüberschuß haben viele Blöcke einen deutlich geringeren Score"/>
|
||||||
|
<node CREATED="1778946963640" ID="ID_993736225" MODIFIED="1778946997115" TEXT="bei Leerlauf wächst der Score weniger Blöcke (und damit der Max-Score) überproportional"/>
|
||||||
|
<node CREATED="1778807937581" ID="ID_1900765984" MODIFIED="1778807970854" TEXT="bei lokaler Knappheit werden viele Allokations-Anforderungen gesandt"/>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778945962154" ID="ID_535774391" MODIFIED="1778945972518" TEXT="daraus einen Mechanismus entwickeln">
|
||||||
|
<icon BUILTIN="idea"/>
|
||||||
|
<node CREATED="1778946005609" ID="ID_1483973980" MODIFIED="1778946757293" TEXT="Ansatz: die bereits implementierte Aufräum-Heuristik ist zielführend">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
denn sie findet ja die selten verwendeten Buffer — und bei hinreichend gleichmäßiger Verwendung findet sie gar nichts
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778946759356" ID="ID_58112277" MODIFIED="1778947643959" TEXT="benötigt wird nur noch eine flexible Dämpfung">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
um zu verhindern, daß wir andauernd scannen und auch voreilig Buffer wegräumen, die Kapazitätsspitzen abfangen könnten
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778947001639" ID="ID_78533321" MODIFIED="1778947098163" TEXT="Idee: »turnover« — jedem Block eine Chance geben">
|
||||||
|
<icon BUILTIN="forward"/>
|
||||||
|
<node CREATED="1778947114570" ID="ID_914679223" MODIFIED="1778947126240" TEXT="ankommende Blöcke erhöhen den Turnover"/>
|
||||||
|
<node CREATED="1778947127539" ID="ID_253931638" MODIFIED="1778947136630" TEXT="jede de-Allokation veringert den Turnover"/>
|
||||||
|
<node CREATED="1778948418531" ID="ID_1565059399" MODIFIED="1778948435266" TEXT="nach dem Aufräumen wird der Turnoer auf die aktuelle Poolsize gesetzt"/>
|
||||||
|
<node CREATED="1778947233953" ID="ID_1828464374" MODIFIED="1778947258422">
|
||||||
|
<richcontent TYPE="NODE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
<u>einfacher Trigger</u>: prüfen wenn der Turnover auf Null fällt
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778947673427" ID="ID_293933324" MODIFIED="1778947693056">
|
||||||
|
<richcontent TYPE="NODE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
<u>heuristischer Trigger</u>: Max-Score einbeziehen
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
<node CREATED="1778947842948" ID="ID_24266582" MODIFIED="1778948022346" TEXT="bei gleichmäßiger Nutzung wächst der Max-Score nur einen Schritt">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Bei perfektem Match bekommt jeder Block einmal im Turnover-Zyklus die volle Punktzahl gutgeschrieben. Wenn dagegen ein Block dominiert, dann bekommt dieser T·Punktzahl
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html></richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778948068575" ID="ID_855345858" MODIFIED="1778948159062" TEXT="verwende also MaxScore / MATCH_SCORE als Triggerschwelle gegen den Turnout"/>
|
||||||
|
<node CREATED="1778948224807" ID="ID_1282800052" MODIFIED="1778948275175" TEXT="zusätzlicher Gewichtsfaktor um die Schärfe der Überprüfung zu regulieren"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778948347649" ID="ID_288471074" MODIFIED="1778948354192" TEXT="erwartetes Verhalten">
|
||||||
|
<node CREATED="1778948371158" ID="ID_1349452477" MODIFIED="1778948397466" TEXT="möglicherweise geprüft wird nach einer de-Allokation"/>
|
||||||
|
<node CREATED="1778948398746" ID="ID_763933408" MODIFIED="1778948411228" TEXT="zu-Allokationen schieben den Prüfzeitpunkt hinaus"/>
|
||||||
|
<node CREATED="1778948485011" ID="ID_834812028" MODIFIED="1778948501849" TEXT="wenn nur ein einziger Block aktiv ist, wird nach dem halben Turnover geprüft"/>
|
||||||
|
<node CREATED="1778948503130" ID="ID_114608227" MODIFIED="1778948529822" TEXT="nachdem durch einen hohen MaxScore vorzeitig ausgelöst wurde, ist das Prüfintervall kürzer"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1778800559849" ID="ID_1776275235" MODIFIED="1778800646883" TEXT="LocalBufferStore_test">
|
||||||
|
<icon BUILTIN="pencil"/>
|
||||||
|
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1778800660632" ID="ID_864970874" MODIFIED="1778979160301" TEXT="Zweck">
|
||||||
|
<icon BUILTIN="yes"/>
|
||||||
|
<node CREATED="1778800664656" ID="ID_690903258" MODIFIED="1778800678906" TEXT="Aufbau der Implemenrierung treiben"/>
|
||||||
|
<node CREATED="1778800684264" ID="ID_1722512715" MODIFIED="1778800718145" TEXT="korrektes Verhalten auf API-Level zeigen"/>
|
||||||
|
<node CREATED="1778948633708" ID="ID_1152843800" MODIFIED="1778948643382" TEXT="Steuer-Heuristik beobachten"/>
|
||||||
|
<node CREATED="1778948730082" ID="ID_868291823" MODIFIED="1778948736909" TEXT="Grenzfälle / Lebenszyklus"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1778948838374" ID="ID_1190893477" MODIFIED="1778979151352" TEXT="verify_API">
|
||||||
|
<icon BUILTIN="pencil"/>
|
||||||
|
<node CREATED="1778948874440" ID="ID_619417705" MODIFIED="1778948892430" TEXT="Allokation ankündigen"/>
|
||||||
|
<node CREATED="1778948897541" ID="ID_625050889" MODIFIED="1778948901900" TEXT="Allokation beziehen"/>
|
||||||
|
<node CREATED="1778948902738" ID="ID_324329976" MODIFIED="1778948908603" TEXT="weitere Allokation beziehen"/>
|
||||||
|
<node CREATED="1778948910157" ID="ID_131928895" MODIFIED="1778948916538" TEXT="beide zurückgeben"/>
|
||||||
|
<node CREATED="1778948920382" ID="ID_77474536" MODIFIED="1778948938383" TEXT="noch eine Allokation"/>
|
||||||
|
<node CREATED="1778948939771" ID="ID_1407930950" MODIFIED="1778948943134" TEXT="Thread beenden"/>
|
||||||
|
<node CREATED="1778979132916" ID="ID_393345688" MODIFIED="1778979147235" TEXT="Anzahl tatsächlicher Allokationen prüfen"/>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778948944946" ID="ID_399276838" MODIFIED="1778948954589" TEXT="verify_announce">
|
||||||
|
<node CREATED="1778948971327" ID="ID_655345868" MODIFIED="1778948993943" TEXT="muß hier die Prüfung bei laufendem Worker-Thread machen (barrier)"/>
|
||||||
|
<node CREATED="1778948997109" ID="ID_1331981737" MODIFIED="1778949018089" TEXT="Announcment muß im Engine-Pool sichtbar sein"/>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778949021417" ID="ID_1256480563" MODIFIED="1778968909103" TEXT="verify_allocate">
|
||||||
|
<node CREATED="1778969027419" ID="ID_1633706484" MODIFIED="1778969039237" TEXT="gemeint ist: eine direkte Allokation, ohne Ankündigung"/>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778968918381" ID="ID_752345967" MODIFIED="1778968922655" TEXT="verify_release">
|
||||||
|
<node CREATED="1778969042432" ID="ID_1262962638" MODIFIED="1778969052166" TEXT="hier sollte auch ein clean-up provoziert werden"/>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778969102656" ID="ID_249806133" MODIFIED="1778969116594" TEXT="verify_heuristic">
|
||||||
|
<node CREATED="1778979230293" ID="ID_683051783" MODIFIED="1778979241071" TEXT="meine Idee der Heuristik umsetzen"/>
|
||||||
|
<node CREATED="1778979241959" ID="ID_959604784" MODIFIED="1778979251687" TEXT="mit einzelnen Grenz-Szenarien durchspielen"/>
|
||||||
|
<node CREATED="1778979252922" ID="ID_1913037138" MODIFIED="1778979264429" TEXT="Verhalten sollte deterministisch vorhersagbar sein"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1778800594638" ID="ID_267050112" LINK="#ID_318881353" MODIFIED="1778800638798" TEXT="siehe EngineBufferManager_test"/>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1776204787207" ID="ID_1425789996" MODIFIED="1778792001986" TEXT="entwickeln soweit notwendig">
|
||||||
<node COLOR="#338800" CREATED="1776204765269" ID="ID_1404790840" MODIFIED="1776718452275" TEXT="EngineBufferMetadata">
|
<node COLOR="#338800" CREATED="1776204765269" ID="ID_1404790840" MODIFIED="1776718452275" TEXT="EngineBufferMetadata">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node CREATED="1776605957061" ID="ID_405169256" MODIFIED="1776606058887" TEXT="eigenständiger Service">
|
<node CREATED="1776605957061" ID="ID_405169256" MODIFIED="1776606058887" TEXT="eigenständiger Service">
|
||||||
|
|
@ -145008,10 +145281,20 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1776204795573" ID="ID_1001789565" MODIFIED="1776718587143" TEXT="EngineBufferManager">
|
<node COLOR="#338800" CREATED="1776204795573" ID="ID_1001789565" MODIFIED="1778800580244" TEXT="EngineBufferManager">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
<node CREATED="1778792315684" ID="ID_1791813360" MODIFIED="1778792397575" TEXT="nun doch bereits grundsätzlich fertig implementiert">
|
||||||
|
<arrowlink COLOR="#1b1ac0" DESTINATION="ID_1998897998" ENDARROW="Default" ENDINCLINATION="15;-85;" ID="Arrow_ID_1964764365" STARTARROW="None" STARTINCLINATION="-438;24;"/>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1778792406944" ID="ID_647851114" MODIFIED="1778792432142" TEXT="beinhaltet auch die Ausarbeitung der asynchronen Kommunikation mit den lokalen Pools"/>
|
||||||
|
<node CREATED="1778792433573" ID="ID_1955682141" MODIFIED="1778793091179" TEXT="jedoch den Memory-Manager lasse ich aus (verwende Heap-Allocations)">
|
||||||
|
<linktarget COLOR="#3b5dc9" DESTINATION="ID_1955682141" ENDARROW="Default" ENDINCLINATION="551;23;" ID="Arrow_ID_1141757705" SOURCE="ID_1084049036" STARTARROW="None" STARTINCLINATION="515;21;"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1778792452930" ID="ID_1493734301" LINK="https://issues.lumiera.org/ticket/1430" MODIFIED="1778792804901" TEXT="geplant ist ein Pool-Allokator (#1430)">
|
||||||
<icon BUILTIN="hourglass"/>
|
<icon BUILTIN="hourglass"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
</node>
|
||||||
<node CREATED="1776442826894" ID="ID_509761355" MODIFIED="1776442834087" TEXT="OutputSlot mit integrieren">
|
<node CREATED="1776442826894" ID="ID_509761355" MODIFIED="1776442834087" TEXT="OutputSlot mit integrieren">
|
||||||
<node CREATED="1776442835820" ID="ID_1709918207" MODIFIED="1776442866636" TEXT="der integrierte OutputBufferProxy hat auch eine BufferStage-Implementierung"/>
|
<node CREATED="1776442835820" ID="ID_1709918207" MODIFIED="1776442866636" TEXT="der integrierte OutputBufferProxy hat auch eine BufferStage-Implementierung"/>
|
||||||
<node CREATED="1776442867383" ID="ID_1166356526" MODIFIED="1776442917901" TEXT="diese ist bisher hart gecodet — könnte natürlich (statisch) konfigurierbar sein"/>
|
<node CREATED="1776442867383" ID="ID_1166356526" MODIFIED="1776442917901" TEXT="diese ist bisher hart gecodet — könnte natürlich (statisch) konfigurierbar sein"/>
|
||||||
|
|
@ -145045,7 +145328,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776783102911" ID="ID_1474311402" MODIFIED="1776783117962" TEXT="Analyse Gesamtablauf">
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#311d85" CREATED="1776783102911" ID="ID_1474311402" MODIFIED="1778792288798" TEXT="Analyse Gesamtablauf">
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
<node CREATED="1776783177514" ID="ID_426565530" MODIFIED="1776783444987" TEXT="Anlaß: Limitierungen der bisherigen Betrachtungsweise">
|
<node CREATED="1776783177514" ID="ID_426565530" MODIFIED="1776783444987" TEXT="Anlaß: Limitierungen der bisherigen Betrachtungsweise">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
|
@ -145264,7 +145547,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776808117872" ID="ID_1054840028" MODIFIED="1776808168037" TEXT="die State-Engine gehört dem Buffer-Manager">
|
<node CREATED="1776808117872" ID="ID_1054840028" MODIFIED="1778792632097" TEXT="die State-Engine gehört dem Buffer-Manager">
|
||||||
|
<icon BUILTIN="forward"/>
|
||||||
<node CREATED="1776808169588" ID="ID_325963604" MODIFIED="1776808183067" TEXT="die State-Flag ist Teil des Allokations-Deskriptors"/>
|
<node CREATED="1776808169588" ID="ID_325963604" MODIFIED="1776808183067" TEXT="die State-Flag ist Teil des Allokations-Deskriptors"/>
|
||||||
<node CREATED="1776808189543" ID="ID_730809908" MODIFIED="1776808207957" TEXT="der Allokations-Deskriptor kann optional einen typ-Hash speichern">
|
<node CREATED="1776808189543" ID="ID_730809908" MODIFIED="1776808207957" TEXT="der Allokations-Deskriptor kann optional einen typ-Hash speichern">
|
||||||
<node CREATED="1776808235361" ID="ID_1954060088" MODIFIED="1776808346046" TEXT="Vorsicht: sicherstellen daß valider Hash niemals Null wird">
|
<node CREATED="1776808235361" ID="ID_1954060088" MODIFIED="1776808346046" TEXT="Vorsicht: sicherstellen daß valider Hash niemals Null wird">
|
||||||
|
|
@ -145317,7 +145601,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1776809679448" ID="ID_1620167252" MODIFIED="1776809696176" TEXT="wie werden Buffer-Allokationen zugeteilt / zurückgegeben?"/>
|
<node CREATED="1776809679448" ID="ID_1620167252" MODIFIED="1776809696176" TEXT="wie werden Buffer-Allokationen zugeteilt / zurückgegeben?"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1776810818641" ID="ID_1990109101" MODIFIED="1776810830162" TEXT="Erweiterung der bestehenden Struktur">
|
<node COLOR="#5b280f" CREATED="1776810818641" ID="ID_1990109101" MODIFIED="1778792564355" TEXT="Erweiterung der bestehenden Struktur">
|
||||||
|
<icon BUILTIN="button_cancel"/>
|
||||||
<node CREATED="1776810842916" ID="ID_1308910879" MODIFIED="1776810900632" TEXT="Ansatz: der Store bekommt eine Direkt-Verbindung zu BufferMetadata">
|
<node CREATED="1776810842916" ID="ID_1308910879" MODIFIED="1776810900632" TEXT="Ansatz: der Store bekommt eine Direkt-Verbindung zu BufferMetadata">
|
||||||
<node CREATED="1776810904516" ID="ID_467003761" MODIFIED="1776811035606" TEXT="läßt sich realisieren unter Ausnützung des LocalSlice">
|
<node CREATED="1776810904516" ID="ID_467003761" MODIFIED="1776811035606" TEXT="läßt sich realisieren unter Ausnützung des LocalSlice">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
|
@ -145510,7 +145795,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1776817873864" ID="ID_1964767554" MODIFIED="1777317537379" TEXT="Diskussion und Abwägung">
|
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1776817873864" ID="ID_1964767554" MODIFIED="1778792259242" TEXT="Diskussion und Abwägung">
|
||||||
|
<linktarget COLOR="#651733" DESTINATION="ID_1964767554" ENDARROW="Default" ENDINCLINATION="-12;-2292;" ID="Arrow_ID_1601176637" SOURCE="ID_471365898" STARTARROW="None" STARTINCLINATION="-1569;56;"/>
|
||||||
<node CREATED="1776817881283" ID="ID_1958629364" MODIFIED="1776817923320" TEXT="tatsächlich liegen die Modelle gar nicht so weit auseinander....">
|
<node CREATED="1776817881283" ID="ID_1958629364" MODIFIED="1776817923320" TEXT="tatsächlich liegen die Modelle gar nicht so weit auseinander....">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
|
|
@ -145921,7 +146207,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<node CREATED="1777024772191" ID="ID_645148091" MODIFIED="1777024802721" TEXT="erneute Allokation mit gleicher Adresse aus FREE-State zulassen"/>
|
<node CREATED="1777024772191" ID="ID_645148091" MODIFIED="1777024802721" TEXT="erneute Allokation mit gleicher Adresse aus FREE-State zulassen"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#435e98" CREATED="1777050407430" ID="ID_1385383632" MODIFIED="1777317323338" TEXT="LocalMemPool">
|
<node COLOR="#435e98" CREATED="1777050407430" ID="ID_1385383632" MODIFIED="1778800333726" TEXT="LocalMemPool">
|
||||||
|
<linktarget COLOR="#357fd6" DESTINATION="ID_1385383632" ENDARROW="Default" ENDINCLINATION="-1147;-1723;" ID="Arrow_ID_997338547" SOURCE="ID_1140947088" STARTARROW="None" STARTINCLINATION="-513;25;"/>
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
<node CREATED="1777050440887" ID="ID_1006627416" MODIFIED="1777066692859" TEXT="Verhalten spezifizieren">
|
<node CREATED="1777050440887" ID="ID_1006627416" MODIFIED="1777066692859" TEXT="Verhalten spezifizieren">
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
|
|
@ -145932,7 +146219,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
zwar wird das niemals einer konkreten Allokation vorgreifen, sollte aber <i>den internen Seiten-Effekt haben daß Pool-Eingräge »beiseitegelegt« werden.</i>  Denn sonst würden die gleichen Einträge u.U. für nachfolgende Vorankündigungen nochmal verbucht werden, wodurch dann insgesamt zu wenig zusätzlicher Speicher angefordert wird. Das bedeutet, wir brauchen nicht nur eine Flag, sondern verschiedene Grade der Reservierung
|
zwar wird das niemals einer konkreten Allokation vorgreifen, sollte aber <i>den internen Seiten-Effekt haben daß Pool-Einträge »beiseitegelegt« werden.</i>  Denn sonst würden die gleichen Einträge u.U. für nachfolgende Vorankündigungen nochmal verbucht werden, wodurch dann insgesamt zu wenig zusätzlicher Speicher angefordert wird. Das bedeutet, wir brauchen nicht nur eine Flag, sondern verschiedene Grade der Reservierung
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
|
|
@ -146161,7 +146448,8 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1776819109351" ID="ID_1998897998" MODIFIED="1777339324992" TEXT="EngineBufferManager">
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1776819109351" ID="ID_1998897998" MODIFIED="1778792397575" TEXT="EngineBufferManager">
|
||||||
|
<linktarget COLOR="#1b1ac0" DESTINATION="ID_1998897998" ENDARROW="Default" ENDINCLINATION="15;-85;" ID="Arrow_ID_1964764365" SOURCE="ID_1791813360" STARTARROW="None" STARTINCLINATION="-438;24;"/>
|
||||||
<icon BUILTIN="yes"/>
|
<icon BUILTIN="yes"/>
|
||||||
<node COLOR="#338800" CREATED="1776819156872" ID="ID_1476925601" MODIFIED="1778788622379" TEXT="Grundkonzeption schaffen">
|
<node COLOR="#338800" CREATED="1776819156872" ID="ID_1476925601" MODIFIED="1778788622379" TEXT="Grundkonzeption schaffen">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
|
|
@ -146819,8 +147107,9 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#a9d8a7" COLOR="#338800" CREATED="1778694426989" ID="ID_1722546045" MODIFIED="1778694529807" TEXT="funktioniert im Test">
|
<node BACKGROUND_COLOR="#a9d8a7" COLOR="#338800" CREATED="1778694426989" ID="ID_1722546045" MODIFIED="1778800556897" TEXT="funktioniert im Test">
|
||||||
<arrowlink COLOR="#12d25a" DESTINATION="ID_389422946" ENDARROW="Default" ENDINCLINATION="-296;-885;" ID="Arrow_ID_533922798" STARTARROW="None" STARTINCLINATION="158;20;"/>
|
<arrowlink COLOR="#12d25a" DESTINATION="ID_389422946" ENDARROW="Default" ENDINCLINATION="-296;-885;" ID="Arrow_ID_533922798" STARTARROW="None" STARTINCLINATION="158;20;"/>
|
||||||
|
<linktarget COLOR="#11c58f" DESTINATION="ID_1722546045" ENDARROW="Default" ENDINCLINATION="-2280;-262;" ID="Arrow_ID_75214759" SOURCE="ID_1548904968" STARTARROW="None" STARTINCLINATION="-645;23;"/>
|
||||||
<icon BUILTIN="forward"/>
|
<icon BUILTIN="forward"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
|
@ -146877,7 +147166,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#e2dbb4" CREATED="1778592973322" ID="ID_1723782536" MODIFIED="1778635048385" TEXT="hybrid-Lösung: der synchrone Fall schiebt den asynchronen Fall">
|
<node BACKGROUND_COLOR="#e2dbb4" CREATED="1778592973322" ID="ID_1723782536" MODIFIED="1778802160285" TEXT="hybrid-Lösung: der synchrone Fall schiebt den asynchronen Fall">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -146888,6 +147177,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
<arrowlink COLOR="#e7f3c5" DESTINATION="ID_1339362365" ENDARROW="Default" ENDINCLINATION="273;14;" ID="Arrow_ID_74341588" STARTARROW="None" STARTINCLINATION="226;-11;"/>
|
<arrowlink COLOR="#e7f3c5" DESTINATION="ID_1339362365" ENDARROW="Default" ENDINCLINATION="273;14;" ID="Arrow_ID_74341588" STARTARROW="None" STARTINCLINATION="226;-11;"/>
|
||||||
<linktarget COLOR="#cffd68" DESTINATION="ID_1723782536" ENDARROW="Default" ENDINCLINATION="2031;68;" ID="Arrow_ID_1674470149" SOURCE="ID_226540112" STARTARROW="None" STARTINCLINATION="1004;42;"/>
|
<linktarget COLOR="#cffd68" DESTINATION="ID_1723782536" ENDARROW="Default" ENDINCLINATION="2031;68;" ID="Arrow_ID_1674470149" SOURCE="ID_226540112" STARTARROW="None" STARTINCLINATION="1004;42;"/>
|
||||||
|
<linktarget COLOR="#c9e1fe" DESTINATION="ID_1723782536" ENDARROW="Default" ENDINCLINATION="-2385;0;" ID="Arrow_ID_1515784613" SOURCE="ID_575451700" STARTARROW="None" STARTINCLINATION="1597;63;"/>
|
||||||
<icon BUILTIN="forward"/>
|
<icon BUILTIN="forward"/>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1778508357967" ID="ID_1467114460" MODIFIED="1778508767506" TEXT="naheliegende Lösung: Hintergrundthread">
|
<node CREATED="1778508357967" ID="ID_1467114460" MODIFIED="1778508767506" TEXT="naheliegende Lösung: Hintergrundthread">
|
||||||
|
|
@ -147123,9 +147413,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
<node CREATED="1778788087357" ID="ID_502254218" MODIFIED="1778788224843" TEXT="manchmal müssen Referenzen an den Konstruktor übergeben werden">
|
<node CREATED="1778788087357" ID="ID_502254218" MODIFIED="1778788224843" TEXT="manchmal müssen Referenzen an den Konstruktor übergeben werden">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
...und das geht nicht mit dem fill()-Populator, denn dieser materialisiert alle Argumente als Kopien. Man könnte das ändern, müßte dann aber explizit ein perfect-forwarding-Tupel bauen. Das war mir jetzt alles zu mühsam
|
...und das geht nicht mit dem fill()-Populator, denn dieser materialisiert alle Argumente als Kopien. Man könnte das ändern, müßte dann aber explizit ein perfect-forwarding-Tupel bauen. Das war mir jetzt alles zu mühsam
|
||||||
|
|
@ -147136,9 +147424,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#b6020c" CREATED="1778788232367" ID="ID_134775139" MODIFIED="1778788330594" TEXT="manchmal ist es essentiell, für jeden Thread ein separates Lambda zu konstruieren">
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#b6020c" CREATED="1778788232367" ID="ID_134775139" MODIFIED="1778788330594" TEXT="manchmal ist es essentiell, für jeden Thread ein separates Lambda zu konstruieren">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
das ist im Besonderen relevant, wenn die captures nicht-triviale Operationen in der Initialisierung verwenden. Da der fill()-Popoulator kopiert, würden sich alle Threads das gleiche Lambda teilen, und daher auf den gleichen Werten arbeiten. Das ist <b>eine subtile Falle</b>
|
das ist im Besonderen relevant, wenn die captures nicht-triviale Operationen in der Initialisierung verwenden. Da der fill()-Popoulator kopiert, würden sich alle Threads das gleiche Lambda teilen, und daher auf den gleichen Werten arbeiten. Das ist <b>eine subtile Falle</b>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue