MT5 et la vitesse en action - page 75

 
Valeriy Yastremskiy:

Je ne suis pas un expert en graphiques. L'importance est déterminée par la dépendance du début des autres tâches par rapport à la fin de la tâche en cours. Les autres critères sont secondaires. mais il y a aussi le temps d'exécution de la tâche. En général, il est difficile, et surtout impossible, de modifier à la volée un algorithme de hiérarchisation des priorités. Du côté positif, j'aimerais obtenir des éclaircissements de la part des développeurs avant de poser des questions. C'est compliqué, mais c'est le bon objectif pour le développement de l'environnement.

Extrait d'une description de la manière dont cela fonctionne dans les systèmes en temps réel.

En général, les priorités sont dynamiques, ce qui signifie qu'elles peuvent être modifiées au moment de l'exécution par les processus eux-mêmes ainsi que par le système d'exploitation.
La réponse aux interruptions est séparée des calculs intensifs du CPU.
Dès qu'un événement ou une interruption se produit, son gestionnaire est immédiatement inclus dans la file d'attente des processus prêts.
Les programmes de gestion des interruptions sont généralement compacts car ils doivent fournir une réponse rapide,
par exemple l'entrée de nouvelles données, et transférer le contrôle à des processus plus complexes et gourmands en ressources CPU qui sont exécutés à une priorité moindre.

 
Roman:

Bonjour Nikolaï. C'est vrai.
Mais n'y aura-t-il pas le même problème qu'avec la synchronisation, dont parle Slava, c'est-à-dire des freins déraisonnables.
Ou peut-être n'y a-t-il pas de problème ? )) Peut-être est-il plus facile de ne pas utiliser de modèle asynchrone que de le synchroniser avec des priorités ? ))

Salut.
Je ne suis pas un expert en asynchronie et en interruptions, même si j'ai quelques connaissances et une certaine expérience.
Il ne devrait pas y avoir de problème avec la question de la minuterie. La séquence n'étant pas importante, c'est la périodicité qui compte. La façon dont elle est traitée par le patron, qui est responsable de l'allocation des ressources, n'a pas vraiment d'importance.
De plus, si je comprends bien, la minuterie est basée sur les interruptions matérielles du système. Je pense que tout le système de contrôle de l'asynchronisme est mis en œuvre à l'aide d'interruptions matérielles, y compris celles provenant de la minuterie.
Je me demande encore à quel point les interruptions sont gourmandes en ressources.
Par exemple, une interruption système provient de la minuterie du CPU pour effectuer l'incrémentation d'une variable globale. Cet incrément lui-même prendra au système environ 1 nanoseconde. Mais :

  • Combien de temps faut-il pour sauvegarder tous les paramètres des processus et/ou threads en cours d'exécution nécessaires à la reprise du travail ?
  • Cette sauvegarde est-elle effectuée par le matériel ou le logiciel ?
  • Combien de temps faut-il pour rétablir le processus ?
  • Peut-on mesurer cette intensité de ressources ? Probablement pas, car comment saisir le moment de l'interruption ?
  • Quel est l'ordre de ces coûts de ressources : dizaines, centaines de nanosecondes, microsecondes ou dizaines et centaines de microsecondes ? Il serait intéressant d'obtenir de telles informations.

En général, je me rends compte que je manque de connaissances et d'expérience. C'est pourquoi j'essaie de ne pas interroger les développeurs sur les priorités de l'asynchronisme. Je comprends qu'il y a beaucoup de nuances, de pièges et d'obstacles lorsqu'on essaie de créer un système parfait, surtout lorsqu'il s'agit d'ordres de transaction et d'obtenir des informations sur les transactions.
Bien que je doive admettre que je ne comprends toujours pas pourquoi ils ont rendu certaines fonctions asynchrones dans la version 5, ce qui est un grand inconvénient. Je veux dire ChartGet..., ChartTimePriceToXY, ChartXYToTimePrice.
Après tout, il est logique de supposer que le remplissage de la table d'état des cartes doit être asynchrone, et que les commandes ne doivent lire que les données de cette table. Et si les données au moment de la lecture sont dépassées de quelques millisecondes, ce n'est pas un problème.
Leproblème est que, dans la recherche d'une pertinence imaginaire des données, des décalages de plusieurs dizaines de millisecondes se produisent, pendant lesquels la pertinence extraite devient de moins en moins pertinente, si ces commandes n'étaient pas asynchrones à l'origine, mais lisaient simplement les dernières données connues de la table d'état du graphique.
Et à en juger par le temps d'exécution, ces fonctions n'étaient pas asynchrones en 4.

 
Roman:

