Как реализовать детерминированное однопоточное моделирование сети

Я прочитал о том, как FoundationDB проводит тестирование / моделирование сети, здесь: http://www.slideshare.net/FoundationDB/deterministic-simulation-testing

Я хотел бы реализовать нечто очень похожее, но не могу понять, как они на самом деле это реализовали. Как можно было бы написать, например, класс C++, который делает то, что они делают. Можно ли выполнить имитацию, которую они делают, без генерации кода (как они предположительно делают)?

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

2 ответа

Решение

Вы можете найти немного больше деталей в выступлении, которое сопровождало эти слайды, здесь: https://www.youtube.com/watch?v=4fFDFbi3toc

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

(1) Сгенерируйте все случайные числа из PRNG, который вы посеете с известным значением.

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

(3) Убедитесь, что любой механизм, который вы выбираете для параллелизма, имеет режим, в котором он может гарантировать детерминированный порядок выполнения.

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

Все это более подробно рассмотрено в докладе, который я связал выше.

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

После этого, похоже, самая большая проблема, которую я видел, - это убедиться, что вы не перебираете коллекции с недетерминированным порядком. Например, в Java вы бы использовали LinkedHashMap вместо HashMap.

Другие вопросы по тегам