MT5 und Geschwindigkeit in Aktion - Seite 75

 
Valeriy Yastremskiy:

Ich bin kein Experte für Diagramme. Die Wichtigkeit wird durch die Abhängigkeit des Beginns anderer Aufgaben vom Ende der aktuellen Aufgabe bestimmt, andere Kriterien sind zweitrangig. Im Allgemeinen ist es schwierig, und am traurigsten ist, dass der Priorisierungsalgorithmus nicht spontan geändert werden kann. Auf der guten Seite würde ich mir von den Entwicklern eine Klarstellung wünschen, bevor irgendwelche Fragen auftauchen. Es ist kompliziert, aber es ist das richtige Ziel für die Entwicklung der Umwelt.

Auszug aus einer Beschreibung, wie dies in Echtzeitsystemen funktioniert.

Normalerweise sind Prioritäten dynamisch, d. h. sie können zur Laufzeit sowohl von den Prozessen selbst als auch vom Betriebssystem geändert werden.
Die Reaktion auf Interrupts ist von den CPU-intensiven Berechnungen getrennt.
Sobald ein Ereignis oder eine Unterbrechung eintritt, wird sein Handler sofort in die Warteschlange der bereiten Prozesse aufgenommen.
Unterbrechungsbehandlungsprogramme sind in der Regel kompakt, da sie schnell reagieren müssen (
), z. B. bei der Eingabe neuer Daten, und die Kontrolle an komplexere CPU-intensive Prozesse übertragen, die mit niedrigerer Priorität ausgeführt werden.

 
Roman:

Hallo Nikolai. Das ist wahr.
Aber gibt es da nicht das gleiche Problem wie bei der Synchronisierung, von dem Slava spricht, nämlich unangemessene Bremsen.
Oder gibt es vielleicht gar kein Problem? )) Vielleicht ist es einfacher, kein asynchrones Modell zu verwenden, als es mit Prioritäten zu synchronisieren? ))

Hallo.
Ich bin kein Experte für Asynchronität und Unterbrechungen, obwohl ich einige Kenntnisse und Erfahrungen habe.
Das Problem mit der Zeitschaltuhr sollte überhaupt nicht auftreten. Da die Reihenfolge nicht wichtig ist, kommt es auf die Periodizität an. Es spielt keine Rolle, wie der Chef, der für die Ressourcenzuweisung zuständig ist, damit umgeht.
Außerdem basiert der Timer meines Wissens nach auf Hardware-Interrupts des Systems. Ich denke, dass das gesamte Asynchronitätskontrollsystem mit Hilfe von Hardware-Interrupts implementiert ist, einschließlich der Interrupts vom Timer.
Ich frage mich immer noch, wie ressourcenintensiv der Interrupt selbst ist.
Zum Beispiel kommt ein System-Interrupt vom CPU-Timer, um ein Inkrement einer globalen Variablen durchzuführen. Für dieses Inkrement selbst benötigt das System etwa 1 Nanosekunde. Aber:

  • Wie lange dauert es, bis alle Parameter der laufenden Prozesse und/oder Threads gespeichert sind, die für die Wiederaufnahme der Arbeit benötigt werden?
  • Erfolgt diese Einsparung durch Hardware oder Software?
  • Wie lange dauert es, den Prozess wiederherzustellen?
  • Können wir diese Ressourcenintensität messen? Wahrscheinlich nicht, denn wie soll man den Moment der Unterbrechung einfangen?
  • In welcher Größenordnung liegen diese Ressourcenkosten - zehn, hunderte von Nanosekunden, Mikrosekunden oder zehn und hunderte von Mikrosekunden? Es wäre interessant, solche Informationen zu erhalten.

Im Allgemeinen ist mir klar, dass es mir an Wissen und Erfahrung fehlt. Aus diesem Grund versuche ich, mich nicht mit Entwicklern über die Prioritäten der Asynchronität zu streiten. Ich verstehe, dass es eine Menge Nuancen, Fallstricke und Hindernisse gibt, wenn man versucht, ein perfektes System zu schaffen, besonders wenn es um Handelsaufträge und den Erhalt von Handelsinformationen geht.
Obwohl ich ehrlich gesagt immer noch nicht verstehe, warum sie einige Funktionen in 5 asynchron gemacht haben, was eine große Unannehmlichkeit ist. Ich meine ChartGet..., ChartTimePriceToXY, ChartXYToTimePrice.
Schließlich ist es logisch anzunehmen, dass das Füllen der Diagrammzustandstabelle asynchron erfolgen sollte und die Befehle nur Daten aus dieser Tabelle lesen sollten. Und wenn die Daten zum Zeitpunkt des Ablesens ein paar Millisekunden veraltet sind, ist das auch kein Problem.
Das Problem ist, dass bei der Verfolgung der imaginären Datenrelevanz Verzögerungen von mehreren zehn Millisekunden auftreten, während derer die extrahierte Relevanz in größerem Maße irrelevant wird, wenn diese Befehle ursprünglich nicht asynchron waren, sondern einfach die letzten bekannten Daten der Diagrammzustandstabelle gelesen wurden.
Und der Ausführungszeit nach zu urteilen, waren diese Funktionen in 4 nicht asynchron.

 
Roman:

Auszug aus einer Beschreibung, wie dies in Echtzeitsystemen funktioniert.

Normalerweise sind Prioritäten dynamisch, d. h., sie können zur Laufzeit sowohl von den Prozessen selbst als auch vom Betriebssystem geändert werden.
Die Reaktion auf Interrupts ist von den CPU-intensiven Berechnungen getrennt.
Sobald ein Ereignis oder eine Unterbrechung eintritt, wird sein Handler sofort in die Warteschlange der bereiten Prozesse aufgenommen.
Unterbrechungsprogramme sind in der Regel kompakt, da sie schnell reagieren müssen,
z. B. neue Daten eingeben und die Kontrolle an komplexere prozessorintensive Prozesse weitergeben, die mit niedrigerer Priorität ausgeführt werden.

Es ist so, wie ich es beschrieben habe)))) Natürlich ist die Prioritätslogik dynamisch. Und das ist die Schwierigkeit bei der Einstellung der Stufe. Durch die Einstellung der Prioritätsstufe können wir die Ausführungszeit in der dynamischen Prioritätslogik in der darunter liegenden Umgebung nicht bestimmen. das Terminal befindet sich immer über der Wine- oder Linux-Umgebung und kann die Prioritätslogik der darunter liegenden Umgebung nicht beeinflussen.

 
Nikolai Semko:


Es wird nicht vorausgesetzt, dass alle gestellten Fragen beantwortet werden.

Wie ressourcenintensiv die Unterbrechung selbst ist.
Das hängt höchstwahrscheinlich von der Prozessorfrequenz ab.

Wie lange es dauert, den Vorgang zu speichern, um ihn dann fortzusetzen.
Bei den auf Quantisierung basierenden Algorithmen wird der aktive Prozess geändert, wenn:

  • der Prozess wurde beendet und hat das System verlassen
  • Ein Fehler ist aufgetreten
  • der Prozess wurde in den STANDBY-Zustand geschaltet
  • der Prozess ein bestimmtes Quantum an Prozessorzeit verbraucht hat und

Wie man Unterbrechungen auffängt.
Ein
Vorteiler ist ein Taktfrequenzteiler, der als ein oder mehrere in Reihe geschaltete T-Trigger fungiert.

 
Roman:

Nicht alle Fragen, die gestellt werden, sollen beantwortet werden.

Studieren Sie das Thema (mindestens 10 Jahre lang) und verschmutzen Sie diesen Thread nicht, bitte.

Fragen werden hier mit einer anderen Ausbildung und einer anderen Klasse diskutiert.

 
Nikolai Semko:
  • Wie lange dauert es, alle Parameter der laufenden Prozesse und/oder Threads zu speichern, um den Betrieb wieder aufzunehmen?
  • Erfolgt diese Speicherung durch Hardware oder Software?

Seit dem 286er-Prozessor passiert nichts mehr? Ich erinnere mich nicht und habe es nie verstanden, aber seit dem Pentium-1 (ich habe ein Buch darüber gelesen, aber das ist schon lange her)

Jeder Prozessor hat virtuellen Speicher zugewiesen; die physischen Adressen der Speicherbänke (RAM-Zellen) werden vom Prozessor selbst in virtuelle Adressen übersetzt (oder umgekehrt?) (ich erinnere mich nicht, aber es scheint ein spezielles Register und ein virtueller Zeiger auf die Adressübersetzungstabelle zu sein). Es ist alles Hardware, es ist nicht messbar, es ist der so genannte Prozessorkern, der jede Intel-Prozessorlinie auszeichnet, es ist nicht der Cache!

Nikolai Semko:
  • Wie lange dauert es, den Prozess wiederherzustellen?

jedes Programm unter Win sollte sich als Prozess registrieren und mindestens einen Thread erstellen

dann wird der Win-Taskplaner dem Prozess Ressourcen zuweisen und Nachrichten in eine Warteschlange stellen, wie der Planer arbeitet, ist für mich nicht von Interesse, es reicht, dass die Prozesspriorität erhöht werden kann und man sieht, dass der PC mit einigem Aufwand zu planen beginnt, d.h. Microsoft gibt meiner Anwendung Ressourcen, das ist genug, um das Betriebssystem am Laufen zu halten

Nikolai Semko:
  • Ist es möglich, diese Ressourcenintensität zu messen? Wahrscheinlich nicht, denn wie soll ich den Moment der Unterbrechung einfangen?
  • In welcher Größenordnung liegen diese Ressourcenkosten - in Dutzenden, Hunderten von Nanosekunden, Mikrosekunden oder in Dutzenden und Hunderten von Mikrosekunden? Es wäre interessant, solche Informationen zu erhalten.

Ehz, was messen? Interrupts sind Hardware, sie werden vom Betriebssystem gehandhabt, natürlich mit Hilfe von Treibern.

