编写定制资源分配规则

资源分配规则用于决定当“排产器”将资源分配给负荷时将使用资源组的哪些资源。如果为资源组启用重新分配,它们也用于重新分配资源。
注意: 关于创建定制规则所要求的步骤总结,请参见编写定制排产器规则。有关该主题中所述函数的详细信息,请参见排产自定义指南,该指南可从我们的技术支持网站下载。

命名函数

函数可用任何名称,但不能是标准的用户可调用函数名。

自变量


#include "factor.h"
void myrule(gp, nu, ldp, mlist)
RESGRP    *gp;   /* pointer to resource group. */
int        nu;   /* number of units required.  */
LOAD     *ldp;   /* pointer to the load.       */
CSLIST *mlist;   /* current selection list.    */

函数必须按以下顺序接受四个自变量:

  1. 指向资源组的指针(类型: RESGRP*)。
  2. 从该分配资源组选定的资源数量的一个整数(类型: int)。
  3. 指向要求从资源组分配给负荷的指针(类型:LOAD*)。
  4. 将填充 RMTAGS 资源的列表,该资源从组(类型:{j}CSLIST*)中选择用于分配。

添加和删除组成员

分别使用系统支持函数 seadsl 和 sermsl 从选定的资源 (mlist) 列表添加和删除组成员。要将组成员添加到列表,按如下方法使用函数 seadsl:


void seadsl(CSLIST *mlist, RESMEMB *rmp)

要将组成员从列表中删除,按如下方法使用函数 sermsl:


void sermsl(CSLIST *mlist, RMTAG *rmt)

返回值

该函数不返回任何内容(类型:void)。

此为基于最低平均利用率选择可用资源成员的一个规则示例:


void rgsr (RESGRP *gp, int nu, LOAD *ldp, CSLIST *mlist)
/*-----------------------------------------------------------------
     Function to process resource group selection code 3, select
     required number of member resources that have the least mean
     utilizations (as a fraction of capacity).
     NOTES:
     * Ties are broken by selecting the first in the order listed
       in the group.
     * This function requires that resource statistics be enabled.
       Any resource which does not have statistics enabled is
       assumed to have a utilization of zero.   Thus if all
       resource statistics are disabled, this defaults to
       rule 0.
     * This function uses seaars, which includes must complete and
       maxOT in its considerations, to determine the availability
       of each member resource.
     ARGS:
       gp    - pointer to resource group to select member from
       nu    - number of units required from selected member
       ldp   - pointer to load to which resource will be allocated
       mlist - list to hold selected RESMEMB's
     RETURNS:  void
-----------------------------------------------------------------*/
{
     int i, j, *avail;
     double min, *util;
     RESMEMB *minp, *rmp;
     /* Allocate arrays for availability and utilization.  */
     avail = (int *) malloc(sizeof(int) * csszls(gp->rgrsls));
     if ( avail == NULL )
     {
         seferr(0, "Out of Memory");
     }
     util = (double *) malloc(sizeof(double) * csszls(gp->rgrsls));
     if ( util == NULL )
     {
         seferr(0, "Out of Memory");
     }
     /* Compute availability and utilization.  */
     for ( rmp = (RESMEMB *) csfsls(gp->rgrsls), j = 0;
           rmp != NULL;
           rmp = (RESMEMB *) csnxls((CSENTITY *) rmp), j++ )
     {
         avail[j] = seaars(rmp->rmres, ldp);
         util[j] = seutrs(rmp->rmres);
     }
     /* For the required number of units */
     for ( i = csszls(mlist); i &LT nu; i++ )
     {
         /* For each resource which is available.  */
         minp = NULL;
         for ( rmp = (RESMEMB *) csfsls(gp->rgrsls), j = 0;
               rmp != NULL;
               rmp = (RESMEMB *) csnxls((CSENTITY *) rmp), j++ )
         {
             if ( (! rmp->rmres->rsselfg) && (avail[j] > 0) )
             {
               /* Save if min.  */
                 if ( (minp == NULL) || (util[j] &LT min) )
                 {
                     minp = rmp;
                     min = util[j];
                 }
             }
         }
         if ( minp == NULL )
         {
             break;
         }
         seadsl(mlist, minp);
     }
     free(avail);
     free(util);
     return;
}

安装定制函数

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

  • 函数包括定制逻辑的资源分配规则数量。
  • 资源分配函数的地址。

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


sedfgs (39, rgsr);