Bienvenidos a Iseries Venezuela

Las mejores prácticas, recursos, tips, enlaces, videos y artículos para informáticos relacionados con el Iseries y el As/400 lenguajes de programación RPG, ILE RPG y SQL.

The best practices, resources, tips, links, videoes and articles for computer related to the Iseries and the As/400 languages of programming RPG, ILE RPG and SQL.

lunes, 18 de abril de 2022

Grupos de Activación. Primera Entrega

                               

Este artículo es el primero de una serie dedicado a los Grupos de Activación. 

El tema es algo extenso cuando se explica en detalle y requiere tiempo para entender las implicaciones que puede tener a nivel práctico usar o no usar Grupos de activación.

Generalmente los desarrolladores en RPG no tenemos ni idea del impacto que tiene nuestro código en cuanto al nivel de performance: los tiempos de respuesta ni el consumo de recursos, de nuestros programas. El estudio de los grupos de activación y su funcionamiento nos ayuda a entender cómo podemos optimizar el uso de la memoria y de los recursos del equipo, para que los procesos se ejecuten de manera óptima.

Empecemos…

Un grupo de activación es un contenedor de recursos” dentro de un trabajo. El contenedor contiene un montón de activaciones, de ahí el término grupo de "activación". Una activación es una referencia a la asignación de almacenamiento y a las actividades de enlace de programas en tiempo de ejecución que realizan los sistemas operativos cuando se ejecuta un programa.  

Cuando compilamos un programa RPGILE por la opción 14 del strpdm, vemos una serie de parámetros entre los que se encuentra este:

Default activation group . .  Dftactgrp *YES              

Cuando este parámetro esta activado con *Yes, el programa RPG que se está compilando no puede utilizar procedures internos ni externos, programas de servicios ni directorios de enlace. El sistema entiende que se trata de un programa RPG tradicional.  El Grupo de activación por defecto es QILE.

Si queremos compilar un programa que admita enlaces, módulos, Procedimientos (procedures) y lo relacionado con ILE, entonces debemos colocar *NO. Lo más cómodo es colocar esta especificación en la Hoja ‘H’ para evitarnos el tener que acordarnos de colocarlo cada vez que debamos recompilar el programa.

En un RPG fon formato sería:  h DftActgrp(*no)

En un RPG Free format sería:  ctl-opt dftactgrp(*no);

Ambas declaraciones permiten al programa funcionar como un programa ILE

Cuando creamos un programa RPG que enlaza directorios y módulos con el comando CRTPGM

Podemos ver el siguiente parámetro:

Activation group . . . . . . . . ACTGRP         *ENTMOD     (módulo de entrada)

Esto significa que el grupo de activación que se tomará en cuenta para ejecutar el programa será el que sea establecido por el modulo “padre” o el “Entry Point” que inicia la ejecución de toda la serie de invocaciones a procedimientos (procedures) y programas de servicios y módulos de los códigos entre sí.

Si definimos que NO queremos un grupo de activación por defecto… ¿qué sucede?

 

Cuando colocamos *NO en la compilación por via Strpdm opción 14, al presionar enter, el sistema nos trae dos parametros por default

Default activation group . . . . DFTACTGRP    > *NO       

Activation group . . . . . . . . ….ACTGRP         *STGMDL   

Storage model  . . . . . . . . . ……STGMDL         *SNGLVL   

 

Para el parámetro Activation Group el valor *STGMDL indica que se va a seleccionar un modelo de memoria  pre-establecido  por el sistema.

Hay tres tipos de modelo de memoria. Estos tres tipos de modelos se especifican en el parámetro: Storage model y tiene tres valores posibles:

 

*SNGLVL (este valor es el que se muestra en el ejemplo anterior)

Va a asignar un área de memoria estática que se crea al momento de declarar variables. El uso de esta memoria es fijo y no cambia.  Es predeterminado. 

La desventaja de este método es la limitación de expansión de memoria. El uso de memoria no va a crecer a tiempo de ejecución. Por ejemplo, un programa “recursivo” (en otro artículo les explicaré cómo hacer un programa recursivo en RPGILE) o una secuencia de ejecución que demande mucho uso de memoria podría generar un stack overflow , es decir, un desbordamiento de la pila de llamadas. El job podría fallar en algún momento por falta de espacio.

*INHERIT

El sistema va a asignar para la ejecución del programa, la misma área de memoria que ha sido definida en programa “padre” (Caller)

*TERASPACE

Esta opción se especifica cuando se requiere un enorme uso de memoria dinámica en procesos que requieren alta velocidad de ejecución. (La memoria dinámica es la que se reserva en tiempo de ejecución. Su crecimiento no está limitado. A medida que el proceso lo requiere, va reservando y consumiendo más espacio en memoria).

Para mayores detalles técnicos sobre el teraspace, consultar este enlace:

  Teraspace


En este cuadro resumen podemos ver que permite o no permite tener en ¨*YES y en *NO el grupo de activación.

 

Procedures

Service Program

Binding Directory

DFTACTGRP(*YES)

No

No

No

DFTACTGRP(*NO)

Yes

Yes

Yes

 

En la próxima entrega continuaremos con los grupos de activación y su funcionalidad.

        

     Si te pareció interesante, reenvíalo a un amigo haciendo click en el sobrecito que está al final del artículo o en el enlace de Linkedin que está encima de este mensaje.  El conocimiento es valioso, compártelo. 

    Autor: Ing. Liliana Suárez




1 comentario:

Nayarit Ramos dijo...

Excelente, son a veces condiciones que dejamos por defecto y no sabemos el impacto de las mismas