カスタム資源割付ルールの作成

資源割付ルール は、スケジューラが資源を負荷に割り付ける際に、資源グループのどの資源を使用するかを決定するために使用します。また、グループに対して再割付が有効になっている場合、資源の再割付 にも使用されます。
注:  カスタムルールの作成に必要な手順のサマリは、「カスタムスケジュールルールの作成」を参照してください。このトピックで説明した関数の詳細については、弊社サポートサイトからダウンロードできる 『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 つの引数を次の順序で受け入れる必要があります。

  1. 資源グループへのポインタ (区分: RESGRP*)。
  2. そのグループから引当のために選択する資源数を表す整数 (区分: int)
  3. 資源グループからの割付を要求している負荷へのポインタ (区分: LOAD*)。
  4. グループから割当のために選択された資源の 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 &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 関数には、次の順序の 2 つの引数があります。

  • 関数にカスタム論理が含まれている資源割付ルールの番号。
  • 資源割付関数のアドレス。

たとえば、上記のルール例「rgsr」をルール位置 39 にインストールするには、以下のようにします。


sedfgs (39, rgsr);