Scheduler: decision logic for actual dispatch of activities

This commit is contained in:
Fischlurch 2023-10-18 01:12:16 +02:00
parent fa391d1267
commit aa60869082
4 changed files with 179 additions and 18 deletions

View file

@ -64,7 +64,7 @@ namespace gear {
/**
* Scheduler Layer-2 : coordination.
* Scheduler Layer-2 : execution of Scheduler Activities.
*
* @see SchedulerInvocation (Layer-1)
* @see SchedulerCommutator_test
@ -95,7 +95,7 @@ namespace gear {
ThreadID expect_noThread; // expect no one else to be in...
ThreadID myself = std::this_thread::get_id();
return groomingToken_.compare_exchange_strong (expect_noThread, myself
,memory_order_acquire // success also constitutes an acquire barrier
,memory_order_acquire // success also constitutes an acquire barrier
,memory_order_relaxed // failure has no synchronisation ramifications
);
}
@ -125,6 +125,22 @@ namespace gear {
}
/**
* Decide if Activities shall be performed now and in this thread.
* @param when the indicated time of start of the first Activity
* @param now current scheduler time
* @return allow dispatch if acquired GroomingToken and time is due
* @warning accesses current ThreadID and changes GroomingToken state
*/
bool
decideDispatchNow (Time when, Time now)
{
auto myself = std::this_thread::get_id();
return (when <= now)
and (holdsGroomingToken (myself)
or acquireGoomingToken());
}
Activity*
findWork (SchedulerInvocation& layer1)

View file

@ -22,7 +22,7 @@
/** @file scheduler-invocation.hpp
** Layer-1 of the Scheduler: dispatch and invocation of activities.
** Layer-1 of the Scheduler: queueing and prioritisation of activities.
** This is the lower layer of the implementation and provides low-level functionality.
**
** @see SchedulerInvocation_test
@ -66,7 +66,7 @@ namespace gear {
/**
* Scheduler Layer-1 : invocation.
* Scheduler Layer-1 : time based dispatch.
*
* @see Scheduler
* @see SchedulerInvocation_test

View file

@ -31,11 +31,11 @@
#include "lib/test/microbenchmark.hpp"
#include "lib/time/timevalue.hpp"
#include "lib/format-cout.hpp"
#include "lib/thread.hpp"
//#include "lib/util.hpp"
#include "lib/test/diagnostic-output.hpp"///////////////////////////TODO TOD-Oh
//#include <utility>
#include <thread>
#include <chrono>
using test::Test;
@ -58,6 +58,15 @@ namespace test {
namespace {// Test parameters
const size_t NUM_THREADS = 20;
const size_t REPETITIONS = 100;
inline void
___ensureGroomingTokenReleased(SchedulerCommutator& sched)
{
auto myself = std::this_thread::get_id();
CHECK (not sched.holdsGroomingToken(myself));
CHECK (sched.acquireGoomingToken());
sched.dropGroomingToken();
}
}
@ -124,6 +133,7 @@ namespace test {
sched.dropGroomingToken();
CHECK (not sched.holdsGroomingToken (myself));
___ensureGroomingTokenReleased(sched);
}
@ -163,6 +173,7 @@ namespace test {
CHECK (brokenSum < checkSum);
CHECK (checkSum = NUM_THREADS * REPETITIONS*(REPETITIONS-1)/2);
___ensureGroomingTokenReleased(sched);
}
@ -174,7 +185,53 @@ namespace test {
void
verify_DispatchDecision()
{
UNIMPLEMENTED ("DispatchDecision");
SchedulerCommutator sched;
___ensureGroomingTokenReleased(sched);
Time t1{10,0};
Time t2{20,0};
Time t3{30,0};
Time now{t2};
auto myself = std::this_thread::get_id();
CHECK (sched.decideDispatchNow (t1, now));
CHECK (sched.holdsGroomingToken (myself));
CHECK (sched.decideDispatchNow (t1, now));
CHECK (sched.holdsGroomingToken (myself));
CHECK (sched.decideDispatchNow (t2, now));
CHECK (sched.holdsGroomingToken (myself));
CHECK (not sched.decideDispatchNow (t3, now));
CHECK (sched.holdsGroomingToken (myself));
sched.dropGroomingToken();
CHECK (not sched.decideDispatchNow (t3, now));
CHECK (not sched.holdsGroomingToken (myself));
std::atomic_bool stop{false};
lib::ThreadJoinable theHog{"grooming-hog"
, [&]{
CHECK (sched.acquireGoomingToken());
do sleep_for (100us);
while (not stop);
sched.dropGroomingToken();
}};
sleep_for (500us);
CHECK (not sched.acquireGoomingToken());
CHECK (not sched.decideDispatchNow (t1, now));
CHECK (not sched.holdsGroomingToken (myself));
CHECK (not sched.decideDispatchNow (t2, now));
CHECK (not sched.holdsGroomingToken (myself));
stop = true;
theHog.join().maybeThrow();
CHECK (sched.decideDispatchNow (t2, now));
CHECK (sched.holdsGroomingToken (myself));
}

View file

@ -84897,11 +84897,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1687909787970" ID="ID_1744353313" MODIFIED="1687909813720" TEXT="dieser bedient dann die Priority-Queue"/>
<node CREATED="1687909860136" ID="ID_1257565620" MODIFIED="1687910043028" TEXT="...und gibt es kooperativ wieder frei">
<linktarget COLOR="#af5678" DESTINATION="ID_1257565620" ENDARROW="Default" ENDINCLINATION="223;172;" ID="Arrow_ID_1390633196" SOURCE="ID_1887123630" STARTARROW="None" STARTINCLINATION="-430;56;"/>
<node CREATED="1687909898834" ID="ID_688462252" MODIFIED="1694016347114" TEXT="Deadlock-Gefahr">
<node CREATED="1687909898834" ID="ID_688462252" MODIFIED="1697583754517" TEXT="Deadlock-Gefahr">
<linktarget COLOR="#88617a" DESTINATION="ID_688462252" ENDARROW="Default" ENDINCLINATION="118;-18;" ID="Arrow_ID_953966962" SOURCE="ID_240227471" STARTARROW="None" STARTINCLINATION="-312;13;"/>
<linktarget COLOR="#f95182" DESTINATION="ID_688462252" ENDARROW="Default" ENDINCLINATION="-17;60;" ID="Arrow_ID_1801176056" SOURCE="ID_1725190336" STARTARROW="None" STARTINCLINATION="-186;-6;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687909906855" ID="ID_195997630" MODIFIED="1687909912310" TEXT="Watchdog notwendig">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687909906855" ID="ID_195997630" MODIFIED="1697583958025" TEXT="Watchdog notwendig">
<linktarget COLOR="#71457a" DESTINATION="ID_195997630" ENDARROW="Default" ENDINCLINATION="-1608;190;" ID="Arrow_ID_345281595" SOURCE="ID_942157229" STARTARROW="None" STARTINCLINATION="-375;32;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1687909963201" ID="ID_369489190" MODIFIED="1687909968365" TEXT="realisiert per Tick"/>
<node CREATED="1687909969073" ID="ID_1256883233" MODIFIED="1687909980556" TEXT="gepr&#xfc;ft beim Zugriff auf den Scheduler"/>
@ -84969,8 +84971,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1694015344557" ID="ID_571276241" LINK="https://en.cppreference.com/w/cpp/atomic/memory_order#Release-Acquire_ordering" MODIFIED="1694015377170" TEXT="auch CPP-Reference ist v&#xf6;llig klar in diesem Punkt (&#xbb;Release-Acquire-Ordering&#xab;)"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697473042062" ID="ID_1462757404" MODIFIED="1697473067073" TEXT="Platz im Scheduler und Zugriff">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1697473042062" ID="ID_1462757404" MODIFIED="1697583781583" TEXT="Platz im Scheduler und Zugriff">
<icon BUILTIN="yes"/>
<node CREATED="1697583689827" ID="ID_1410024395" MODIFIED="1697583694398" TEXT="es sitzt im Layer-2"/>
<node CREATED="1697583695082" ID="ID_1723522955" MODIFIED="1697583709990" TEXT="Zugriff erfolgt implizit aus der Logik heraus"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697583713560" ID="ID_1725190336" MODIFIED="1697583771560" TEXT="die Logik mu&#xdf; sicherstellen, da&#xdf; es freigegeben wird">
<arrowlink COLOR="#f95182" DESTINATION="ID_688462252" ENDARROW="Default" ENDINCLINATION="-17;60;" ID="Arrow_ID_1801176056" STARTARROW="None" STARTINCLINATION="-186;-6;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
@ -85034,11 +85042,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697553564965" ID="ID_280879756" MODIFIED="1697553576815" TEXT="der &#xbb;POST-Eingang&#xab;">
<icon BUILTIN="ksmiletris"/>
</node>
<node CREATED="1697553690189" ID="ID_937487663" MODIFIED="1697559787891" TEXT="enth&#xe4;lt die Entscheidung &#xfc;ber den Dispatch">
<arrowlink COLOR="#6d677a" DESTINATION="ID_1453351337" ENDARROW="Default" ENDINCLINATION="7;-29;" ID="Arrow_ID_1868115325" STARTARROW="None" STARTINCLINATION="-51;3;"/>
<node CREATED="1697553690189" ID="ID_937487663" MODIFIED="1697583424961" TEXT="enth&#xe4;lt die Entscheidung &#xfc;ber den Dispatch">
<arrowlink COLOR="#6d677a" DESTINATION="ID_1453351337" ENDARROW="Default" ENDINCLINATION="3;-38;" ID="Arrow_ID_1868115325" STARTARROW="None" STARTINCLINATION="-51;3;"/>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#435e98" CREATED="1697553928685" ID="ID_416015404" MODIFIED="1697559763784" TEXT="Form des Dispatch?">
<node COLOR="#435e98" CREATED="1697553928685" ID="ID_416015404" MODIFIED="1697583437483" TEXT="Form des Dispatch?">
<icon BUILTIN="help"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697555373532" ID="ID_323766443" MODIFIED="1697559741749" STYLE="fork" TEXT="Problem: Dependencies">
<font NAME="SansSerif" SIZE="12"/>
@ -85077,9 +85085,83 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697559712744" ID="ID_1900900735" MODIFIED="1697559730521" TEXT="dort passiert auch jedwede Dependency-Injection"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697553674095" ID="ID_1453351337" MODIFIED="1697559787891" TEXT="decideNowOrLater">
<linktarget COLOR="#6d677a" DESTINATION="ID_1453351337" ENDARROW="Default" ENDINCLINATION="7;-29;" ID="Arrow_ID_1868115325" SOURCE="ID_937487663" STARTARROW="None" STARTINCLINATION="-51;3;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697553674095" ID="ID_1453351337" MODIFIED="1697583424961" TEXT="decideDispatchNow">
<linktarget COLOR="#6d677a" DESTINATION="ID_1453351337" ENDARROW="Default" ENDINCLINATION="3;-38;" ID="Arrow_ID_1868115325" SOURCE="ID_937487663" STARTARROW="None" STARTINCLINATION="-51;3;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697579158340" ID="ID_793480355" MODIFIED="1697579176584" TEXT="Ausf&#xfc;hren ist m&#xf6;glich...">
<icon BUILTIN="info"/>
<node CREATED="1697579178708" ID="ID_787430790" MODIFIED="1697579237139" TEXT="wenn der Startzeitpunkt nicht in der Zukunft liegt"/>
<node CREATED="1697579245499" ID="ID_60360398" MODIFIED="1697579263604" TEXT="wenn der aktuelle Thread das GroomingToken erlangen kann"/>
</node>
<node CREATED="1697579298524" ID="ID_593152010" MODIFIED="1697583436601" TEXT="Kontext der Entscheidung">
<icon BUILTIN="info"/>
<node CREATED="1697579409584" ID="ID_1475629503" MODIFIED="1697579417440" TEXT="Worker sucht Arbeit">
<node CREATED="1697579435142" ID="ID_1101443095" MODIFIED="1697579457411" TEXT="dann ist das GroomingToken-Besitz bereits vorausgesetzt"/>
<node CREATED="1697579470701" ID="ID_491245332" MODIFIED="1697579493026" TEXT="den Rest der Entscheidung macht bereits Layer-1">
<node CREATED="1697579495039" ID="ID_1363159889" MODIFIED="1697579501366" TEXT="braucht dazu die aktuelle Zeit"/>
<node CREATED="1697579501929" ID="ID_1156519476" MODIFIED="1697579509826" TEXT="stellt fest, ob &#xfc;berhaupt was in der Queue ist"/>
<node CREATED="1697579510504" ID="ID_556911724" MODIFIED="1697579524746" TEXT="pr&#xfc;ft den WaterLevel am Ausgang der Queue"/>
</node>
</node>
<node CREATED="1697579541116" ID="ID_1539153693" MODIFIED="1697579559549" TEXT="&#x3bb;-post">
<node CREATED="1697579566464" ID="ID_284248868" MODIFIED="1697579575139" TEXT="kommt aus einer laufenden Ausf&#xfc;hrung"/>
<node CREATED="1697579575973" ID="ID_1493021297" MODIFIED="1697579597952" TEXT="liefert den Startzeitpunkt als Parameter"/>
<node CREATED="1697579599123" ID="ID_132991826" MODIFIED="1697579631058" TEXT="mu&#xdf; dann explizit das GroomingToken pr&#xfc;fen"/>
</node>
<node CREATED="1697579633655" ID="ID_700287234" MODIFIED="1697579642105" TEXT="von Extern neu &#xfc;bergebener Chain">
<node CREATED="1697579656164" ID="ID_1585466417" MODIFIED="1697579662208" TEXT="beginnt mit einem POST"/>
<node CREATED="1697579663228" ID="ID_1429242310" MODIFIED="1697579670951" TEXT="daraus ergibt sich der Start-Zeitpunkt"/>
<node CREATED="1697579673554" ID="ID_85549667" MODIFIED="1697579682709" TEXT="GroomingToken mu&#xdf; erlangt werden"/>
</node>
</node>
<node CREATED="1697579748287" ID="ID_1583484788" MODIFIED="1697579771817" TEXT="&#x27f9; nur die letzten beiden F&#xe4;lle">
<node CREATED="1697579774229" ID="ID_1513919615" MODIFIED="1697583362689" TEXT="und zwar fallen sie sogar zusammen">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1697579781571" ID="ID_466935258" MODIFIED="1697579790174" TEXT="die Zeit ist explizit gegeben"/>
<node CREATED="1697579807584" ID="ID_1369153607" MODIFIED="1697579813611" TEXT="brauche zudem die aktuelle Zeit"/>
<node CREATED="1697579814431" ID="ID_184140714" MODIFIED="1697583353917">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
versuche GroomingToken zu erlangen (<b><font color="#5e3348">Seiteneffekt</font></b>)
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697583303207" ID="ID_332099803" MODIFIED="1697583538155" TEXT="aber: kein dropGroomingToken() bei negativer Entscheidung">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...weil im normalen Control-flow direkt danach die Activity in die Queue gestellt wird &#8212; und da k&#246;nnen wir eine <i>signifikannte Beschleunigung</i>&#160;erziehlen wenn wir das GroomingToken halten und deshalb nicht durch die Instruct-Queue gehen m&#252;ssen
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697583572667" ID="ID_1258733239" MODIFIED="1697583665481" TEXT="Konsequenz: f&#xe4;llige Activities dr&#xe4;ngen sich vor">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...und zwar, weil sie infolge der hier getroffenen Entscheidung unmittelbar in den Dispatch gehen k&#246;nnen; w&#228;re das nicht so, dann w&#252;rde u.U aus der Priority-Queue zun&#228;chst eine noch dringendere/fr&#252;here Aufgabe entnommen werden.
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node COLOR="#338800" CREATED="1697559873907" ID="ID_409935766" MODIFIED="1697567713362" TEXT="acquireGoomingToken">
<icon BUILTIN="button_ok"/>
@ -86024,7 +86106,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697483439491" ID="ID_20743819" MODIFIED="1697483452170" TEXT="die Bestandteile des API abdecken">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697483458376" ID="ID_1335346824" MODIFIED="1697483469019" TEXT="das GroomingToken"/>
<node CREATED="1697483469919" ID="ID_1121885008" MODIFIED="1697483490272" TEXT="die ExecutionCtx-&#x3bb;"/>
<node CREATED="1697483469919" ID="ID_1121885008" MODIFIED="1697571744407" TEXT="Logik f&#xfc;r Queue-Zugriff"/>
<node CREATED="1697571773963" ID="ID_1386234233" MODIFIED="1697571786371" TEXT="Ausf&#xfc;hren eine Activity-Kette"/>
<node CREATED="1697571745624" ID="ID_599597531" MODIFIED="1697571773200" TEXT="Entscheidung ob direkt ausgef&#xfc;hrt wird"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697473111557" ID="ID_750298563" MODIFIED="1697484608763" TEXT="Bestandteile des Work-Funktors direkt verbinden">
<icon BUILTIN="flag-yellow"/>
@ -86163,8 +86247,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697560511607" ID="ID_764686457" MODIFIED="1697560620825" TEXT="verify_DispatchDecision">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1697560511607" ID="ID_764686457" LINK="#ID_1453351337" MODIFIED="1697585897682" TEXT="verify_DispatchDecision">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697560535930" ID="ID_849370574" MODIFIED="1697560620825" TEXT="verify_findWork">
<icon BUILTIN="flag-yellow"/>
@ -89208,6 +89292,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1692108511352" ID="ID_316055460" MODIFIED="1692108529978" TEXT="aber Ausnahme-Situationen sind an einen sehr spezifischen Kontext gebunden"/>
<node CREATED="1692108530641" ID="ID_991521612" MODIFIED="1692108564761" TEXT="die Stelle, die die Ausnahme erkennt, kennt i.d.R. diesen (=ihren eigenen) Kontext nicht"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1697583823705" ID="ID_942157229" MODIFIED="1697583958025" TEXT="Watchdog f&#xfc;r GroomingToken">
<arrowlink COLOR="#71457a" DESTINATION="ID_195997630" ENDARROW="Default" ENDINCLINATION="-1608;190;" ID="Arrow_ID_345281595" STARTARROW="None" STARTINCLINATION="-375;32;"/>
<icon BUILTIN="hourglass"/>
</node>
</node>
<node CREATED="1693238644990" ID="ID_1196672113" MODIFIED="1693238729300" TEXT="Laststeuerung f&#xfc;r &#xbb;free-wheeling&#xab; / background render">
<arrowlink COLOR="#965d71" DESTINATION="ID_1960804622" ENDARROW="Default" ENDINCLINATION="286;89;" ID="Arrow_ID_494620026" STARTARROW="None" STARTINCLINATION="2087;110;"/>