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 цикл.

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

[personal profile] spamsink 2023-12-09 03:22 am (UTC)(link)
Собственно, обновление значений сигналов в левых частях non-blocking assignments с задержкой - это и есть события типа B.

Кстати, https://dl.acm.org/doi/pdf/10.1145/360715.360758 (хотя там скорее про структуры данных)