Écriture de règles de sélection personnalisées

L'ordonnancement utilise les règles de sélection pour séquencer la file d'attente lorsqu'il supprime des demandes de la file (lorsqu'une ressource devient disponible).
Remarque :  Pour consulter un récapitulatif de la procédure de création des règles personnalisées, reportez-vous à la rubrique Ecriture de règles d'ordonnancement personnalisées. Pour obtenir plus de détails sur les fonctions décrites dans cette rubrique, reportez-vous au Guide de personnalisation de l'ordonnancement (Scheduling Customization Guide) qui peut être téléchargé sur notre site Web d'assistance technique.

Logique de la règle de sélection

Avant de créer des règles de sélection personnalisées et d'écrire les fonctions de sélection correspondantes, vous devez comprendre la logique utilisée par la fonction de sélection. Lorsqu'une ressource devient disponible, la fonction de sélection est sollicitée. Les files d'attente se trouvent dans des listes internes de la ressource qui est au départ séquencée par la règle de séquencement.

Lorsque la fonction de sélection est sollicitée, elle réorganise la liste et retourne le nombre maximum de demandes à prendre en compte lors du processus d'affectation. Si la liste entière est triée, elle retourne la taille de la liste. Par conséquent, si le nombre de demandes retournées est inférieur à la taille de la liste, la liste triée pour affectation représente seulement une partie de la file d'attente.

Le processus d'affectation commence par essayer de redémarrer l'opération pour la première demande de la liste triée pour affectation qui nécessite le nombre d'unités disponibles ou un nombre inférieur. Si le processus d'affectation échoue, il prend en compte la demande suivante de la liste correspondant aux unités disponibles. Les demandes successives de la liste pour affectation sont prises en compte jusqu'à ce que les unités disponibles soient affectées ou que la fin de la liste soit atteinte. S'il reste des unités disponibles après que la dernière demande ait été prise en compte, celles-ci demeurent inactives.

Nom de la fonction

Votre fonction de sélection personnalisée peut porter n'importe quel nom qui n'est pas un nom de fonction standard exécutable par l'utilisateur.

Arguments


#include "factor.h"
int myrule(rp)
RESRC *rp;   /* pointer to the resource */

La fonction de sélection accepte comme seul argument un pointeur vers le composant objet de la sélection, qui est une ressource (type : RESRC *).

Valeur de retour

La fonction retourne une valeur (type : int) qui est le nombre maximum de demandes à traiter.

Voici un exemple de fonction de sélection de ressources basée sur un réglage minimum :


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));
}

Installation de la fonction personnalisée

Pour rendre votre fonction de sélection de ressources personnalisée disponible pour l'ordonnancement, vous devez l'"installer" à partir de ucini1 en appelant la fonction sedfsl. Cette fonction a deux arguments dans l'ordre suivant :

  • Le numéro de la règle de sélection pour laquelle votre fonction de sélection contient une logique personnalisée.
  • L'adresse de votre fonction de sélection.

Par exemple, pour installer la règle exemple "slrl" ci-dessus dans la position de règle 39 :


sedfsl (39, slrl);

Si vous utilisez l'une des règles de sélection "dynamiques" fournies, le système ignorera la règle de séquencement et utilisera la méthode PEPS (premier entré premier sorti). Si vous écrivez une règle de sélection dynamique, vous devez également émuler le système et utiliser obligatoirement la méthode PEPS. Pour ce faire, appelez la fonction setosq sur la liste de demandes applicable.