omnetpp: избегайте ошибки "отправка во время передачи" с помощью sendDelayed()

Я внедряю PON в OMNet++ и пытаюсь избежать ошибки времени выполнения, возникающей при передаче во время другой передачи. Единственный способ избежать этого - использовать sendDelayed() (или же scheduleAt() + send() но я не предпочитаю так).

Хотя я использовал sendDelayed() Я все еще получаю эту ошибку во время выполнения. Мой вопрос: когда именно ядро ​​проверяет, свободен ли канал, если я использую sendDelayed(msg, startTime, out)? Это проверяет в simTime() + startTime или в simTime()?

Я прочитал Руководство по моделированию, но не совсем понятно, о чем я спрашиваю.

1 ответ

Решение

Бизнес канала проверяется только тогда, когда вы запланируете сообщение (т.е. в simTime (), как вы просили). На этом этапе проверяется, планируется ли доставить сообщение одновременно с channel->getTransmissionFinishTime() т. е. вы можете запросить, когда закончится текущая передача, и вы должны запланировать сообщение на это время или позже). Но учтите, что эта проверка предназначена только для выявления наиболее распространенных ошибок. Если вы запланируете, например, ДВА сообщения на одно и то же время с помощью sendDelayed (), ядро ​​проверит только то, что запускается после завершения текущего идентификатора передаваемого сообщения, но НЕ обнаружит, что вы запланировали два или более сообщений на одно и то же время после этой точки. во время.

Как правило, когда вы передаете по каналу, для которого дата данных установлена ​​на ненулевое время (т. Е. Для передачи сообщения требуется время), вы всегда должны позаботиться о том, что происходит, когда сообщения приходят быстрее, чем скорость канала. В этом случае вы должны либо выбросить сообщение, либо поставить его в очередь. Если вы ставите его в очередь, вам, очевидно, придется поместить его в структуру данных (очередь), а затем запланировать выполнение таймера автоспуска в тот момент, когда канал сообщений освобождается (и сообщение доставляется на другой стороне). На этом этапе вы должны получить следующий пакет из очереди, поместить его в канал и запланировать следующий таймер автоспуска на время доставки этого сообщения.

По этой причине, используя только sendDelayed() НЕ является правильным решением, потому что вы просто пытаетесь неявно реализовать очередь, откладывая сообщение. В этом случае проблема заключается в том, что, как только вы запланируете сообщение с помощью sendDelay (), какую задержку вы будете использовать, если поступит другой пакет, а затем другой будет коротким периодом времени? Как видите, вы неявно создаете здесь очередь, откладывая событие. Вы просто используете основную очередь событий симуляции для хранения пакетов, но это намного более запутанно, подвержено ошибкам.

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

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