MT5와 속도 - 페이지 75

 
Valeriy Yastremskiy :

저는 감정가가 아닙니다. 그래프에서. 중요성은 현재 작업 완료에 대한 다른 작업 실행 시작의 의존성에 의해 결정됩니다. 다른 기준은 이차적입니다. 그러나 작업 실행 시간 도 있습니다. 또한 동료들 사이에서 가장 중요합니다. 일반적으로 가장 어렵고 가장 슬픈 것은 설정된 우선순위 알고리즘을 이동 중에도 변경할 수 없다는 점입니다. 참고로 질문이 생기기 전에 개발자의 설명을 듣고 싶습니다. 어렵지만 이것이 환경 발전의 올바른 목표입니다.

이것이 실시간 시스템에서 어떻게 작동하는지에 대한 설명에서 발췌.

일반적으로 우선 순위는 동적입니다. 즉, 실행 중에 프로세스 자체와 OS 모두에 의해 우선 순위가 변경될 수 있습니다.
인터럽트에 대한 응답은 상당한 프로세서 리소스를 필요로 하는 계산과 분리됩니다.
이벤트나 인터럽트가 발생하는 즉시 해당 핸들러는 준비된 프로세스의 대기열에 포함됩니다.
인터럽트 루틴은 빠른 응답을 제공해야 하므로 일반적으로 간결합니다.
예를 들어, 새로운 데이터 입력, 더 낮은 우선 순위에서 실행되는 더 복잡하고 CPU 집약적인 프로세스로 제어를 전송합니다.

 
Roman :

안녕하세요 니콜라이입니다. 그래서 그렇습니다.
하지만 동기화와 같은 문제가 되지 않을까요? Glory가 말하는 것, 즉 정당하지 않은 브레이크입니다.
아니면 문제가 없을까요? )) 우선 순위와 동기화하는 것보다 비동기식 모델을 사용하지 않는 것이 더 쉬울 수 있습니까? ))

안녕하세요.
나는 약간의 지식과 경험이 있지만 비동기 및 인터럽트 전문가가 아닙니다.
타이머 문제에서는 전혀 문제가 없어야 합니다. 왜냐하면 순서는 중요하지 않지만 빈도가 중요합니다. 그리고 자원의 분배에 앉아 있는 상사가 그것을 어떻게 해결할 것인지는 전혀 중요하지 않습니다.
또한 내가 이해하는 것처럼 타이머는 시스템 하드웨어 인터럽트를 기반으로 합니다. 전체 비동기 제어 시스템은 타이머의 인터럽트를 포함하여 하드웨어 인터럽트를 사용하여 구현된다고 생각합니다.
나에게 있어 문제는 인터럽트 자체가 얼마나 리소스를 많이 사용하는지 남아 있습니다.
예를 들어, 하나의 전역 변수 를 증가시키기 위해 프로세서 타이머 트랩이 발생했습니다. 시스템은 이 증분 자체에 약 1나노초를 소비합니다. 하지만:

  • 추가 작업 재개에 필요한 실행 중인 프로세스 및(또는) 스레드의 모든 매개변수를 저장하는 데 얼마나 걸립니까?
  • 이 절약은 하드웨어 또는 소프트웨어를 통해 진행됩니까?
  • 복구 프로세스는 얼마나 걸립니까?
  • 이 자원 집약도를 측정할 수 있습니까? 중단의 순간을 포착하는 방법 때문에 아마 아닐 것입니다.
  • 수십, 수백 나노초, 마이크로초 또는 수십 및 수백 마이크로초와 같이 이러한 리소스 비용에 대한 숫자의 순서는 무엇입니까? 그러한 정보를 받는 것은 흥미로울 것입니다.

일반적으로 지식과 경험이 충분하지 않다는 것을 이해합니다. 따라서 비동기의 우선 순위에 대해 개발자와 질문을 하지 않으려고 합니다. 왜냐하면 특히 주문 거래 및 거래 정보 입수와 관련하여 완벽한 시스템을 구축하려는 시도에는 많은 뉘앙스, 함정 및 막다른 골목이 있음을 이해합니다.
솔직히 말해서 5에서 일부 기능을 비동기식으로 만든 이유를 여전히 이해하지 못하여 큰 불편을 겪습니다. ChartGet.., ChartTimePriceToXY, ChartXYToTimePrice를 의미합니다.
결국 차트 상태 테이블의 채우기가 비동기식이어야 하고 명령 자체가 이 테이블의 데이터만 읽어야 한다고 가정하는 것이 논리적입니다. 그리고 읽는 시점의 데이터가 몇 밀리초 정도 오래된 것이라면 문제가 되지 않습니다.
문제는 가상 데이터 관련성을 추구하는 데 수십 밀리초의 지연이 있으며, 이 동안 획득한 관련성은 훨씬 더 크게 관련이 없게 됩니다. 초기에 이러한 명령이 비동기식이 아니 었지만 단순히 마지막으로 알려진 데이터를 읽을 것입니다. 차트 상태 테이블.
그리고 실행 시간으로 판단하면 4의 이러한 기능은 비동기가 아니었습니다.

 
Roman :

