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

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

[personal profile] perdakot 2023-12-08 10:53 pm (UTC)(link)
Может, A и B нельзя выполнять в одном цикле?
perdakot: (Default)

[personal profile] perdakot 2023-12-09 06:01 pm (UTC)(link)
одни выполняются в начале цикла, другие в конце цикла

Я думаю, что вы потрясёте это еще немного, выяснится, что нужно еще и в середине цикла. В общем, выполнять в порядке модельного времени.

[personal profile] ichthuss 2023-12-08 11:34 pm (UTC)(link)
Полагаю, что в литературе это попросту записывалось в математической нотации, как state(n+1) = f(state(n)). В этом случае весь забор данных выполняется при предыдущем счетчике, а все записи идут в новый.

[personal profile] ichthuss 2023-12-10 01:36 pm (UTC)(link)
Почему же плохо работает, если это ровно то же, о чем вы пишете, только в другой нотации?

[personal profile] nz 2023-12-08 11:40 pm (UTC)(link)

событие B откладывается на N-1 цикл

Эмулятор машины времени?

[personal profile] nz 2023-12-10 10:44 am (UTC)(link)

Я к тому, что точно -, а не +?
А то звучит как "приходите вчера".

[personal profile] chabapok 2023-12-08 11:42 pm (UTC)(link)
Я мало что понял - но между строк просматривается боль.
Мне кажется, что раз я мало что понял, вы либо слишком сильную абстракцию сделали - либо вам нужно понижать гранулярность. Например, если раньше вы оперировали миллисекундами - то надо перейти на наносекунды.

> дискретного времени на multi-threading

У меня тоже что-то подобное было: сплошные подводные камни.

Уже на этапе работы с часами начинаются проблемы. Например, ntp может двигать время назад. вроде не должен, но иногда делает, например когда високосная секунда прилетает, то ntp переставлял таймер на 1секуну назад. (Щас наверное это уже исправили)

Или например, в старых процах в каждом ядре был свой счетчик тактов, и поскольку каждое ядро имеет свой генератор, то со временем показания тактовых счетчиков у ядер расходятся. А потом операционка перебрасывает задачу на другое ядро. Запрашивается время - и время получается меньше, чем было. (К счастью, потом это починили)

Ну и всякие такое, щас уже не вспомнишь.

сколько ни работаю с часами - такого, чтобы совсем без подводных камней никогда небыло.

Еще бывает, что по ntp приходили пакеты некорректные - и часам крышу срывало полностью.

ircicq: (Default)

[personal profile] ircicq 2023-12-09 12:01 am (UTC)(link)
Напомнило недавний пост о двух тактовых фазах в CPU:
Edited 2023-12-09 00:02 (UTC)
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 (хотя там скорее про структуры данных)
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)
Вот там, где "не приходится задумываться" и скрыты резервы. (^_-)