BotonMenu
BotonIndice

Visita : http://www.conoce3000.com
Paypal : https://www.paypal.me/conoce3000/1

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.8. VARIABLES DINÁMICAS Y EL ESPACIO DE MEMORIA EN LA COMPUTADORA.
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.8. VARIABLES DINÁMICAS Y EL ESPACIO DE MEMORIA EN LA COMPUTADORA.
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.8. VARIABLES DINÁMICAS Y EL ESPACIO DE MEMORIA EN LA COMPUTADORA.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Variables dinámicas y el espacio de memoria de la computadora.

Conforme se van creando las variables dinámicas, la memoria de la computadora se irá llenando, y cuando ya no haya espacio disponible para colocar otra variable dinámica, entonces se produce el error: falta de memoria (Out of memory), haciendo que el programa se detenga.

No es posible determinar de manera exacta y precisa cuanta memoria disponible se puede usar o existe para la siguiente variable dinámica que se va a crear, la razón es que las variables dinámicas se crean en el espacio de memoria disponible para los programas, y este espacio de memoria varía en cualquier momento, de acuerdo al uso que le den los programas. Es decir, si se pudiese determinar con una instrucción, que para la siguiente variable dinámica hay disponible 100 MiB en determinado momento, entonces este valor podría cambiar en el momento en que se use la instrucción para crear la variable dinámica, ocasionando un error de falta de memoria (Out of memory).

Asumiendo que se tenga un equipo con 4GiB de memoria física instalada y que sólo se va usar un Sistema operativo de 32 bits entonces el espacio de memoria disponible podría estar entre 1GiB y 2 GiB dependiendo del sistema operativo que se use. En los sistemas operativos Windows de 32 bits (Win32), la memoria se administra del siguiente modo 2 GiB para el sistema operativo (kernel) y 2 GiB para los programas permitiendo crear variables dinámicas que oscilan en la mayoría de los casos entre 1 GiB a 1.6 GiB. En los sistemas operativos Linux de 32 bits, la memoria se administra del siguiente modo 1 GiB para el sistema operativo (kernel) y 3 GiB para los programas, permitiendo crear variables dinámicas que oscilan entre 2 GiB a 2.6 GiB. El siguiente programa de ejemplo genera el error de falta de memoria en una computadora con las características antes mencionadas, Ejemplo:


Descargar
{$codepage UTF8}
USES math;
 
VAR

 p01:^byte;
 p02:^byte;
 p03:^byte;

BEGIN 

 getmem(p01,2**30);  //2**30 = 1 GiB 
 getmem(p02,2**30);  //2**30 = 1 GiB 
 getmem(p03,2**30);  //2**30 = 1 GiB 
  
 freemem(p01);
 freemem(p02);
 freemem(p03)
 
END.
Código fuente 29: Ejemplo de la provocación de un "Out of Memory".
Descargar

El programa anterior permite crear tres variables dinámicas de 1 GiB, al momento de crear la tercera o segunda variable de 1 GiB, aparece el error de falta de memoria (Out of memory) y el programa se termina. Para tratar este tipo de error de una manera más elegante el compilador ofrece dos métodos, el primero asignar el valor true a la variable ReturnNilIfGrowHeapFails y el segundo el uso de excepciones (se explicará este método más adelante).

Cuando el valor de la variable ReturnNilIfGrowHeapFails es true, entonces las rutinas como getmem, y new devolverán NIL si la creación de la variable dinámica no tuvo éxito, permitiendo pasar el control al programa. Ejemplo:


Descargar
{$codepage UTF8}
USES math;
 
VAR

 p01:^byte;
 p02:^byte;
 p03:^byte;
 
BEGIN 
 ReturnNilIfGrowHeapFails:=true;
 getmem(p01,2**30);  //2**30 = 1 GiB
 
 if p01<>nil then Writeln('ok')
             else Writeln('ko');
              
 getmem(p02,2**30);  //2**30 = 1 GiB 
 if p02<>nil then Writeln('ok')
             else Writeln('ko');

 getmem(p03,2**30);  //2**30 = 1 GiB 
 if p03<>nil then Writeln('ok')
             else Writeln('ko');
 
 freemem(p01);
 freemem(p02);
 freemem(p03)
 
END.
Código fuente 30: Ejemplo del uso de ReturnNilIfGrowHeapFails, para evitar el "Out of Memory".
Descargar

Existen métodos para crear variables dinámicas de hasta 10 GiB, en sistemas operativos de 32 bits, pero lo recomendado en estos casos es usar sistemas operativos de 64 bits.

En los sistemas operativos Linux de 64 bits, en teoría se podrían usar computadoras de hasta 16 EiB (264), de memoria física, pero en la práctica esto no es posible debido a que no existen equipos con esas características. Una distribución Linux de 64 bits típica te permitirá usar un máximo de 16 GiB de memoria virtual (ulimit -v), permitiéndote crear variables dinámicas de hasta 10 GiB sin ningún problema, pero si tu sistema operativo Linux de 64 bits está configurado para soportar más memoria virtual entonces podrás crear variables dinámicas de hasta 160 GiB. El siguiente ejemplo permite crear una variable dinámica de 10 GiB, en un equipo con un sistema operativo Linux de 64bits, configurado con 16 GiB de memoria virtual (4 GiB de memoria física y 12 GiB de memoria de intercambio):


Descargar
{$codepage UTF8}
USES math;
 
VAR

 p01:^byte;

BEGIN 
 ReturnNilIfGrowHeapFails:=true;
 getmem(p01,(2**30)*10);  //(2**30)*10 = 10 GiB
 
 if p01<>nil then Begin
                    Writeln('ok');
                    p01[((2**30)*10)-1]:=45;
                    Writeln(p01[((2**30)*10)-1]) 
                  End 
             else Writeln('ko');             
 
 freemem(p01);
 
END.
Código fuente 31: Ejemplo en Linux de 64bits de la creación de una variable dinámica de 10GiB.
Descargar

El uso de ReturnNilIfGrowHeapFails, con ansistring y unicodestring, no es posible ya que estas variables tienen un tratamiento especial, en estos casos se usan excepciones, que se explicarán más adelante.


Última revisión: 10/12/2013.



SIGUIENTE
SIGUIENTE
SIGUIENTE



 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado.


Comments System WIDGET PACK






PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.