Косвенная адресация
Пр.: ASSIGN 5,1
Прямая адресация. Параметру 5 присваивается значение 1.
ASSIGN P5,1
Косвенная адресация . Параметру, № которого содержится в параметре 5, присвоить значение 1. Эта запись аналогична следующей:
ASSIGN *5,1
Q5- прямая адресация. Q-СЧА
QP5- косвенная адресация.
Q*5- такое обозначение используется в GPSS вместо QP5
Пример 9.2Пусть имеется ВС. В ней есть 2 детали (модуля) А и В. Для модуля А – свое время жизни, для модуля В – свое. Когда отказывает, например, А вставляют запасную деталь А, у которой имеется свое время жизни.
* Переменные V1 и V2 задают время жизни деталей 1 и 2 соответственно.
FVARIABLE | .......... | |
FVARIABLE | .......... |
* Переменная AFIX определяет время ремонта детали 1.
AFIX | FVARIABLE | |
............. |
* Функция BFIX задаёт время ремонта детали 2.
BFIX | FUNCTION | ......... |
............. |
*Функция POI является атрибутивно-значимой, то есть в качестве
*результата имеет не конкретное число, а другую функцию или
*переменную. Блок определяет время ремонта (время ремонта зависит от
*типа детали).
POI | FUNCTION | P3,M2 |
1,V$AFIX/2,FN$BFIX
* Функция FL является атрибутивно-значимой со списковой структурой.
FL | FUNCTION | P3,L2 |
1,2/2,1
GENERATE | ,,,1 |
*Параметр 1 получит значение переменной 1
ASSIGN | 1,V1 | |
ASSIGN | 2,V2 |
*Блок SELECT определяет какой из параметров P1 или P2 имеет меньшее *значение, и результат записывается в параметр P3.
L | SELECT MIN | 3,1,2,,P |
ADVANCE | ||
SEIZE | MACH |
* P*3, X*3, V*3 задают косвенное обращение
ADVANCE | P*3 | |
RELEASE | MACH | |
ASSIGN | FN$FL-,P*3 |
* После отказа вытаскиваем деталь
ADVANCE | ||
SPLIT | 1,M | |
SEIZE | MAST | |
ADVANCE | FN$POI | |
RELEASE | MAST | |
SAVEVALUE | P3+,1 | |
TERMINATE |
*Проверка наличия деталей отказавшего типа.
M | TEST G | X*3,0 |
SAVEVALUE | P3-,1 | |
ASSIGN | P3,V*3 | |
TRANSFER | ,L |
Не трудно видеть, что данная программа будет выполняться бесконечно долго, так как в ней нет счетчика времени.
Лекция № 10
Цепи пользователя
До сих пор мы имели дело с цепями текущих и будущих событий. Эти цепи недоступны пользователю .
Язык GPSS предоставляет программисту для использования третью разновидность цепей - цепь пользователя. Цепь пользователя - такое место, где могут находиться транзакты , присутствующие в модели ,но не находящиеся ни в цепи будущих,ни в цепи текущих событий.Цепей пользователя может быть несколько (количество определяется объемом памяти машины) .
Иногда пользователю известно ,что некоторые транзакты не будут продвигаться в модели, и тогда пользователь может перенести их из цепи текущих событий в цепь пользователя. А поскольку интерпретатор в процессе моделирования просматривает все транзакты, находящиеся в цепи текущих событий, быстрее будет происходить процесс моделирования .
LINK A,B,C -позволяет поместить транзакт в цепь пользователя .
A - имя цепи пользователя ,может быть как численным так и символическим.
B - способ включения транзакта в цепь пользователя.Имеет следующие варианты:
FIFO - новый транзакт ставится в конец (обычная очередь);
LIFO - новый транзакт становится в начало очереди;
P - указывает параметр, в соответствии с которым транзакты помещаются в цепь пользователя:в начале находятся транзакты с меньшим значением этого параметра.
C -(необязательный параметр) Если С отсутствует, то блок LINK работает в режиме безусловного присоединения,присутствие операнда С задает режим условного присоединения.
Для каждой цепи пользователя вводится индикатор состояния, принимающий состояния Set либо Reset.
Set - транзакт безусловно присоединяется к цепи пользователя
Reset - при поступлении на оператор LINK транзакта индикатор состояния устанавливается в состояние Set и транзакт поступает на блок с меткой‚ указанной в операнде С.
UNLINK A,B,C,D,E,F -обеспечивает вывод транзактов из цепи пользователя .
A - имя цепи пользователя ‚из которой извлекаются транзакты.
C - указывается число выводимых транзактов. Здесь может стоять число‚слово ALL (выводятся все
транзакты) или любой числовой атрибут.
B - метка блока‚ на который должны поступить выводимые транзакты.
Выводимые из цепи пользователя транзакты поступают в цепь текущих событий и занимают там место в соответствии со своим приоритетом.
D,E - определяют порядок вывода транзактов
F - имя блока‚ в который поступает транзакт–инициатор‚ то есть тот транзакт который поступил на блок UNLINK‚ если из цепи пользователя не был выведен ни один транзакт.Если был выведен хотя бы один транзакт или операнд F отсутствует‚ то транзакт–инициатор идет на следующий по написанию блок.
При выполнении блока LINK индикатор состояния устанавливается в режим Set. Индикатор состояния может быть выключен только блоком UNLINK, когда в цепи пользователя не останется ни одного транзакта.В начальный момент времени все индикаторы находятся в состоянии Reset.
Пример № 10.1: Смоделировать систему ОП–БП–ЦП.ОП посылает данные на обработку в ЦП.Если ЦП занят, то данные поступают в БП.
GENERATE | 15,5 | |
QUEUE | A |
* 1-й транзакт‚ пройдя блок LINK‚ установит индикатор состояния
* из Reset в Set и поступит на устройство. Последующие транзакты‚
* если 1-й транзакт ещё не прошел блок UNLINK‚ будут поступать
* в цепь пользователя .
LINK | C1,FIFO,M | |
M | SEIZE | B |
DEPART | A | |
ADVANCE | 10,7 | |
RELEASE | B |
* При прохождении блока UNLINK, если цепь пользователя
* пуста‚ индикатор состояния установится в состояние Reset.
UNLINK | C1,M | |
TERMINATE |
Лекция № 11 .
Из программы‚ приведенной в лекции №10, можно убрать блоки DEPART, QUEUE, SEISE, RELEASE и соответственно переставить метку M на блок ADVANCE. Программа будет работать так же, только у нас не будет статистики.
Пример 11.1: Пусть у нас есть ОП, БП (общая очередь) и многопроцессорная система.
Необходимо построить программу с использованием цепи
пользователя.Будем считать, что времена выполнения в
ЦП одной функции распределения, и поэтому можно
использовать многоканальное устройство.
Версия 1:
* Следующий блок задает ёмкость многоканального устройства
STORAGE | ||
GENERETE | 15,5 | |
PRIORITY |
* Блок GATE проверяет устройство на занятость
GATE SNF | 1‚F | |
M | ENTER | |
ADVANCE | 10,7 | |
LEAVE | ||
UNLINK | C1,M1 | |
TERMINATE | ||
F | LINK | C1,FIFO |
Для чего в программе необходим блок PRIORITY?
Рассмотрим ситуацию, когда в один и тот же момент времени должен появиться транзакт из блока GENERATE(назовём этот транзакт G-транзактом), и в тот же момент транзакт покидает блок ADVANCE(A-транзакт).Пусть в цепи пользователя находится хотя бы один транзакт. Будем считать что G-транзакт стоит в цепи текущих событий после A-транзакта.
Пусть нет блока PRIORITY. A-транзакт освобождает одно место в устройстве и, проходя блок UNLINK, инициирует вывод 1-го транзакта из цепи пользователя(U-транзакт). U-транзакт поступает в цепь текущих событий и занимает там место после G-транзакта. В соответствии с расположением в цепи текущих событий интерпретатор продвигает G-транзакт, и он занимает одно место в устройстве 1.
U-транзакт не может занять место в устройстве, следовательно наша модель будет работать не верно.
Версия 2:
STORAGE | ||
GENERETE | 15,5 | |
GATE SNF | 1‚F | |
M | ENTER | |
ADVANCE | 10,7 |
* Следующий блок подтверждает приоритет транзакта и перемещает
* его в конец цепи текущих событий.
PRIOTITY | PR | |
BUFFER | ||
LEAVE | ||
UNLINK | C1,M1 | |
TERMINATE | ||
F | LINK | C1,FIFO |
Блок BUFFER принудительно останавливает движение транзакта. Интерпретатор начинает с начала обрабатывать транзакты, находящиеся в цепи текущих событий.
Связку:
PRIORITY | PR | |
BUFFER |
можно заменить на
BUFFER PR
Пример 11.2:
ЦП в отличие от предыдущего примера имеют свою БП и могут обладать разной производительностью.
Команда, поступающая из ОП, занимает любой свободный процессор.Если все процессоры заняты, тогда команда поступает к тому ЦП, у которого минимальная очередь.
GENERATE |
* Далее параметр 1 получит значение в зависимости от типа команды.
ASSIGN | 1,FN$A | |
PRIORITY | ||
QUEUE |
* В следующем блоке будет определяться свободный процессор.Если все
* процессоры заняты, то транзакт(команда) поступит в блок с меткой M.
SELECT | 2,1,3,0,F,M | |
N | SEIZE | P2 |
DEPART | ||
ADVANCE | P1,FN$B | |
RELEASE | P2 | |
UNLINK | P2,N,1 | |
TERMINATE |
* Этот блок SELECT определяет минимальную очередь.
* CH – CЧА,даёт текущее содержимое цепи пользователя.
M | SELECT MIN | 2,1,3,,CH |
LINK | P2,FIFO |
Дата добавления: 2016-11-04; просмотров: 1544;