カスタム選択ルールの作成
選択ルールの論理
カスタム選択ルールを作成して対応する選択関数を作成する前に、選択関数で使用する論理を理解しておいてください。資源が利用可能になると、選択関数が呼び出されます。要求キューは、最初に順序設定ルールによって順序が決められた資源に属する内部リストに含まれます。
呼び出された選択関数は、このリストの順序を変更して、割付処理で考慮する要求の最大数を返します。リスト全体が保存されている場合は、そのリストのサイズが返されます。したがって、返された要求数がリストサイズよりも小さい場合、割付用のソート済リストは、要求キューの一部である可能性があります。
割付処理は、割付用のソート済リストで利用可能なユニット数以下を必要とする最初の要求の作業の再開を試みることで、開始されます。割付処理が失敗した場合、ソート済リストで利用可能なユニット数以下を必要とする次の要求が考慮されます。利用可能なユニットが割り付けられるまで、または割付のソート済リストの最後に到達するまで、ソート済リストで割付に対する後続の要求が考慮されます。最後の要求が考慮された後にも、利用可能なユニットがある場合、それらはアイドルのままになります。
関数の命名
カスタム選択関数には、ユーザによる呼び出し可能な標準の関数名 以外の任意の名前を付けることができます。
引数
#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 < 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 関数を呼び出します。