MT5 и скорость в боевом исполнении - страница 75

 
Valeriy Yastremskiy:

я не знаток. в графах. Важность определяется зависимостью начала исполнения других задач от окончания текущей. другие критерии вторичны. но есть так же время исполнения задачи. и оно тоже важнейшее среди одноранговых. В общем сложно и самая грусть, заложенный алгоритм приоритетов на ходу изменить не возможно. По хорошему, хотелось бы разьяснений от разрабов до возникновения вопросов. Сложно, но это правильная цель в развитии среды. 

Выдержка из описания, как это работает в системах реального времени.

Обычно приоритеты являются динамическими, что означает, что во время исполнения они могут изменятся как самими процессами так и ОС.
Реакция на прерывания отделена от вычислений, требующих значительных ресурсов процессора.
Как только происходит событие или прерывание, его обработчик немедленно включается в очередь готовых процессов.
Программы обработчиков прерываний обычно компактны, так как они должны обеспечивать быструю реакцию,
например ввод новых данных, и передавать управление более сложным процессам, интенсивно потребляющим ресурсы процессора, которые исполняются с более низким приоритетом. 

 
Roman:

Привет Николай. Так то оно так.
Но не будет ли той же проблемы как с синхронизацией? о которой говорит Слава, то есть неоправданные тормоза.
А может и нет проблемы? )) Может просто проще не применять асинхронную модель, чем синхронизировать с приоритетами? ))

Привет.
Я не являюсь спецом в асинхронности и прерываниях, хотя кое-какие знания и опыт имеются.
В вопросе таймера вообще не должно быть проблем. Т.к. последовательность не важна, а важна периодичность. И как это отработает босс, который сидит за распределением ресурсов, совершенно не важно. 
Тем более, как я понимаю, таймер построен на системных аппаратных прерываниях. Думаю вся система управления асинхронности реализована с помощью аппаратных прерываний, в том числе и от таймера. 
Для меня остается открытым вопрос, насколько ресурсоемко само прерывание. 
Например, наступило системное прерываниее от процессорного таймера, чтобы выполнить инкремент одной глобальной переменной. На сам этот инкремент система потратит порядка 1-й наносекунды. Но:

  • Как долго происходит процесс по сохранению всех параметров работающих процессов и(или) потоков, необходимых для дальнейшего возобновления работы?
  • Это сохранение просходит аппаратно или програмно?
  • Как долго происходит процесс по востановления процесса?
  • Можно ли замерить эту ресурсоемкость? Наверное нет, ведь как поймать момент прерывания?
  • Какой порядок цифр этих ресурсозатрат - , десятки, сотни наносекунд,микросекунды или десятки и сотни микросекун? Было бы интересно получить такую информацию.

В общем, понимаю, что не хватает знаний и опыта. Поэтому стараюсь не лезть с вопросами к разработчикам по поводу приоритетов в асинхронности. Т.к. понимаю, что существует много нюансов, ловушек и тупиков в попытке создать безупречную систему, особенно когда дело касается торговых приказов и получение торговой информации. 
Хотя, признаться честно, до сих пор не понимаю зачем они в 5-ке сделали некоторые функции асинхронными, что создает большое неудобство. Я имею ввиду ChartGet.., ChartTimePriceToXY, ChartXYToTimePrice.
Ведь логично предположить, что асинхронным должно быть заполнение таблицы состояния чарта, а сами команды должны лишь считывать данные с этой таблицы. И если данные в момент считывания будут устаревшие на несколько милисекунд, то это не проблема.
Проблема в том, что в погоне за мнимой актуальностью данных, происходят лаги в десятки милисекунд, за которые добытая актуальность становится уже неактуальной в большей степени, если бы изначально эти команды не были асинхронными, а просто они считывали бы последние известные данные таблицы состояния чарта.
И, судя по времени выполнения, эти функции в 4-ке не были асинхронными.

 
Roman:

Выдержка из описания, как это работает в системах реального времени.

Обычно приоритеты являются динамическими, что означает, что во время исполнения они могут изменятся как самими процессами так и ОС.
Реакция на прерывания отделена от вычислений, требующих значительных ресурсов процессора.
Как только происходит событие или прерывание, его обработчик немедленно включается в очередь готовых процессов.
Программы обработчиков прерываний обычно компактны, так как они должны обеспечивать быструю реакцию,
например ввод новых данных, и передавать управление более сложным процессам, интенсивно потребляющим ресурсы процессора, которые исполняются с более низким приоритетом. 

Все как я описал)))) Конечно логика приоритетов динамическая. И в этом сложноть задания уровня. задав уровень приоритета мы не можем определить срок ее выполнения в динамической логике приотиретизации в среде ниже. терминал всегда выше среды вин или линукс и не может влиять на логику приотирезации среды ниже.

 
Nikolai Semko:


Не на все поставленные вопросы предполагаю ответ.

Насколько ресурсоемко само прерывание.
Скорее всего зависит от частоты процессора.

Как долго происходит процесс по сохранению, для дальнейшего возобновления.
В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если:

  • процесс завершился и покинул систему
  • произошла ошибка
  • процесс перешел в состояние ОЖИДАНИЕ
  • исчерпан квант процессорного времени, отведенный данному процессу

Как поймать момент прерывания.
Предварительный делитель – делитель частоты тактового сигнала, работающий как один или несколько последовательно соединенных T-триггеров.

 
Roman:

Не на все поставленные вопросы предполагаю ответ.

Идите поучитесь теме (лет 10 минимум) и не мусорьте в этой ветке, пожалуйста.