Zeitschaltuhr? - Wenn ich mich nicht irre, kann der Timer die Nachrichtenwarteschlange nicht verstopfen, es sei denn, der Prozess verarbeitet sie, etwas über OS foolproofing, google WM_TIMER - sollte detailliert sein

die Reihenfolge der Zahlen? nur der Prozessortakt kann gemessen werden und dann mit dem Berechnungsfaktor des Prozessors multipliziert werden, dies wurde hier diskutierthttps://www.mql5.com/ru/forum/352454#comment_18588098 , googeln Sie tonnenweise Informationen über Leistungsmessung

 
Renat Fatkhullin:

Studieren Sie das Fach (mindestens 10 Jahre lang) und mischen Sie sich nicht in diesen Thread ein, bitte.

Wir diskutieren hier über Themen mit einer anderen Ausbildung und einer anderen Klasse.

Jeder sollte hierher geschickt werden, nicht selektiv )) Aber wie immer bekommt derjenige einen Tritt in die Fresse, der entsprechende Fragen stellt.
Nachdem ich herausgefunden habe, dass Handler im blockierenden Modus ausgeführt werden, habe ich dieses Thema nicht umsonst aufgeworfen.
Ich habe den wahren Kern des Problems angesprochen, und das gefällt Ihnen nicht. OK, ich lasse das Thema fallen.
Aber ich sehe nicht, welchen Sinn es hat, zeitnahe Ereignisse in der synchronen Verarbeitung zu erreichen.
Slava, Nikolay, Valery, ich danke Ihnen für den konstruktiven Dialog.

 
Igor Makanu:

seit dem 286er Prozessor passiert nichts mehr? hmm, ich erinnere mich nicht und habe mich nie damit beschäftigt, aber definitiv seit dem Pentium-1 (ich habe ein Buch darüber gelesen, ist aber schon lange her)
Es ist alles Hardware, es ist nicht messbar, es ist der so genannte Prozessorkern, der jede Intel-Prozessorlinie auszeichnet, es ist nicht der Cache!

Gut, wenn es so ist.
Ich glaube, es ist so. Fast alles spielt sich auf der Hardwareebene ab. Andernfalls wäre das Multithreading nicht so effizient.

 
Nikolai Semko:

Gut, wenn das der Fall ist.
Ich glaube, das ist es. Fast alles spielt sich auf der Hardwareebene ab. Sonst wäre Multithreading nicht so effektiv.

nur so

google: prozessorgeschützter Modus

Wenn ich mich nicht irre, gibt der geschützte Modus dem Betriebssystem-Kernel eine eigene Berechtigungsstufe, und wegen des virtuellen Speichers für jeden Prozess ist es unmöglich, die RAM-Daten für das laufende Programm abzurufen... es sei denn, man lässt es im Debugger als separaten Prozess laufen.... Das ist ein anderes Fachgebiet ))))

aber, eindeutig, alles funktioniert auf Hardware-Ebene, es ist unmöglich, es zu messen, nur OS-Tools - und Umschalten des virtuellen Speichers für Prozesse ist augenblicklich, und Prozessor selbst arbeitet auf interne Frequenz - CPU-Multiplikator ... und wenn man an den Cache denkt... Warum? - Es gibt ein Problem, suchen Sie nach einer Lösung! Wollen Sie einen Treiber schreiben? )))

SZZ: Sie können einen Treiber schreiben, ich erinnere mich, wenn ich TCP-Logger verwendet, wurde es als Treiber installiert und protokolliert den gesamten Verkehr und dann von Prozessen in der Tabelle angezeigt alle den Verkehr.... nur eine Sache zu denken, wie das Schreiben von Treibern helfen wird, profitable TCP )))) zu entwickeln



UPD: Hubr "Was ist der geschützte Modus und wie funktioniert er?"https://habr.com/ru/post/118881/

UPD: Hardware-Level(CPU)-Privileg für Code-Ausführung -Protected Rings Wiki

 
Renat Fatkhullin:

Bei zufälligen Einzelproben einer beliebigen Anweisung, einschließlich des einfachsten Assembler-Typs inc eax, kommt es garantiert immer zu Fehlern . Dies ist architektonisch und durch die physikalischen Grenzen der "ehrlichen Zuweisung von Zeitquanten von Tausenden von Threads an eine kleine Anzahl von Kernen" bedingt.

Hören Sie auf, dumm zu sein und fangen Sie weiterhin einzelne Ausreißer pro Million Anfragen.

Es wurde festgestellt, dass CopyTicks nur selten verzögert wird. Ich habe ein Testskript geschrieben

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnTick()
{
  Sleep(1000);
  
  MqlTick Tick[1];
  
  _B(CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1), 100);
  _B(SymbolInfoTick(_Symbol, Tick[0]), 100);
}

und ließ es im Stressmodus laufen. SymbolInfoTick hat deutlich mehr Warnmeldungen als CopyTicks.


Keine Beschwerden. Ich würde nur gerne verstehen, was die unterschiedliche Wahrnehmung der Stressbelastung bei der Umsetzung dieser Funktionen beeinflusst.