最近为我提供了SMPL库,以C语言对队列系统进行建模,并提供了一些示例来像下面的示例进行尝试。

    #include "smpl.h"

    main()
      {
        real Ta=200.0,Ts=100.0,te=200000.0;
        int customer=1,event,server;
        smpl(0,"M/M/1 Queue");
        server=facility("server",1);
        schedule(1,0.0,customer);
        while (time()<te)
           {
             cause(&event,&customer);
             switch(event)
             {
                case 1:  /* arrival */
                   schedule(2,0.0,customer);
                   schedule(1,expntl(Ta),customer);
                   break;
                case 2:  /* request server */
                   if (request(server,customer,0)==0) then
                   schedule(3,expntl(Ts),customer);
                   break;
                case 3:  /* release server */
                   release(server,customer);
                   break;
             }
          }
          report();
     }


我试图对此示例进行一些修改,以使用功能preempt()来管理队列中的优先级和抢占。我对代码做了一些更改,现在看起来像

    #include "smpl.h"

    main()
      {
        real Ta=200.0,Ts=100.0,te=200000.0;
        int customer,event,server;
        smpl(0,"M/M/1 Queue");
        server=facility("server",1);
        schedule(1,0.0,0);            //customer with priority 0
        schedule(1,0.0,1);            //customer with priority 1
        while (time()<te)
           {
             cause(&event,&customer);
             switch(event)
             {
                case 1:  /* arrival */
                   schedule(2,0.0,customer);
                   schedule(1,expntl(Ta),customer);
                   break;
                case 2:  /* request server */
                   if (preempt(server,customer,customer)==0) then     <--- change request for preempt()
                   schedule(3,expntl(Ts),customer);
                   break;
                case 3:  /* release server */
                   release(server,customer);
                   break;
             }
          }
          report();
     }


当我运行它时,出现以下错误:

    **** Simulation Error at Time 12002.710
    Release of Idle/Unowned Facility


检查我发现的痕迹

                        --  token 0     -- SCHEDULE  EVENT 3
     time 11892.379     --  token 1     -- CAUSE  EVENT 1
                        --  token 1     -- SCHEDULE  EVENT 2
                        --  token 1     -- SCHEDULE  EVENT 1
                        --  token 1     -- CAUSE  EVENT 2
                        --  token 1     -- PREEMPT server:  INTERRUPT
                        --              --    SUSPEND  EVENT 1
                        --              --    QUEUE  token 0  (inq = 1)
                        --              --    RESERVE server for token 1
                        --  token 1     -- SCHEDULE  EVENT 3
     time 12002.710     --  token 0     -- CAUSE  EVENT 3


令牌0尝试释放服务器,但服务器的所有者为令牌1,因为它在时间11892.379从服务器抢占了令牌0。

我不知道问题是由于我得到的库中的某些错误还是由于preempt()函数做错了。

任何对这个库有一定经验的人都可以启发我吗?

最佳答案

由于没有答案,而且我似乎已经找到了解决方法,因此我将其发布以供将来参考。

SMPL preempt()函数似乎不能很好地处理具有相同ID的不同令牌。然后,可行的解决方案是在每个新的令牌到达计划操作中动态更改令牌ID。

    #include "smpl.h"

    main()
      {
        real Ta=400.0,Ts=100.0,te=200000.0;
        int customer,event,server,i;
        smpl(0,"M/M/1 Queue");
        trace(1);                   //debug
        server=facility("server",1);
        schedule(1,0.0,0);          //customer with priority 0
        schedule(1,0.0,1);          //customer with priority 1
        i=2;
        while (time()<te)
          {
            cause(&event,&customer);
            switch(event)
             {
                case 1:  /* arrival */
                   schedule(2,0.0,customer);
                   schedule(1,expntl(Ta),i); i++;
                   break;
               case 2:  /* request server */
                   if (preempt(server,customer,customer)==0) then
                   schedule(3,expntl(Ts),customer);
                   break;
               case 3:  /* release server */
                  release(server,customer);
                  break;
              }
          }
          report();
      }


在此示例中,preempt()调用的优先级等于令牌ID,否则应手动处理,但确实解决了主要问题。

关于c - C中的SMPL preempt(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22685978/

10-12 18:05