На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Затуп с GPSS , Задача про вычислительную систему на ЭВМ
    Здравствуйте. Прошу помочь разобраться с плавающей ошибкой.

    Задание:

    На вычислительную систему, содержащую три процессора, поступает экспоненциальный поток задач со средним интервалом поступления 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) и так далее...

    ГУРУ, Помогите!!!

    Полный код задачи:

    ExpandedWrap disabled
      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. Новичок в этом деле, поэтому прошу, если у вас есть замечания по коду или предложения, их высказать. Для меня это будет бесценно!

    Спасибо
      Всем спасибо, задача решена!
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0.0552 ]   [ 14 queries used ]   [ Generated: 23.09.26, 00:48 GMT ]