Escribir reglas de asignación de recursos personalizadas

Las reglas de asignación de recursos se utilizan para decidir los recursos de un grupo de recursos que usará el programador cuando asigne recursos a una carga. También se utilizan para reasignar recursos si se ha activado la reasignación para el grupo.
Nota:  Consulte Escribir una regla de programador personalizada para obtener un resumen de los pasos necesarios para crear reglas personalizadas. Para obtener más detalles acerca de las funciones descritas en este tema, consulte la Guía de personalización de la programación, disponible para su descarga en nuestra página de asistencia.

Denominar la función

La función puede tener cualquier nombre que no sea un nombre de función estándar invocable por el usuario.

Arguments


#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.    */

La función debe aceptar cuatro argumentos en el siguiente orden:

  1. Un indicador al grupo de recursos (Type: RESGRP*).
  2. Un entero para el número de recursos que se van a seleccionar de ese grupo para su asignación (Type: int).
  3. Un indicador a la carga que solicita asignarse a partir del grupo de recursos (Type: LOAD*).
  4. Una lista que se va a rellenar con RMTAGS de recursos seleccionados para su asignación a partir del grupo (Type: CSLIST*).

Añadir y eliminar miembros del grupo

Se pueden añadir y eliminar miembros de un grupo de la lista de recursos seleccionados (mlist) mediante las funciones de compatibilidad del sistema seadsl y sermsl, respectivamente. Para añadir miembros del grupo a la lista, utilice la función seadsl de la siguiente forma:


void seadsl(CSLIST *mlist, RESMEMB *rmp)

Para eliminar miembros del grupo de la lista, utilice la función sermsl de la siguiente forma:


void sermsl(CSLIST *mlist, RMTAG *rmt)

Valores de retorno

La función no debe devolver ningún valor (Type: anular).

A continuación presentamos un ejemplo de una regla para seleccionar miembros del grupo de recursos disponibles sobre la base de la utilización de promedio mínimo:


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

Instalación de la función personalizada

Para poner la función de asignación de recursos personalizada a disponibilidad del programador, debe "instalarla" desde la función ucini1 invocando a la función sedfgs. La función sedfgs tiene dos argumentos en el siguiente orden:

  • El número de la regla de asignación de recursos para la que la función contiene lógica personalizada.
  • La dirección de la función de asignación de recursos.

Por ejemplo, para instalar la regla del ejemplo anterior "rgsr" en la posición de regla 39:


sedfgs (39, rgsr);