ТЕМА (1086517), страница 4
Текст из файла (страница 4)
Классический случай использования последовательности SЕIZЕ - АDVANCЕ - RELЕАSЕ показан на рис.7.1.
Рис.7.1. Пример последовательности SЕIZЕ - АDVANСЕ - RЕLЕАSЕ
(ЗАНЯТЬ - ЗАДЕРЖАТЬ - ОСВОБОДИТЬ).
Транзакт, двигающийся по этой цепочке, займет устройство с символическим именем JОЕ, задержится там на 16-4 единицы времени и затем покинет его. После того, как транзакт войдет в блок RЕLЕАSЕ и соответствующая подпрограмма закончится, интерпретатор попытается продвинуть транзакт в следующий блок. Вполне возможно, что транзакт задерживается в блоке после того, как обработана подпрограмма.
Этот тип входа с оставлением транзакта в блоке является вынужденным; транзакт предпочитает двигаться дальше по модели, если этому не противоречат условия моделирования. Сравните эту ситуацию с добровольным пребыванием транзакта в блоке АDVANCЕ.
Ответ на второй вопрос касается дисциплины обслуживания очереди. Дисциплиной обслуживания очереди является правило, в соответствии с которым прибор выбирает на обслуживание следующий транзакт, если таких транзактов больше, чем один. В обычном режиме мы используем дисциплину обслуживания "первым пришел - первым обслужен".Тот, кто ждет дольше других, будет первым. Эту дисциплину обслуживания используют в GPSS по умолчанию.
На самом деле дисциплина обслуживания, используемая по умолчанию в GPSS, является более сложной, чем "первым пришел - первым обслужен"; ее реализуют только для транзактов одного класса приоритетов.
Транзакту присваивается некоторый приоритет. Уровень приоритета ожидающих транзактов автоматически учитывается интерпретатором при выборе на обслуживание. В примере, следующем далее (пример 2С), показано, как используют эту дисциплину обслуживания.
В момент, когда закончится обработка программы RЕLЕАSЕ, следующий транзакт попытается использовать устройство, называемое JОЕ.
Из рис. 7.1 вовсе не следует, что блоки АDVANCЕ можно располагать только после блоков SEIZЕ или они должны предшествовать блокам RELЕАSЕ. Блоки АDVANCЕ можно располагать в любых местах моделей. Выбор места зависит от логических условий моделирования.
§8 "Сбор статистики при ожидании.
Блоки QUEUE (СТАТЬ В ОЧЕРЕДЬ) и DЕРАRТ (ПОКИНУТЬ ОЧЕРЕДЬ)"
Блоки QUEUE (СТАТЬ В ОЧЕРЕДЬ) и DЕРАRТ (ПОКИНУТЬ ОЧЕРЕДЬ) обеспечивают в GPSS возможность автоматического сбора статистических данных, описывающих вынужденное ожидание, которое может происходить время от времени в различных точках модели. В первой части этого параграфа описаны блоки, предназначенные для реализации такой возможности. Далее описаны редко используемые возможности этих блоков. В конце прокомментированы два неверных представления о процессе сбора статистики.
Принципы использования блоков QUЕUЕ и DЕРАRТ
В любых системах массового обслуживания число ресурсов ограничено. Это означает, что не всегда можно немедленно предоставить ресурс при каждом требовании на его использование. В парикмахерской, например, таким ограниченным ресурсом является сам парикмахер. Если он занят в момент прихода клиента, то последний вынужден ждать своей очереди. В действительности, ожидающие обслуживания требования всегда составляют очередь, что дало основание называть такие системы системами с очередями (системами массового обслуживания).
Воспользуемся собственным опытом при использовании ограниченного ресурса и рассмотрим, какие события при этом происходят.
-
Присоединяемся к очереди, т.е. образуем с другими требованиями группу "ожидающих обслуживания". Присоединение к очереди происходит в некоторый момент времени.
-
Ждем своей очереди. Ожидание происходит в течение некоторого интервала времени.
-
Покидаем очередь. Уход из очереди происходит в некоторый момент времени. Очень часто бывает необходимо собрать статистику, описывающую особенности протекания процесса. Эта статистика должна дать ответ на следующие вопросы:
-
Сколько раз требования приходили в очередь?
-
Сколько пришедших требований фактически присоединилось к очереди и сколько сразу заняли прибор?
-
Каково было максимальное значение длины очереди?
-
Каково было среднее число ожидающих требований?
-
Каково среднее время ожидания тех требований, которым пришлось ждать?
-
Специализированный язык, разработанный для моделирования систем массового обслуживания, должен иметь средства сбора такого рода статистической информации. GPSS обеспечивает такую возможность с помощью средства, называемого регистратором очереди. При использовании разработчиком регистратора очереди в тех точках модели, где число ресурсов ограничено, интерпретатор начинает автоматически собирать статистику, описывающую ожидание (если оно есть), возникающее в этих точках.
Регистратор очереди во многих отношениях подобен такому элементу моделирования, как прибор. Как и при использовании приборов, в модели может быть несколько различных регистраторов очередей. При использовании регистраторов очередей в точках, где возможно ожидание, собирается статистика, описывающая поведение очереди в соответствующей точке модели.
Регистраторы очередей различают заданием имен. Условия назначения имен те же, что и условия назначения имен приборов. Имена могут быть числовыми или символическими. Если они числовые, то числа должны быть целыми и положительными. Наибольший номер, используемый в модели, должен быть равным максимальному числу регистраторов в модели. (Как и при использовании приборов, максимальное число регистраторов очередей,допустимое при моделировании, зависит от объема используемой памяти.
Максимальное число регистраторов очередей равно (О, 150 и 300 для 64К, 128К и 25бК байт памяти соответственно). Если имя символическое, оно должно содержать от трех до пяти алфавитно-цифровых символов, причем первые три символа должны быть алфавитными.
Разработчик вносит регистратор очереди в модель с помощью пары взаимодополняющих блоков. Такой парой являются блоки, моделирующие упомянутые выше события 1 и 3. Когда транзакт входит в первый из этих блоков, моделируется событие "присоединение к очереди". Подобным образом, когда транзакт входит во второй из них, моделируется событие "уход из очереди". Блоками, соответствующими событиям "присоединение" и "уход", соответственно являются QUEUE (СТАТЬ В ОЧЕРЕДЬ) и DЕРАRТ (ПОКИНУТЬ ОЧЕРЕДЬ). Эти два блока вместе с операндом А показаны на рис. 8.1.
Операнд А используют в блоках QUEUE и DЕРАRТ для указания имени соответствующей очереди. При входе транзакта в блок QUEUE выполняется обработка соответствующей подпрограммы, включающей следующие четыре действия:
-
"Счетчик входов" для данной очереди увеличивается на единицу.
-
Запись "счетчика текущего содержимого" для данной очереди также увеличивается на единицу.
-
Транзакт "привязывается" к очереди указанием ее имени.
-
Транзакт "привязывается" к очереди с запоминанием значения текущего модельного времени.
Рис. 8.1. Блоки QUEUE (СТАТЬ В ОЧЕРЕДЬ) и DEPART (ПОКИНУТЬ ОЧЕРЕДЬ) с операндами А :
| Блоки QUEUE (СТАТЬ В ОЧЕРЕДЬ) и DEPART (ПОКИНУТЬ ОЧЕРЕДЬ) с операндами А: | ||
| Операнд | Значение | Значение или результат по умолчанию |
| А | Имя (символическое или числовое) очереди, к которой необходимо присоединиться или котороую надо покинуть | Ошибка |
Когда транзакт присоединяется к очереди, устанавливается факт привязки транзакта. В этом смысле информация, указывающая, что конкретный транзакт является элементом очереди, приписывается самому транзакту. Транзакт перестает быть элементом очереди только тогда, когда он переходит в блок DЕРАRТ соответствующей очереди. Когда это происходит, интерпретатор выполняет подпрограмму обработки блока, включающую следующее:
-
Запись "счетчика текущего содержимого" соответствующей очереди уменьшается на единицу.
-
Используя привязку к значению времени, интерпретатор определяет, является ли время, проведенное транзактом в очереди, нулевым. Если да, то такой транзакт по определению является транзактом с "нулевым пребыванием" в очереди; соответствующим образом изменяется счетчик "нулевых вхождений" (причина возникновения нулевых вхождений объяснена ниже).
-
Ликвидируется привязка транзакта, ука- зывающая на принадлежность транзакта соответствующей очереди.
В конце моделирования интерпретатор автоматически распечатывает такие элементы статистики, как "счетчик входов", "максимальное содержимое", "среднее значение содержимого" и "счетчик текущего содержимого". Распечатывается также среднее время пребывания в очереди.
Рассмотрим подробнее значение среднего времени пребывания в очереди. Интерпретатор может накапливать эти статистические данные двумя способами. Одним из них является расчет времени пребывания в момент входа каждого из транзактов в блок DЕРАRТ (ПОКИНУТЬ ОЧЕРЕДЬ). На самом деле интерпретатор поступает иначе. Вместо того, чтобы независимо обрабатывать блок DЕРАRТ, интерпретатор отслеживает полное время нахождения в очереди, накопленное до текущего времени, получаемое суммированием значений для всех прошедших и находящихся в очереди транзактов.
Таким обрадом, в любой момент времени интерпретатором может быть рассчитано среднее время пребывания в очереди делением полного времени пребывания в очереди, накопленного до текущего времени, на значение счетчика входов. Преимуществом такого подхода является учет тех транзактов, которые не покидамт очередь в момент обработки статистики. Недостатком же является тот факт, что это время будет несколько занижено, поскольку те транзакты, которые еще не вышли из очереди (если таковые имеются), должны оставаться в очереди еще некоторое время, а это никак не учитывается в расчете.
Фактически интерпретатором рассчитываются два статистических параметра времени нахождения в очереди. Один из них является средним временем по всем входам в очередь. Обычно часть входов в очередь имеет нулевое время пребывания в очереди, т. е. им не приходится ждать. Поэтому интерпретатор также считает и статистику для среднего времени пребывания в очереди, исключая те входы, которые не вызвали ожидания. Это объясняет, для чего транзакту приписывается значение содержимого таймера при входе в блок QUEUE и для чего в блоке DЕРАRТ проверяется, не было ли время ожидания этого транзакта нулевым.
Рассмотрим теперь пример записи пары блоков QUEUE и DЕРАRТ в модели. Рассмотрим снова рисунок примера последовательности ЗАНЯТЬ -ЗАДЕРЖАТЬ-ОСВОБОДИТЬ.
Пример последовательности SЕIZЕ - АDVANСЕ -RЕLЕАSЕ
Ожидание может возникнуть ввиду занятости прибора с именем JОЕ. Предположим, что мы собираем статистику об этом ожидании. В сегмент модели регистратор очереди будет введен блоками QUEUЕ и DЕРАRТ (рис. 8.2). Регистратору очереди присвоено произвольное символическое имя JОЕQ.
Рис.8.2. Добавление сегмента регистратора очереди
Как же работает показанный на рисунке сегмент модели? Положим, что транзакт вошел в этот сегмент в момент, когда прибор JOЕ не занят. Транзакт входит в блок QUEUE, при этом выполняется соответствующая подпрограмма. Модифицируется счетчик входов, содержимое очереди увеличивается на 1, транзакту приписывается время входа в очередь и имя очереди. Далее транзакт тут же пытается войти в блок SEIZЕ. Поскольку прибор JОЕ свободен, эта попытка оказывается успешной.
Выполняется подпрограмма SEIZЕ, и состояние прибора JОЕ изменяется со "свободно" на "занято". Далее транзакт немедленно попадает в блок DЕРАRТ. Выполняется соответствующая подпрограмма, счетчик содержимого очереди уменьшается на 1, и т. д. Продолжая продвижение, транзакт попадает в блок АDVANCE. Вычисляется время задержки в соответствии с распределением 16 ± 4, и транзакт временно прекращает продвижение. Все это происходит в какой-то определенный момент модельного времени. Это означает, что хотя транзакт входит в очередь JОЕQ, время его пребывания в этой очереди равно нулю, т. е. вхождения вызваны тем простым фактом, что блок SEIZЕ располагается между блоками QUEUE и DЕРАRТ. Все транзакты, попадающие на прибор, должны пройти через пару QUEUE - DЕРАRТ, даже если прибор свободен и его можно занять.
Предположим теперь, что прибор JОЕ находится в занятом состоянии, и следующий транзакт входит в сегмент модели рис. 8.2. Проходя блок QUEUE, он модифицирует значения счетчика входов и счетчика текущего содержимого. Ему приписывается имя очереди и значение таймера в момент входа в очередь.
Далее происходит отказ, поскольку прибор JОЕ занят. Транзакт вынужденно перестает продвигаться, оставаясь в блоке QUEUE. Позднее, когда транзакт, находящийся на приборе, покидает его, ожидающий транзакт опять попытается войти в блок SEIZE. На этот раз попытка окажется успешной. Двигаясь дальше, транзакт войдет в блок DЕРАRТ, уменьшая значение счетчика содержимого очереди на 1, и т. д. В описанной ситуации транзакт проходит блоки QUEUE и DEРАRТ в различные моменты модельного времени. Это означает, что имеет место "ненулевое вхождение" в очередь.
Использование операнда В в блоках QUEUE и DЕРАRТ.
В блоках QUEUE и DEРАRТ существует возможность использования операнда В. На рис. 8.3 повторен рис. 8.1, но с использованием операнда В. Операнд В указывает на какую величину должен быть модифицирован счетчик содержимого очереди. По умолчанию для этого операнда подразумевается значение 1.
Рис.8.3. Блоки QUEUE и DEPART с операндами А и В:
| Блоки QUEUE и DEPART с операндами А и В: | ||
| Операнд | Значение | Значение или результат по умолчанию |
| А | Имя (символическое или числовое) очереди | Ошибка |
| В | Число элементов, на которое должно измениться значение счетчика содеожимого очереди | Еденица |
На рис.8.2 именно это значение и используется. Лучше всего проследить влияние операнда В при рассмотрении поведения интерпретатора во время выполнения подпрограмм блоков QUEUE и DЕРАRТ. При выполнении подпрограммы QUEUE происходит следующее:
-
Увеличивается значение счетчика входов сооветствующей очереди на число, равное значению операнда В.
-
Увеличивается значение счетчика содержимого очереди на число, равное значению операнда В.
-
Транзакту приписывается имя очереди.
-
Транзакту приписывается текущее значение модельного времени.
Пп. 3 и 4 были пояснены ранее. Пп. 1 и 2 показывают влияние использования операнда В на значение содержимого очереди. Очевидно, что если в блоке QUEUE использован операнд В, отличный от 1, то значение счетчика входов не будет равно числу транзактов, вошедших в этот блок. Подобным образом, содержимое очереди не будет совпадать с числом транзактов, которые привязаны к данной очереди. Например, когда транзакт переходит в блок "QUEUE LINE,2", то и счетчик входов и счетчик содержимого очереди, названной LINЕ, увеличивается на 2, но суммарное число транзактов, присоединившихся к очереди, увеличивается только на 1,и число транзактов, находящихся в очереди, также увеличивается на 1.