Extrait d'une description de la manière dont cela fonctionne dans les systèmes en temps réel.

Normalement, les priorités sont dynamiques, ce qui signifie qu'au moment de l'exécution, elles peuvent être modifiées par les processus eux-mêmes ainsi que par le système d'exploitation.
La réponse aux interruptions est séparée des calculs intensifs du CPU.
Dès qu'un événement ou une interruption se produit, son gestionnaire est immédiatement inclus dans la file d'attente des processus prêts.
Les programmes de gestion des interruptions sont généralement compacts, car ils doivent fournir une réponse rapide,
, par exemple saisir de nouvelles données, et passer le contrôle à des processus plus complexes, gourmands en ressources processeur, qui sont exécutés à une priorité moindre.

C'est exactement comme je l'ai décrit)))). Bien entendu, la logique de priorité est dynamique. Et c'est là que réside la difficulté de définir le niveau. en définissant le niveau de priorité, nous ne pouvons pas déterminer son temps d'exécution dans la logique de hiérarchisation dynamique de l'environnement inférieur. le terminal est toujours au-dessus de l'environnement wine ou linux et ne peut pas affecter la logique de hiérarchisation de l'environnement inférieur.

 
Nikolai Semko:


Toutes les questions posées ne sont pas présumées avoir une réponse.

L'intensité de l'interruption elle-même en termes de ressources.
Cela dépend très probablement de la fréquence du processeur.

Durée de sauvegarde du processus, pour une reprise ultérieure.
Selon les algorithmes basés sur la quantification, le processus actif est modifié si :

  • le processus s'est terminé et a quitté le système
  • une erreur s'est produite
  • le processus est passé à l'état de veille.
  • le processus a épuisé un quantum de temps processeur, et

Comment attraper les interruptions.
Un
pré-diviseur est un diviseur de fréquence d'horloge qui agit comme un ou plusieurs déclencheurs en T connectés en série.

 
Roman:

Toutes les questions posées ne sont pas censées recevoir une réponse.

Allez étudier le sujet (pendant au moins 10 ans) et n'abîmez pas ce fil, s'il vous plaît.

Les questions sont abordées ici avec une formation différente et une classe différente.

 
Nikolai Semko:
  • Combien de temps faut-il pour sauvegarder tous les paramètres des processus et/ou threads en cours d'exécution nécessaires à la reprise des opérations ?
  • Cette sauvegarde est-elle effectuée par le matériel ou le logiciel ?

Rien ne se passe depuis le processeur 286 ? je ne me souviens pas et n'ai jamais compris, mais depuis le Pentium-1 (j'ai lu un livre à ce sujet, mais il y a longtemps)

Le processeur fonctionne en mode protégé. Chaque processeur dispose d'une mémoire virtuelle allouée ; les adresses physiques des banques de mémoire (cellules de RAM) sont traduites en adresses virtuelles (ou plutôt vice versa ?) par le processeur lui-même (je ne me souviens plus, mais il semble qu'il s'agisse d'un registre spécial et d'un pointeur virtuel vers la table de traduction d'adresses). C'est du matériel qui se produit, ce n'est pas mesurable, c'est le soi-disant cœur du processeur qui distingue chaque ligne de processeurs Intel, ce n'est pas le cache !

Nikolai Semko:
  • Combien de temps faut-il pour récupérer le processus ?

tout programme sur Win doit s'enregistrer en tant que processus et créer au moins un thread.

alors le planificateur de tâches de Win allouera des ressources au processus et mettra des messages en file d'attente pour lui, comment le planificateur fonctionne ne m'intéresse pas, il suffit que la priorité du processus puisse être augmentée et on peut voir qu'avec un certain effort le PC commence à planifier, c'est-à-dire que Microsoft donne des ressources à mon application, c'est suffisant pour que le système d'exploitation continue à fonctionner.

Nikolai Semko:
  • Est-il possible de mesurer cette intensité de ressources ? Probablement pas, car comment attraper le moment de l'interruption ?
  • Quel est l'ordre de ces coûts de ressources : dizaines, centaines de nanosecondes, microsecondes ou dizaines et centaines de microsecondes ? Il serait intéressant d'obtenir de telles informations.

Les interruptions sont matérielles, elles sont gérées par le système d'exploitation, bien sûr avec l'aide de pilotes.