이것이 실시간 시스템에서 어떻게 작동하는지에 대한 설명에서 발췌.

일반적으로 우선 순위는 동적입니다. 즉, 실행 중에 프로세스 자체와 OS 모두에 의해 우선 순위가 변경될 수 있습니다.
인터럽트에 대한 응답은 상당한 프로세서 리소스를 필요로 하는 계산과 분리됩니다.
이벤트나 인터럽트가 발생하는 즉시 해당 핸들러는 준비된 프로세스의 대기열에 포함됩니다.
인터럽트 루틴은 빠른 응답을 제공해야 하므로 일반적으로 간결합니다.
예를 들어, 새로운 데이터 입력, 더 낮은 우선 순위에서 실행되는 더 복잡하고 CPU 집약적인 프로세스로 제어를 전송합니다.

모든 것은 내가 설명한 대로입니다.))) 물론 우선 순위의 논리는 동적입니다. 그리고 이것은 레벨 작업의 복잡성입니다. 우선 순위 수준을 설정하면 아래 환경에서 우선 순위의 동적 논리에서 실행 기한을 결정할 수 없습니다. 터미널은 항상 와인 또는 Linux 환경 위에 있으며 아래 환경 우선 순위 논리에 영향을 줄 수 없습니다.

 
Nikolai Semko :


모든 질문에 답이 있는 것은 아닙니다.

인터럽트 자체가 얼마나 자원 집약적인가.
대부분 프로세서의 주파수에 따라 다릅니다.

추가 갱신을 위해 프로세스를 저장하는 데 얼마나 걸립니까 ?
양자화 기반 알고리즘에 따르면 다음과 같은 경우 활성 프로세스 변경이 발생합니다.

  • 프로세스가 종료되고 시스템을 떠났습니다.
  • 오류가 발생했습니다
  • 프로세스가 보류 상태에 들어갔습니다.
  • 이 프로세스에 할당된 프로세서 시간의 양이 소진되었습니다.

중단의 순간을 포착하는 방법.
프리스케일러는 하나 이상의 직렬 연결된 T 플립플롭으로 작동하는 클록 분배기입니다.

 
Roman :

모든 질문에 답이 있는 것은 아닙니다.

가서 주제를 배우고(최소 10년) 이 스레드에 쓰레기를 버리지 마십시오.

여기에서는 다른 준비와 다른 수업으로 문제가 논의됩니다.

 
Nikolai Semko :
  • 추가 작업 재개에 필요한 실행 중인 프로세스 및(또는) 스레드의 모든 매개변수를 저장하는 데 얼마나 걸립니까?
  • 이 절약은 하드웨어 또는 소프트웨어를 통해 진행됩니까?

286 cpu로 시작하면 아무 일도 일어나지 않습니까? xs, 기억이 나지 않고 다루지 않았지만 확실히 Pentium-1에서

프로세서는 보호 모드에서 작동하고 가상 메모리는 각 프로세스에 할당되며 메모리 뱅크(RAM 셀)의 물리적 주소는 프로세서 자체에 의해 가상 주소로 변환됩니다. 그러나 주소 변환 테이블에 대한 특수 레지스터와 가상 포인터처럼 보입니다. 이 하드웨어는 모두 완료되었으며 측정할 수 없습니다. 이것은 인텔 프로세서의 각 라인을 구별하는 이른바 프로세서 코어이며 캐시가 아닙니다!

니콜라이 셈코 :
  • 복구 프로세스는 얼마나 걸립니까?

Win의 모든 프로그램은 프로세스로 등록하고 적어도 하나의 스레드를 생성해야 합니다.

그런 다음 Vin 작업 스케줄러는 프로세스에 리소스를 할당하고 해당 큐에 메시지를 보냅니다. 스케줄러 작동 방식 - 저는 전혀 관심이 없었습니다. 프로세스의 우선 순위를 높일 수 있고 PC 실사를 통해 땜질하기 시작합니다. Microsoft는 내 응용 프로그램에 리소스를 제공합니다. OS 작업에 참여하지 않는 것으로 충분합니다.

