编写定制选择规则

当“排产器”从队列删除请求时(当资源变为可用),使用选择规则对请求队列进行排序。
注意: 关于创建定制规则所要求的步骤总结,请参见编写定制排产器规则。有关该主题中所述函数的详细信息,请参见排产自定义指南,该指南可从我们的技术支持网站下载。

选择规则逻辑

在创建定制选择规则和编写相应的选择函数前,应理解为选择函数所用的逻辑。当资源变为可用时,调用选择函数。请求队列包括在为各自资源所有的内部列表中,该资源最初按排序规则进行排序。

当调用选择规则时,其重新排序该列表并返回在分配处理中考虑的请求的最大数量。如果排序全部列表,其返回列表的大小。因此,如果返回请求的数量小于列表的大小时,为分配排序的列表可能是请求队列的仅有部分。

通过尝试重新为分配排序列表上的第一个请求启动工序,该列表需要可用单位的或更少的数量,则分配处理开始。如果分配处理失败,为可用单位的或更少的数量考虑排序列表上的下一个请求。考虑分配排序列表上的连续请求,直到已分配可用单位,或到达分配排序列表末端。如果在考虑最后请求后有可用单位,它们仍保持空闲。

命名函数

定制选择函数可使用非标准的用户可调用函数名的任何名称。

自变量


#include "factor.h"
int myrule(rp)
RESRC *rp;   /* pointer to the resource */

选择函数接受指向正在为其执行选择的组件的指针作为仅有的自变量,该组件为一个资源(类型:RESRC *)。

返回值

该函数返回一个值(类型:int),该值为待处理请求的最大数值。

此为一个基于最小设置的资源选择函数示例:


int slrl (RESRC *rp)
/*-----------------------------------------------------------------
     Selection function to process a resource request list by using
     the minimum setup time for this resource on the first downstream
     setup operation for each load.  Loads that have no downstream setup
 operation are assumed to have a setup time of zero.
     NOTES:
     * The estimate flag is set to false for jscmsu so that it will
       use the current conditions to find the setup time.  Since the
       operation could be downstream, there is no guarantee that the
       current conditions for the resource in question will still
       be appropriate when the setup actually occurs.  Therefore,
       this rule should only be used when the structure of the model
       guarantees that the conditions for the downstream resource
       will be constant till the setup occurs.
     ARGS:
       rp - pointer to resource to resequence
     RETURNS: number of requests in the request list
-----------------------------------------------------------------*/
{
     RREQ *rq;
     JOBSTEP *jsp;
     int i;
     for ( rq = (RREQ *) csfsls(rp->rsrqls);
           rq != NULL;
           rq = (RREQ *) csnxls((CSENTITY *) rq) )
     {
         /* Find first downstream setup operation.  */
         for ( jsp = rq->rrload->lojspt, i = 0;
               jsp != NULL && jsp->jstype != 4 &&
               jsp->jstype != 13 && jsp-jstype != 19 && i &LT 1000;
               jsp = jsp->jspnxt, i++);
         /* Compute setup time (zero if no setup operation).  */
         if (jsp == NULL || i >= 1000)
         {
             rq->rrprio = 0.0;
         }
         else
         {
            /* Place a tag for the resource.  This allows the step
               time to be computed properly for the downstream
               operation assuming that the load allocates the
               resource before any other load.  */
            dumrtag->rtrsrc = rp;
             cspols(rq->rrload->lorsls, (CSENTITY *) dumrtag, CSLIFO, NULL);
            rq->rrprio = jscmsu(0, rq->rrload, jsp);
            csgpls(rq->rrload->lorsls, (CSENTITY *) dumrtag);
         }
     }
     /*Sort list based on rankings.*/
     cssols (rp->rsrqls, serqor);
     /*return number in list*/
     return (csszls(rp->rsrqls));
}

安装定制函数

要定制资源选择函数对“排产器”可用,必须调用函数 sedfsl 从 ucini1 函数将其“安装”。函数必须按以下顺序使用两个自变量:

  • 选择函数包括定制逻辑的选择规则数量。
  • 选择函数的地址。

例如,要在规则位置 39 安装以上示例规则“slrl”:


sedfsl (39, slrl);

如果使用所提供的“动态”选择规则之一,系统将忽略该排序规则并使用先进先出 (FIFO) 规则。如果编写一个动态选择规则,也应模仿系统并强制使用先进先出规则。要执行此步骤,在适用的请求列表上调用函数 setosq。