カスタム選択ルールの作成

資源が使用可能になると、スケジューラは、キューから要求を削除する際、選択ルール を使用して、要求キューの順序を設定します。
注:  カスタムルールの作成に必要な手順のサマリは、「カスタムスケジュールルールの作成」を参照してください。このトピックで説明した関数の詳細については、弊社サポートサイトからダウンロードできる 『Scheduling Customization Guide』 (スケジューリングカスタマイズガイド)を参照してください。

選択ルールの論理

カスタム選択ルールを作成して対応する選択関数を作成する前に、選択関数で使用する論理を理解しておいてください。資源が利用可能になると、選択関数が呼び出されます。要求キューは、最初に順序設定ルールによって順序が決められた資源に属する内部リストに含まれます。

呼び出された選択関数は、このリストの順序を変更して、割付処理で考慮する要求の最大数を返します。リスト全体が保存されている場合は、そのリストのサイズが返されます。したがって、返された要求数がリストサイズよりも小さい場合、割付用のソート済リストは、要求キューの一部である可能性があります。

割付処理は、割付用のソート済リストで利用可能なユニット数以下を必要とする最初の要求の作業の再開を試みることで、開始されます。割付処理が失敗した場合、ソート済リストで利用可能なユニット数以下を必要とする次の要求が考慮されます。利用可能なユニットが割り付けられるまで、または割付のソート済リストの最後に到達するまで、ソート済リストで割付に対する後続の要求が考慮されます。最後の要求が考慮された後にも、利用可能なユニットがある場合、それらはアイドルのままになります。

関数の命名

カスタム選択関数には、ユーザによる呼び出し可能な標準の関数名 以外の任意の名前を付けることができます。

引数


#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 関数からインストールする必要があります。この関数には、次の順序の 2 つの引数があります。

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

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


sedfsl (39, slrl);

提供された「動的」選択ルールの 1 つを使用すると、システムは順序設定ルールを無視し、先入先出(FIFO)を使用します。動的選択ルールを作成する場合、システムに習い FIFO の使用を強制する必要があります。そのためには、該当する要求リストで setosq 関数を呼び出します。