Затуп с GPSS
, Задача про вычислительную систему на ЭВМ
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.138] |
|
|
Затуп с GPSS
, Задача про вычислительную систему на ЭВМ
|
Сообщ.
#1
,
|
|
|
|
Здравствуйте. Прошу помочь разобраться с плавающей ошибкой.
Задание: На вычислительную систему, содержащую три процессора, поступает экспоненциальный поток задач со средним интервалом поступления 140 единиц модельного времени. Каждая задача с вероятностью 0,2 относится к оному из пяти видов: 1,2,3,4 или 5. Среднее время обслуживания задач каждого типа составляет соответственно 90, 100, 110, 120 и 130 единиц модельного времени. Задачи со временем обслуживания 90 единиц имеют высший приоритет. Необходимо построить модель, позволяющую оценить средние значения времени ожидания задач каждого типа, а также распределение общего времени ожидания в очереди и общего времени пребывания в системе для 1000 задач, степень загрузки вычислительной системы. Написал алгоритм (ниже). Он полностью рабочий - на очень маленьких значениях START (на START 2 отработает нормально). На больших появляется вроде бы простая ошибка "Operand B. Illegal attempt to make Queue entity content negative." И да, в окнах отладки действительно значению одного из пяти буферов пытаются придать отриц. значение декрементов (DEPART). При пошаговом прогоне, ошибки нет!!! но если жму Continue, тут же вылетает. Пытался разобраться в ней, но либо неправильная семантика вызова операторов, либо баг в GPSS World, что на мой взгляд маловероятно Кроме того, отлаживаясь по шагам, не могу увидеть что не так, ибо вот идет нормальное выполнение, оператор за оператором, потом будто временной скачок и сразу проблемный оператор (будто отладчик перескочил на много шагов вперед)... Алгоритм простой: вновь поступающее событие заносится в одну из пяти очередей, а затем идет сначала проверка наличия транзакта в очереди с максимальным приоритетом (q_90) с передачей его первому свободному процессору (Processor1, Processor2, Processor3), потом на очередь с приоритетом поменьше (q_100) и так далее... ГУРУ, Помогите!!! Полный код задачи: ![]() ![]() TASK_90 VARIABLE 90 TASK_100 VARIABLE 100 TASK_110 VARIABLE 110 TASK_120 VARIABLE 120 TASK_130 VARIABLE 130 DELAY VARIABLE 90 ; Генерация транзактов п экспоненциальному закону GENERATE (Exponential(1,0,140)) ; Формирование очередей приоритета исходя из ; заданных значений вероятности TRANSFER .20,ns1,type1 ns1 TRANSFER .25,ns2,type2 ns2 TRANSFER .33,ns3,type3 ns3 TRANSFER .50,type5,type4 TRANSFER ,Proceed type1 QUEUE q_90,1 TRANSFER ,Proceed type2 QUEUE q_100,1 TRANSFER ,Proceed type3 QUEUE q_110,1 TRANSFER ,Proceed type4 QUEUE q_120,1 TRANSFER ,Proceed type5 QUEUE q_130,1 TRANSFER ,Proceed ; Проверка наиболее приоритетной очереди ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Есть ли в очереди транзакты Proceed TEST GE Q$q_90,1,PRIO100 ; Сохраним величину задержки SAVEVALUE V$DELAY,V$TASK_90 ; Если есть, проверим занятость всех трех ; процессоров TRANSFER ALL,P90PROC1,P90PROC3,3 ; Посредством ASSIGN запомним какой процессор займем ; и перейдем на метку P90_DO для обработки транзакта P90PROC1 SEIZE Processor_1 ASSIGN 1,Processor_1 TRANSFER ,P90_DO SEIZE Processor_2 ASSIGN 1,Processor_2 TRANSFER ,P90_DO P90PROC3 SEIZE Processor_3 ASSIGN 1,Processor_3 P90_DO DEPART q_90 ADVANCE V$DELAY ; В P1 - сохраненный процессор, его и освободим RELEASE P1 TRANSFER ,QUIT ; Проверка второй по приоритету очереди ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRIO100 TEST GE Q$q_100,1,PRIO110 SAVEVALUE V$DELAY,V$TASK_100 TRANSFER ALL,P100PROC1,P100PROC3,3 P100PROC1 SEIZE Processor_1 ASSIGN 1,Processor_1 TRANSFER ,P100_DO SEIZE Processor_2 ASSIGN 1,Processor_2 TRANSFER ,P100_DO P100PROC3 SEIZE Processor_3 ASSIGN 1,Processor_3 P100_DO DEPART q_100,1 ADVANCE V$DELAY RELEASE P1 TRANSFER ,QUIT ; Проверка третьей по приоритету очереди ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRIO110 TEST GE Q$q_110,1,PRIO120 SAVEVALUE V$DELAY,V$TASK_110 TRANSFER ALL,P110PROC1,P110PROC3,3 P110PROC1 SEIZE Processor_1 ASSIGN 1,Processor_1 TRANSFER ,P110_DO SEIZE Processor_2 ASSIGN 1,Processor_2 TRANSFER ,P110_DO P110PROC3 SEIZE Processor_3 ASSIGN 1,Processor_3 P110_DO DEPART q_110,1 ADVANCE V$DELAY RELEASE P1 TRANSFER ,QUIT ; Проверка четвертой по приоритету очереди ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRIO120 TEST GE Q$q_120,1,PRIO130 SAVEVALUE V$DELAY,V$TASK_120 TRANSFER ALL,P120PROC1,P120PROC3,3 P120PROC1 SEIZE Processor_1 ASSIGN 1,Processor_1 TRANSFER ,P120_DO SEIZE Processor_2 ASSIGN 1,Processor_2 TRANSFER ,P120_DO P120PROC3 SEIZE Processor_3 ASSIGN 1,Processor_3 P120_DO DEPART q_120,1 ADVANCE V$DELAY RELEASE P1 TRANSFER ,QUIT ; Проверка пятой по приоритету очереди ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRIO130 TEST GE Q$q_130,1 SAVEVALUE V$DELAY,V$TASK_130 TRANSFER ALL,P130PROC1,P130PROC3,3 P130PROC1 SEIZE Processor_1 ASSIGN 1,Processor_1 TRANSFER ,P130_DO SEIZE Processor_2 ASSIGN 1,Processor_2 TRANSFER ,P130_DO P130PROC3 SEIZE Processor_3 ASSIGN 1,Processor_3 P130_DO DEPART q_130,1 ADVANCE V$DELAY RELEASE P1 QUIT TERMINATE 1 START 2 P.S. Новичок в этом деле, поэтому прошу, если у вас есть замечания по коду или предложения, их высказать. Для меня это будет бесценно! Спасибо |
|
Сообщ.
#2
,
|
|
|
|
Всем спасибо, задача решена!
|