니콜라이 셈코 :
  • 이 자원 집약도를 측정할 수 있습니까? 중단의 순간을 포착하는 방법 때문에 아마 아닐 것입니다.
  • 수십, 수백 나노초, 마이크로초 또는 수십 및 수백 마이크로초와 같이 이러한 리소스 비용에 대한 숫자의 순서는 무엇입니까? 그러한 정보를 받는 것은 흥미로울 것입니다.

이봐, 무엇의 측정? 인터럽트는 하드웨어이며, 물론 드라이버의 도움으로 OS에 의해 처리됩니다.

시간제 노동자? - OS에 타이머를 등록하면 프로세스 대기열에서 일반 메시지로 수신됩니다. 내가 틀리지 않은 경우 프로세스가 처리하지 않으면 타이머가 메시지 대기열을 채울 수 없습니다. OS 풀프루프 수준에서 , Google WM_TIMER - 상세해야 함

숫자 순서? 프로세서 주기만 측정할 수 있으며 Windows는 여기에서 논의된 계산된 계수를 곱합니다. https://www.mql5.com/ru/forum/352454#comment_18588098

 
Renat Fatkhullin :

가서 주제를 배우고(최소 10년) 이 스레드에 쓰레기를 버리지 마십시오.

여기에서는 다른 준비와 다른 수업으로 문제가 논의됩니다.

여기에 모든 사람이 보내야하며 선택적으로 보내지는 않습니다)) 그러나 항상 그렇듯이 적절한 질문을하는 사람은 모자를 얻습니다.
핸들러가 차단 모드에서 실행된다는 것을 알게 된 후 이 주제를 다루지 않았습니다.
나는 문제의 진정한 본질을 만졌는데 당신은 그것을 좋아하지 않습니다. 글쎄, 나는이 주제를 멈출 것이다.
그러나 동기 처리에서 시기적절한 이벤트를 달성하는 것이 요점이라고 생각하지 않습니다.
감사합니다, Nikolai, Valery, 건설적인 대화에 감사드립니다.

 
Igor Makanu :

286 cpu로 시작하면 아무 일도 일어나지 않습니까? xs, 기억이 나지 않고 다루지 않았지만 확실히 Pentium-1에서
이 하드웨어는 모두 완료되었으며 측정할 수 없습니다. 이것은 인텔 프로세서의 각 라인을 구별하는 이른바 프로세서 코어이며 캐시가 아닙니다!

그렇다면.
나는 그것이라고 생각한다. 거의 모든 것이 철 수준입니다. 그렇지 않으면 멀티스레딩이 효율적이지 않을 것입니다.

 
Nikolai Semko :

그렇다면.
나는 그것이라고 생각한다. 거의 모든 것이 철 수준입니다. 그렇지 않으면 멀티스레딩이 효율적이지 않을 것입니다.

유일한 방법

구글 검색: 프로세서 보호 모드

내가 틀리지 않았다면 보호 모드는 OS 커널에 별도의 권한 수준을 부여하고 각 프로세스의 가상 메모리 때문에 실행중인 프로그램에 대한 RAM 데이터를 얻는 것이 불가능합니다 ... 글쎄, 그것이 가능하다는 것을 제외하고는 별도의 프로세스로 디버거에서 실행 .... 이것은 다른 지식 영역에서 나온 것입니다.

그러나 분명히 모든 것이 하드웨어 수준에서 작동하며 OS를 통해서만 측정하는 것은 불가능합니다. 프로세스를 위한 가상 메모리 전환은 즉각적이며 프로세서 자체는 내부 주파수(프로세서 승수)에서 작동합니다. . 그리고 캐시에 대해 생각하기 시작하면 ... 왜? - 문제가 있습니다. 해결책을 찾고 있습니다! 드라이버를 작성하시겠습니까? 철을 찾으러 떠났다? )))

추신: 드라이버를 작성할 수 있습니다. TCP 로거를 사용했을 때를 기억합니다. 드라이버로 설치되어 모든 트래픽을 기록한 다음 테이블의 프로세스별로 모든 트래픽을 출력합니다.... 기사를 쓰는 것이 수익성있는 차량을 개발하는 데 어떻게 도움이되는지))))



UPD: Habr "보호 모드란 무엇이며 무엇과 함께 먹습니까?" https://habr.com/en/post/118881/

UPD: 코드 실행을 위한 하드웨어 수준(프로세서) 권한 - Wiki Rings of Protection

 
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보다 눈에 띄게 더 많은 경고가 있습니다.


소박합니다. 이러한 기능의 구현에서 무엇이 스트레스 부하에 대한 다른 인식에 영향을 미치는지 이해하고 싶습니다.