Écriture de règles de séquence personnalisées
Logique de la règle de séquence
Avant de créer vos propores fonctions de classement, vous devez comprendre comment les demandes sont traitées par la règle de séquence. Lorsqu'une charge place une demande, la fonction de classement attribue une valeur à la demande. La valeur de classement ne change jamais.
Par exemple, supposons qu'une règle de séquence classe les demandes en fonction du temps restant avant la date d'échéance. À 13 h aujourd'hui une charge avec une échéance à 16 h aujourd'hui place une demande et reçoit une valeur de classement de 3. À 15 h aujourd'hui, une charge avec une échéance à 17 h aujourd'hui place une demande et reçoit une valeur de classement de 2. Supposons que ces demandes sont les seules dans la file d'attente. Supposons qu'une de ces demandes est remplie à 15 h 30. La demande satisfaite est celle possédant la valeur 2, même s'il reste 1,5 heure avant l'heure d'échéance pour la demande de valeur 2 et 0,5 heure pour la demande de valeur 3.
Les demandes sont classées dans la liste interne représentant la file d'attente du bas vers le haut, en fonction de la valeur de classement. Vous pouvez inverser cet ordre dans votre logique personnalisée en multipliant les valeurs de classement par -1. Par exemple, pour classer les charges en fonction d'un temps de traitement plus long pour une opération actuelle, une fonction de classement retourne le nombre négatif du temps de traitement pour la charge à son opération actuelle.
Nom de la fonction
Votre fonction de classement 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"
double myrule(ldp, atrib)
LOAD *ldp; /* pointer to the load. */
ATTRIBUTE *atr; /* pointer to attribute, if any, to base ranking on. */
La fonction doit accepter deux arguments dans l'ordre suivant :
- Une charge (type : LOAD*).
- Un attribut (type : ATTRIBUTE).
Valeur de retour
La fonction doit retourner une valeur (type : double) qui est la valeur de classement de la demande de la charge.
Voici un exemple d'une fonction de classement pour trier les charges en fonction de la plus petite charge dynamique (c'est-à-dire le plus petit délai restant avant la date d'échéance, moins le délai de traitement restant) :
double sqrl (LOAD *ldp, ATTRIBUTE *atr)
/*-----------------------------------------------------------------
Ranking function to cause loads to be ranked on a least dynamic
slack basis.
ARGS:
ldp - pointer to load for which to evaluate the ranking code
RETURNS: load ranking value
-----------------------------------------------------------------*/
{
double rt, lt;
int rn;
rt = sermot(ldp, &rn, <);
return(ldp->loordp->ordudt - DATENOW - rt);
}
Installation de la fonction personnalisée
Pour rendre votre fonction personnalisée disponible pour l'ordonnancement, vous devez l'"installer" à partir de la fonction d'initilisation ucini1 en appelant la fonction sedfrk. Sedfrk a deux arguments dans l'ordre suivant :
- Le numéro de la règle de séquence pour laquelle votre fonction de classement contient une logique personnalisée.
- L'adresse de votre fonction de classement de charge.
Par exemple, pour installer la règle exemple « sqrl » ci-dessus dans la position de règle 39 :
sedfrk (39, sqrl);