Project

General

Profile

Actions

Ядро симулятора

Ядро представляет собой некоторый движок (engine), работающий по парадигме часов. Ядро имеет тактовый генератор, тик которого запускает процессы обработки событий – начинается передача и обработка пакетов и т.д. Существует два различных способа построения ядра – рассмотрим оба из них.

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

Второй способ заключается в том, чтобы запустить всего один поток – «поток ядра», внутри которого будет происходить обработка пакетов.

Теперь проанализируем оба способа построения. Ясно, что в первом способе возникают различные проблемы синхронизации – мы не можем запускать следующий тик, пока не отработают все потоки. То есть, нужно будет как-то сообщать об окончании обработки и корректировать соответствующим образом время (чтобы тики не накладывались). Во втором способе таких проблем не возникает – мы сразу понимаем, когда у нас закончилась обработка – она закончилась при выходе из функции. Кроме этого, у потоков могут быть различные общие данные, поэтому придётся ещё решать проблемы, связанные с синхронизацией доступа и избегать взаимных блокировок, чего во втором способе нет. Поэтому для реализации выберем второй способ, как наиболее простой.

В постановке задачи было сказано, что необходимо обеспечить распределённую систему симуляторов. Каждый симулятор из этой системы будем называть узлом. Так как у нас сущности «среда передачи данных» и «интерфейс» расположена в ядре, то это распределение выполняется простым образом – каждый узел будет располагать своими отдельными устройствами, а взаимодействие между устройствами, которое происходит через среду передачи данных, будем иногда выполнять, передавая данные по реальной сети. При этом нужно будет дополнительно (кроме данных) указывать, по какой среде передачи мы передаём данные.

Updated by Виктор Самунь almost 11 years ago · 4 revisions