vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2023-12-08 01:20 pm

Два типа событий

Я тут по работе взялся переделать некий симулятор дискретного времени на multi-threading. Приходится переосмысливать саму организацию цикла выполнения и очереди событий. Пришёл к выводу, что события должны быть двух типов: одни выполняются в начале цикла, другие в конце цикла. Поясню картинкой.



Представим, что мы прогнали симулятор до останова #24 (модельное время равно 24), а затем дали команду выполнить ещё один цикл (до останова #25). Что при этом произойдёт?

Из очереди событий выполнятся некоторые действия (типа A), затем счётчик модельного времени увеличится на единицу, после этого выполнятся ещё какие-то действия (типа B).

События типа A - это "неразрушающие" действия, типа чтения из памяти. Они не изменяют состояние моделируемого объекта. События типа B - изменение состояния, например запись в память.

По опыту, события A обычно начинают некоторый процесс, растянутый по времени. События B завершают его. К примеру, рассмотрим выполнение оператора "x += 1". Оно состоит из двух событий:
  • чтение значения x - событие типа A
  • запись значения x+1 - событие типа B
Если выполнение этого оператора занимает один такт - действия A и B выполняются в одном цикле симуляции. Если больше - событие B откладывается на N-1 цикл.

Почему-то нигде раньше, ни в коде, ни в литературе я не встречал такой организации очереди событий.
vit_r: default (Default)

[personal profile] vit_r 2023-12-09 08:44 am (UTC)(link)
Автоматы Мили и Мура не стоит, наверно, совмещать в одной схеме. B надо разбивать на части.
vit_r: default (Default)

[personal profile] vit_r 2023-12-09 08:12 pm (UTC)(link)
С автоматами проще.
vit_r: default (Default)

[personal profile] vit_r 2023-12-09 08:59 pm (UTC)(link)
Вот там, где "не приходится задумываться" и скрыты резервы. (^_-)