最近为我提供了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/