编写定制资源分配规则
资源分配规则用于决定当“排产器”将资源分配给负荷时将使用资源组的哪些资源。如果为资源组启用重新分配,它们也用于重新分配资源。
命名函数
函数可用任何名称,但不能是标准的用户可调用函数名。
自变量
#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. */
函数必须按以下顺序接受四个自变量:
- 指向资源组的指针(类型:RESGRP*)。
- 从该分配资源组选定的资源数量的一个整数(类型:int)。
- 指向要求从资源组分配给负荷的指针(类型:LOAD*)。
- 将填充 RMTAGS 资源的列表,该资源从组(类型: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 < 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] < 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);