un timer ? - Si je ne me trompe pas, le timer ne peut pas atteindre la file d'attente des messages à moins que le processus ne soit en train de le traiter, quelque chose à propos de l'OS foolproofing, google WM_TIMER - devrait être détaillé.

l'ordre des chiffres ? seule l'horloge du processeur peut être mesurée et ensuite multipliée par le facteur de calcul du processeur, cela a été discuté icihttps://www.mql5.com/ru/forum/352454#comment_18588098 , google des tonnes d'informations sur la mesure des performances

 
Renat Fatkhullin:

Allez étudier le sujet (pendant au moins 10 ans) et ne répandez pas vos déchets dans ce fil, s'il vous plaît.

Nous discutons ici de questions avec une formation différente et une classe différente.

Tout le monde devrait être envoyé ici, pas de manière sélective ;)) Mais comme toujours, on lui donne un coup de pied dans le chapeau de celui qui pose les bonnes questions.
Après avoir appris que les handlers sont exécutés en mode bloquant, je n'ai pas abordé ce sujet pour rien.
J'ai abordé le cœur du problème, et vous n'aimez pas ça. OK, je laisse tomber le sujet.
Mais je ne vois pas l'intérêt d'obtenir des événements opportuns dans un traitement synchrone.
Slava, Nikolay, Valery : merci pour ce dialogue constructif.

 
Igor Makanu:

rien ne se passe depuis le processeur 286 ? hhz, je ne me souviens pas et je n'ai jamais eu affaire à cela, mais certainement depuis le Pentium-1 (j'ai lu un livre à ce sujet, il y a longtemps cependant)
C'est du matériel tout fait, ce n'est pas mesurable, c'est le soi-disant cœur du processeur qui distingue chaque ligne de processeurs Intel, ce n'est pas le cache !

C'est bien si c'est le cas.
Je pense que c'est le cas. Presque tout se situe au niveau du matériel. Sinon, le multithreading ne serait pas aussi efficace.

 
Nikolai Semko:

C'est bien si c'est le cas.
Je pense que c'est le cas. Presque tout se situe au niveau du matériel. Sinon, le multithreading ne serait pas aussi efficace.

seulement comme ceci

google : mode protégé du processeur

Si je ne me trompe pas, le mode protégé donne au noyau du système d'exploitation un niveau de privilège distinct et, en raison de la mémoire virtuelle de chaque processus, il est impossible d'obtenir les données de la RAM pour le programme en cours d'exécution... enfin, sauf si vous l'exécutez sous le débogueur en tant que processus distinct.... c'est un autre domaine d'expertise )))).

mais, sans équivoque, tout fonctionne au niveau matériel, il est impossible de le mesurer, seuls les outils du système d'exploitation le permettent - et le changement de mémoire virtuelle pour les processus est instantané, et le processeur lui-même fonctionne sur la fréquence interne - le multiplicateur du CPU... et si vous commencez à penser au cache... Pourquoi ? - il y a un problème, cherchez une solution ! vous voulez écrire un pilote ? )))

SZZ : vous pouvez écrire un pilote, je me souviens que lorsque j'ai utilisé TCP-logger, il était installé en tant que pilote et enregistrait tout le trafic, puis par processus dans la table affichait tout le trafic.... Il suffit de penser à la façon dont l'écriture de pilotes aidera à développer un TCP rentable )))).



UPD : Hubr "Qu'est-ce que le mode protégé et que fait-il ?"https://habr.com/ru/post/118881/

UPD : Privilège au niveau du matériel (CPU) pour l'exécution de code -Protected Rings Wiki

 
Renat Fatkhullin:

Vous êtes toujours assuré d'avoir des échecs sur des échantillons uniques aléatoires de n'importe quelle instruction, y compris le type d'assembleur le plus simple inc eax. Ceci est dû à l'architecture et aux limites physiques de "l'allocation honnête des quanta de temps de milliers de threads à un petit nombre de cœurs".

Arrêtez d'être stupide et continuez à attraper des cas isolés par million de demandes.

J'ai remarqué que CopyTicks est rarement en retard. J'ai écrit un script de test

#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);
}

et l'a fait fonctionner en mode stress. SymbolInfoTick a sensiblement plus d'alertes que CopyTicks.


Aucune plainte. J'aimerais seulement comprendre ce qui affecte la perception différente de la charge de stress dans les implémentations de ces fonctions.