カスタム資源割付ルールの作成
資源割付ルール は、スケジューラが資源を負荷に割り付ける際に、資源グループのどの資源を使用するかを決定するために使用します。また、グループに対して再割付が有効になっている場合、資源の再割付 にも使用されます。
注: カスタムルールの作成に必要な手順のサマリは、「カスタムスケジュールルールの作成」を参照してください。このトピックで説明した関数の詳細については、弊社サポートサイトからダウンロードできる
『Scheduling Customization Guide』
(スケジューリングカスタマイズガイド)を参照してください。
関数の命名
関数には、ユーザによる呼び出し可能な標準の関数名 以外の任意の名前を付けることができます。
引数
#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. */
関数は、4 つの引数を次の順序で受け入れる必要があります。
- 資源グループへのポインタ (区分: 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 関数には、次の順序の 2 つの引数があります。
- 関数にカスタム論理が含まれている資源割付ルールの番号。
- 資源割付関数のアドレス。
たとえば、上記のルール例「rgsr」をルール位置 39 にインストールするには、以下のようにします。
sedfgs (39, rgsr);