Используйте блок очереди для управления сообщениями

В этом примере показано, как использовать блок Queue для хранения и постановки сообщений в очередь. Блок Queue позволяет вам задавать емкость памяти сообщений, политику перезаписи и политику сортировки во время переходов сообщений.

Управление переходами сообщений с помощью политик сортировки очередей

Блок Queue поддерживает три политики сортировки сообщений:

  • Last-in-first-out (FIFO) - новейшее сообщение в хранилище отправляется первым.

  • First-in-first-out (FIFO) - самое старое сообщение в хранилище отправляется первым.

  • Приоритет - Сообщения сортируются в зависимости от их приоритета. Очередь приоритетов может использоваться только при снятии флажка Перезаписать самый старый элемент, если очередь полна.

Этот пример использует простую модель связи на основе сообщений, которая введена в Animate и Понимание Отправки и Приема Сообщений. Модель включает Поток сообщений 1 и Поток сообщений 2, в которых сообщения передаются от Синуса Wave1 к Scope1 и Синуса Wave2 к Scope2.

Описание модели

В потоке сообщений 1 и потоке сообщений 2:

  • Параметр Шага расчета Sine Wave1 и Sine Wave2 установлены в 0.1. Они являются идентичными источниками синусоид.

  • Параметру Шага расчета Receive1 и Receive2 задано значение 0.5. Они идентичны блокам Receive.

  • Емкость Queue1 и Queue2 100. Обе очереди имеют одинаковую емкость.

  • Политика сортировки Queue1 LIFO а Queue2 есть FIFO, который отображается под метками блоков. Единственное различие между двумя сценариями потока сообщений - политика сортировки очереди.

  • Сигналы среди Wave1, Receive1 и Receive2 Sine регистрируются.

Моделируйте модель и просмотрите результаты

Симулируйте модель и наблюдайте результаты в Данные моделирования Inspector.

Наблюдайте выходы от Sine Wave1. Выход от SineWave2 не отображается, потому что он идентичен SineWave1. Также обратите внимание, что сигнал от Receive1 является представлением синусоиды, но с более длинными интервалами между отсчетами. Однако сигнал от Receive2 является первой частью синусоиды, достигающей положительного пика, потому что политика сортировки блока Queue установлена на FIFO и его емкость достаточно велика, чтобы хранить сообщения.

Политики перезаписи сообщений блоков очереди

Можно также задать политику перезаписи сообщений блоков очереди, когда очередь полна:

  • По умолчанию установлен флажок Перезаписать самый старый элемент, если очередь полна. Блок всегда принимает входящее сообщение, перезаписывая самое старое сообщение в памяти. В этом случае блок перезаписывает самое старое сообщение, но сообщение, покидающее блок, определяется политикой сортировки очереди.

В этом примере поведения очереди сообщения перечисляются на основе времени их поступления в очереди FIFO и LIFO с емкостью 8. Новое сообщение с номерными 9 прибывает. В случаях FIFO и LIFO, 9 сообщений заменяет сообщение 1, поскольку это самый старый элемент в очереди. Однако наблюдайте смену головы и хвоста очереди в течение этого процесса. В очереди FIFO сообщите 2 отходит первым, потому что это самое старое сообщение после сообщения 1 заменяется. В очереди LIFO сообщите 9 отправляется первым, потому что это последнее сообщение, которое поступает в хранилище. После отправки сообщения появится новое сообщение 10 прибывает. Очередь принимает новые сообщения в пустой интервал.

  • Если флажок Перезаписать самый старый элемент, если очередь полна, снимается, значок блока Очередь изменяется, и блок не принимает новые сообщения, когда очередь полна. Это поведение очереди блокировки.

Блок очереди с включенной политикой перезаписи

В модели QueueSortingPoliciesModelSequenceViewer емкости блоков Queue в Потоке сообщений 1 и Потоке сообщений 2 изменяются на 15. Уменьшение емкости приводит к перезаписи входящих сообщений существующих таковых в хранилище.

Симулируйте модель и откройте блок Sequence Viewer. В блоке Sequence Viewer прокрутите вверх или щелкните значок «Перейти к первому событию» слева. Следите за сообщениями, уходящими из блока, на основе политик FIFO и LIFO.

Оба блока Queue имеют ограниченную емкость. Когда их емкость переполнена, новое входящее сообщение перезаписывает самое старое существующее сообщение в очереди. Прокрутите вниз и заметьте, что блок Sequence Viewer отображает сообщения, которые перезаписывают существующие таковые.

Пример поведения блокирующей очереди

Откройте модель QueueOverWritingPolicyModel, чтобы просмотреть поведение очереди блокировок.

В блоке Receive установите параметр Шага расчета равным 0.5.

Заметьте, что в блоке Queue:

  • Флажок Перезаписать самый старый элемент, если очередь полна, снимается. Наблюдайте изменение значка блока.

  • Параметру Capacity задано значение 16.

  • На вкладке Statistics установлены флажки Number of entities off, d and Number of entities in block, n.

Моделируйте модель и рецензируйте результаты

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

Блок Очередь блокирует сообщения, когда снимается флажок Перезаписать самый старый элемент, если очередь полна. Можно увеличить емкость блока Queue, чтобы предотвратить сброс сообщения.

Используйте статистику для анализа поведения очереди

Если флажок Перезаписать самый старый элемент, если очередь полна, снимается, вкладка Статистика активируется. Используйте вкладку Statistics, чтобы включить выходные порты и наблюдать за статистикой блоков очереди. Статистика для генерации кода не поддерживается.

Наблюдайте сигналы, отмеченные количеством сообщений в блоках и количеством сообщений, отправленных. До времени симуляции 2, есть 16 сообщений в памяти, которая является емкостью очереди. После этого количество сообщений в блоке принимает значения 15 и 16 потому что сообщения отходят каждый 0.5 время симуляции и приходит новое сообщение.

Во времени симуляции 10, в общей сложности 21 сообщения покидают блок.

Использование действий события

Можно также использовать Действия события, если флажок Перезаписать самый старый элемент, если очередь полна, снят. Действия события не поддерживаются для генерации кода. Для получения дополнительной информации см. События и Действия события (SimEvents).

Используйте действия События, чтобы задать поведение сообщения в определенных событиях. Например, действия Entry и Exit вызываются непосредственно после ввода сообщения и непосредственно перед выходом сообщения. Действие Заблокировано вызывается после блокировки сообщения.

Для получения дополнительной информации смотрите Модель интерфейса получения сообщений, который запускается при доступности сообщений.

Можно также смоделировать более сложные политики связи с помощью блоков из библиотеки SimEvents ®, которая требует лицензии SimEvents ®.

См. также

| | | | |

Похожие темы