Здесь с другой подготовкой и другого класса вопросы обсуждают.

 
Nikolai Semko:
  • Как долго происходит процесс по сохранению всех параметров работающих процессов и(или) потоков, необходимых для дальнейшего возобновления работы?
  • Это сохранение просходит аппаратно или програмно?

ничего не происходит, начиная с 286 процессора? хз, не помню да и не разбирался с ним никогда, но точно с Пентиум-1 (по нему читал книгу, давно правда)

процессор работает в защищенном режиме, каждому процессу выделяется виртуальная память, физические адреса банков памяти (ячейки RAM) транслируются в виртуальные адреса (хотя скорее наоборот? ) самим процессором (не помню, но кажется специальный регистр и виртуальный указатель на таблицу трансляции адресов). Это аппаратное все выполняется, это не подлежит измерению, это так называемое ядро процессора, которые отличают каждую линейку процессоров Интел, это не кэш!

Nikolai Semko:
  • Как долго происходит процесс по востановления процесса?

любая программа в Вин, должна зарегистрироваться как процесс и создать хоть один поток

затем планировщик задач Вин будет выделять ресурсы процессу и отправлять в его очередь сообщения, как работает планировщик - никогда не интересовался, мне достаточно, что приоритет процессу можно поднимать и видно, что при должном усердии ПК начинает подланивать, т.е. Майрософт дают ресурсы моему приложению, этого достаточно, чтобы не лезть в работу ОС

Nikolai Semko:
  • Можно ли замерить эту ресурсоемкость? Наверное нет, ведь как поймать момент прерывания?
  • Какой порядок цифр этих ресурсозатрат - , десятки, сотни наносекунд,микросекунды или десятки и сотни микросекун? Было бы интересно получить такую информацию.

хз, замеры чего? прерывания это аппаратная часть, она обрабатывается ОС, ну естественно с помощью драйверов

таймер? - регистрируешь в ОС себе таймер, получаешь как обычное сообщение в очередь процесса, если не ошибаюсь, то таймер не может забить очередь сообщений, если процесс не обрабатывает их, что то на уровне защиты от дурака в ОС, гугл WM_TIMER - должно быть подробно

порядок цифр? замерить можно только такты процессора, потом Винда умножает на свой расчетный коэффициент, тут обсуждали https://www.mql5.com/ru/forum/352454#comment_18588098 , информации вагон в гугле по замерам производительности

 
Renat Fatkhullin:

Идите поучитесь теме (лет 10 минимум) и не мусорьте в этой ветке, пожалуйста.

Здесь с другой подготовкой и другого класса вопросы обсуждают.

Тут всех нужно отправлять, а не выборочно )) Но как всегда получает по шапке, кто задаёт адекватные вопросы.
После того как я узнал, что обработчики выполняются в блокирующем режиме, не спроста затронул эту тему.
Я реальную суть проблемы затронул, и она вам не нравится. Хорошо прекращаю эту тему.
Но смысла добиваться своевременных событий, в синхронной обработке я не вижу.
Слава, Николай, Валерий благодарю за конструктивный диалог.

 
Igor Makanu:

ничего не происходит, начиная с 286 процессора? хз, не помню да и не разбирался с ним никогда, но точно с Пентиум-1 (по нему читал книгу, давно правда)
Это аппаратное все выполняется, это не подлежит измерению, это так называемое ядро процессора, которые отличают каждую линейку процессоров Интел, это не кэш!

Хорошо если так. 
Думаю, что так и есть. Почти все на уровне железа. Иначе многопоточность не была бы столь эффективной.

 
Nikolai Semko:

Хорошо если так. 
Думаю, что так и есть. Почти все на уровне железа. Иначе многопоточность не была бы столь эффективной.

только так

поиском гуглом: защищенный режим процессора

если не ошибаюсь, то защищенный режим и дает ядру ОС отдельный уровень привилегий, и по причине виртуальной памяти для каждого процесса - невозможно получить данные RAM для запущенной программы...ну разве, что под дебагером запустить как отдельный процесс....это из другой сферы знаний ))) 

но, однозначно все на аппаратном уровне работает, измерить это не возможно, только средствами ОС - да и переключение виртуальной памяти для процессов мгновенное, да и сам процессор работает на внутренней частоте - множитель процессора... а если начать про кэш еще думать, то... зачем? - есть задача, ищем решение! хочешь драйвер написать? осталось найти железо? )))

ЗЫ: драйвер можно написать, помню когда то TCP-логером пользовался, он как драйвер устанавливался и логировал весь трафик и потом по процессам в таблице выводил полностью весь трафик.... осталось придумать как написание драйверов поможет разработать прибыльную ТС ))))



UPD: Хабр "Что такое Protected Mode и с чем его едят"  https://habr.com/ru/post/118881/

UPD: аппаратный уровень(процессор) привилегий для исполнения кода - Вики Кольца защиты

 
Renat Fatkhullin:

Вы всегда гарантированно будете иметь провалы на рандомных одиночных замерах любых команд, включая простейшие ассемблерные типа inc eax. Это архитектурно и объясняется физическими ограничениями "честного распределения квантов времени тысяч потоков на маленькое количество ядер".

Хватит уже тупить и продолжать ловить одиночные выбросы на миллион запросов.

Заметил, что CopyTicks лагает редко. Написал проверочный скрипт

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

и запустил его в стресс-режиме. Алертов у SymbolInfoTick заметно больше, чем у CopyTicks.


Без претензий. Только хотелось бы понять, что в реализациях этих функций так влияет на разное восприятие стресс-нагрузки?

Причина обращения: