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

public class SimuleOnesystem { 
// a set of parameters
class Arrival{// here we simulate the arrival of works to a server
 // the code..
}
class Service{// here we simulate the services  }
class Departure{// means that the work is well done
 }
}

Мой вопрос в том, как я мог бы использовать этот код в многопоточном режиме, я имею в виду, что хотел бы запустить, например, 5 централизованных систем одновременно, в которых каждая система имеет свои собственные часы моделирования, список событий и т. Д., И эти системы могут обмениваться данными между собой. в части отправки и получения запросов и выполнения заданий и т. д.

Заранее спасибо.

0
jojo 25 Авг 2011 в 18:12

3 ответа

Лучший ответ

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

Насколько я понимаю, ваш пример является довольно типичным дискретным моделированием событий . Попытка распараллелить их даже между потоками, то есть в одном адресном пространстве (выполняется одной и той же JVM на одной машине, которая может иметь несколько ядер и т. Д.), Не совсем тривиальна. Я предлагаю вам начать с чтения вводного материала по этому вопросу (я бы порекомендовал эта книга).

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

Алгоритмы, предотвращающие возникновение подобных ситуаций, называются алгоритмами синхронизации . По сути, существует два вида этих методов: оптимистичные методы позволяют таким сбивчивым событиям (сообщениям из прошлого) происходить, но обнаруживают их и при необходимости устраняют любые несоответствия. Однако в вашем случае кажется целесообразным сначала взглянуть на консервативные алгоритмы, которые полностью избегают таких методов. Их (обычно) проще реализовать, но они работают хорошо только в том случае, если есть определенные задержки между отправителем события и временем, когда событие должно быть выполнено (например, см. этот классический документ , чтобы узнать подробности, или этот более свежий, подробно описывающий систему моделирования на основе Java, которая использует консервативную синхронизацию). Если у вас есть алгоритм синхронизации, он также будет управлять вашими локальными часами моделирования.

Поскольку реализация этих алгоритмов занимает довольно много времени, вы также можете рассмотреть возможность использования некоторой среды моделирования на основе Java или библиотеки, которая уже предоставляет методы (это хорошо известная проблема).

1
Community 23 Май 2017 в 11:47

На самом базовом уровне все, что вам нужно сделать, это создать SimuleOnesystem Thread или Runnable - затем из программы драйвера, такой как метод main, создать как сколько угодно тем и start их.

0
ring bearer 25 Авг 2011 в 14:15