Está en la página 1de 9

Memoria Esttica

La forma ms fcil de almacenar el contenido de una variable en memoria en tiempo de ejecucin


es en memoria esttica o permanente a lo largo de toda la ejecucin del programa.

No todos los objetos (variables) pueden ser almacenados estticamente.

Para que un objeto pueda ser almacenado en memoria esttica su tamao (nmero de bytes
necesarios para su almacenamiento) ha de ser conocido en tiempo de compilacin, como
consecuencia de esta condicin no podrn almacenarse en memoria esttica:

* Los objetos correspondientes a procedimientos o funciones recursivas, ya que en tiempo de


compilacin no se sabe el nmero de variables que sern necesarias.

* Las estructuras dinmicas de datos tales como listas, rboles, etc. ya que el nmero de
elementos que las forman no es conocido hasta que el programa se ejecuta.

Las tcnicas de asignacin de memoria esttica son sencillas.

A partir de una posicin sealada por un puntero de referencia se aloja el objeto X, y se avanza el
puntero tantos bytes como sean necesarios para almacenar el objeto X.

La asignacin de memoria puede hacerse en tiempo de compilacin y los objetos estn vigentes
desde que comienza la ejecucin del programa hasta que termina.

En los lenguajes que permiten la existencia de subprogramas, y siempre que todos los objetos de
estos subprogramas puedan almacenarse estticamente se aloja en la memoria esttica un
registro de activacin correspondiente a cada uno de los subprogramas.

Estos registros de activacin contendrn las variables locales, parmetros formales y valor
devuelto por la funcin.

Dentro de cada registro de activacin las variables locales se organizan secuencialmente. Existe
un solo registro de activacin para cada procedimiento y por tanto no estn permitidas las
llamadas recursivas. El proceso que se sigue cuando un procedimiento p llama a otro q es el
siguiente:

1. p evala los parmetros de llamada, en caso de que se trate de expresiones complejas,


usando para ello una zona de memoria temporal para el almacenamiento intermedio. Por
ejemplos, s la llamada a q es q((3*5)+(2*2),7) las operaciones previas a la llamada propiamente
dicha en cdigo mquina han de realizarse sobre alguna zona de memoria temporal. (En algn
momento debe haber una zona de memoria que contenga el valor intermedio 15, y el valor
intermedio 4 para sumarlos a continuacin). En caso de utilizacin de memoria esttica sta zona
de temporales puede ser comn a todo el programa, ya que su tamao puede deducirse en
tiempo de compilacin.

2. q inicializa sus variables y comienza su ejecucin.

Dado que las variables estn permanentemente en memoria es fcil implementar la propiedad de
que conserven o no su contenido para cada nueva llamada

Memoria Dinmica

Qu es la memoria dinmica?
Supongamos que nuestro programa debe manipular estructuras de datos de longitud
desconocida. Un ejemplo simple podra ser el de un programa que lee las lneas de un archivo y
las ordena. Por tanto, deberemos leer un nmero indeterminado de lneas, y tras leer la ltima,
ordenarlas. Una manera de manejar ese ``nmero indeterminado'', sera declarar una constante
MAX_LINEAS, darle un valor vergonzosamente grande, y declarar un array de tamao
MAX_LINEAS. Esto, obviamente, es muy ineficiente (y feo). Nuestro programa no slo quedara
limitado por ese valor mximo, sino que adems gastara esa enorme cantidad de memoria para
procesar hasta el ms pequeo de los ficheros.

La solucin consiste en utilizar memoria dinmica. La memoria dinmica es un espacio de


almacenamiento que se solicita en tiempo de ejecucin. De esa manera, a medida que el proceso
va necesitando espacio para ms lneas, va solicitando ms memoria al sistema operativo para
guardarlas. El medio para manejar la memoria que otorga el sistema operativo, es el puntero,
puesto que no podemos saber en tiempo de compilacin dnde nos dar huecos el sistema
operativo (en la memoria de nuestro PC).

Memoria Dinmica.

Sobre el tratamiento de memoria, GLib dispone de una serie de instrucciones que sustituyen a las
ya conocidas por todos malloc, free, etc. y, siguiendo con el modo de llamar a las funciones en
GLib, las funciones que sustituyen a las ya mencionadas son g_malloc y g_free.

Reserva de memoria.

La funcin g_malloc posibilita la reserva de una zona de memoria, con un nmero de bytes que le
pasemos como parmetro. Adems, tambin existe una funcin similar llamada g_malloc0 que,
no slo reserva una zona de memoria, sino que, adems, llena esa zona de memoria con ceros,
lo cual nos puede beneficiar si se necesita un zona de memoria totalmente limpia.

gpointer g_malloc (gulong numero_de_bytes );

gpointer g_malloc0 (gulong numero_de_bytes );

Existe otro conjunto de funciones que nos permiten reservar memoria de una forma parecida a
cmo se hace en los lenguajes orientados a objetos.

Liberacin de memoria.

Cuando se hace una reserva de memoria con g_malloc y, en un momento dado, el uso de esa
memoria no tiene sentido, es el momento de liberar esa memoria. Y el sustituto de free es g_free
que, bsicamente, funciona igual que la anteriormente mencionada.

void g_free (gpointer memoria_reservada );

Realojamiento de memoria

En determinadas ocasiones, sobre todo cuando se utilizan estructuras de datos dinmicas, es


necesario ajustar el tamao de una zona de memoria (ya sea para hacerla ms grande o ms
pequea). Para eso, GLib ofrece la funcin g_realloc, que recibe un puntero a memoria que
apunta a una regin que es la que ser acomodada al nuevo tamao y devuelve el puntero a la
nueva zona de memoria. El anterior puntero es liberado y no se debera utilizar ms:

gpointer g_realloc (gpointer memoria_reservada , gulong numero_de_bytes );

Asignacin dinmica
El proceso de compactacin del punto anterior es una instancia particular del problema de
asignacin de memoria dinmica, el cual es el cmo satisfacer una necesidad de tamao n con
una lista de huecos libres. Existen muchas soluciones para el problema. El conjunto de huecos es
analizado para determinar cul hueco es el ms indicado para asignarse. Las estrategias ms
comunes para asignar algn hueco de la tabla son:

Primer ajuste: Consiste en asignar el primer hueco con capacidad suficiente. La bsqueda puede
iniciar ya sea al inicio o al final del conjunto de huecos o en donde termin la ltima bsqueda. La
bsqueda termina al encontrar un hueco lo suficientemente grande.

Mejor ajuste: Busca asignar el espacio ms pequeo de los espacios con capacidad suficiente. La
bsqueda se debe de realizar en toda la tabla, a menos que la tabla est ordenada por tamao.
Esta estrategia produce el menor desperdicio de memoria posible.

Peor ajuste: Asigna el hueco ms grande. Una vez ms, se debe de buscar en toda la tabla de
huecos a menos que est organizada por tamao. Esta estrategia produce los huecos de sobra
ms grandes, los cuales pudieran ser de ms uso si llegan procesos de tamao mediano que
quepan en ellos.

Se ha demostrado mediante simulacros que tanto el primer y el mejor ajuste son mejores que el
peor ajuste en cuanto a minimizar tanto el tiempo del almacenamiento. Ni el primer o el mejor
ajuste es claramente el mejor en trminos de uso de espacio, pero por lo general el primer ajuste
es ms rpido.

Las caractersticas principales que nos ofrece Java respecto a cualquier otro lenguaje de
programacin, son:

Es SIMPLE :

Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las caractersticas menos
usadas y ms confusas de stos. C++ es un lenguaje que adolece de falta de seguridad, pero C y
C++ son lenguajes ms difundidos, por ello Java se dise para ser parecido a C++ y as facilitar
un rpido y fcil aprendizaje.

Java elimina muchas de las caractersticas de otros lenguajes como C++, para mantener
reducidas las especificaciones del lenguaje y aadir caractersticas muy tiles como el garbage
collector (reciclador de memoria dinmica). No es necesario preocuparse de liberar memoria, el
reciclador se encarga de ello y como es un thread de baja prioridad, cuando entra en accin,
permite liberar bloques de memoria muy grandes, lo que reduce la fragmentacin de la memoria.

Java reduce en un 50% los errores ms comunes de programacin con lenguajes como C y C++
al eliminar muchas de las caractersticas de stos, entre las que destacan:

aritmtica de punteros
no existen referencias
registros (struct)
definicin de tipos (typedef)
macros (#define)
necesidad de liberar memoria (free)

Aunque, en realidad, lo que hace es eliminar las palabras reservadas (struct, typedef), ya que las
clases son algo parecido.

Adems, el intrprete completo de Java que hay en este momento es muy pequeo, solamente
ocupa 215 Kb de RAM.
Es ORIENTADO A OBJETOS :

Java implementa la tecnologa bsica de C++ con algunas mejoras y elimina algunas cosas para
mantener el objetivo de la simplicidad del lenguaje. Java trabaja con sus datos como objetos y
con interfaces a esos objetos. Soporta las tres caractersticas propias del paradigma de la
orientacin a objetos: encapsulacin, herencia y polimorfismo. Las plantillas de objetos son
llamadas, como en C++, clases y sus copias, instancias . Estas instancias, como en C++,
necesitan ser construidas y destruidas en espacios de memoria.

Java incorpora funcionalidades inexistentes en C++ como por ejemplo, la resolucin dinmica de
mtodos. Esta caracterstica deriva del lenguaje Objective C, propietario del sistema operativo
Next. En C++ se suele trabajar con libreras dinmicas (DLLs) que obligan a recompilar la
aplicacin cuando se retocan las funciones que se encuentran en su interior. Este inconveniente
es resuelto por Java mediante una interfaz especfica llamada RTTI ( RunTime Type Identification
) que define la interaccin entre objetos excluyendo variables de instancias o implementacin de
mtodos. Las clases en Java tienen una representacin en el runtime que permite a los
programadores interrogar por el tipo de clase y enlazar dinmicamente la clase con el resultado
de la bsqueda.

Es DISTRIBUIDO :

Java se ha construido con extensas capacidades de interconexin TCP/IP. Existen libreras de


rutinas para acceder e interactuar con protocolos como http y ftp . Esto permite a los
programadores acceder a la informacin a travs de la red con tanta facilidad como a los ficheros
locales.

La verdad es que Java en s no es distribuido, sino que proporciona las libreras y herramientas
para que los programas puedan ser distribuidos, es decir, que se corran en varias mquinas,
interactuando.

Es ROBUSTO :

Java realiza verificaciones en busca de problemas tanto en tiempo de compilacin como en


tiempo de ejecucin. La comprobacin de tipos en Java ayuda a detectar errores, lo antes
posible, en el ciclo de desarrollo. Java obliga a la declaracin explcita de mtodos, reduciendo
as las posibilidades de error. Maneja la memoria para eliminar las preocupaciones por parte del
programador de la liberacin o corrupcin de memoria. Tambin implementa los arrays autnticos
, en vez de listas enlazadas de punteros, con comprobacin de lmites, para evitar la posibilidad
de sobreescribir o corromper memoria resultado de punteros que sealan a zonas equivocadas.
Estas caractersticas reducen drsticamente el tiempo de desarrollo de aplicaciones en Java.

Adems, para asegurar el funcionamiento de la aplicacin, realiza una verificacin de los byte-
codes , que son el resultado de la compilacin de un programa Java. Es un cdigo de mquina
virtual que es interpretado por el intrprete Java. No es el cdigo mquina directamente
entendible por el hardware, pero ya ha pasado todas las fases del compilador: anlisis de
instrucciones, orden de operadores, etc., y ya tiene generada la pila de ejecucin de rdenes.

Java proporciona, pues:

Comprobacin de punteros
Comprobacin de lmites de arrays
Excepciones
Verificacin de byte-codes

Es de ARQUITECTURA NEUTRAL :
Para establecer Java como parte integral de la red, el compilador Java compila su cdigo a un
fichero objeto de formato independiente de la arquitectura de la mquina en que se ejecutar.
Cualquier mquina que tenga el sistema de ejecucin ( run-time ) puede ejecutar ese cdigo
objeto, sin importar en modo alguno la mquina en que ha sido generado. Actualmente existen
sistemas run-time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac,
Apple y probablemente haya grupos de desarrollo trabajando en el porting a otras plataformas.

El cdigo fuente Java se "compila" a un cdigo de bytes de alto nivel independiente de la


mquina. Este cdigo (byte-codes) est diseado para ejecutarse en una mquina hipottica que
es implementada por un sistema run-time, que s es dependiente de la mquina.

En una representacin en que tuvisemos que indicar todos los elementos que forman parte de la
arquitectura de Java sobre una plataforma genrica, obtendramos una figura como la siguiente:

En ella podemos ver que lo verdaderamente dependiente del sistema es la Mquina Virtual Java
(JVM) y las libreras fundamentales, que tambin nos permitiran acceder directamente al
hardware de la mquina. Adems, habr APIs de Java que tambin entren en contacto directo
con el hardware y sern dependientes de la mquina, como ejemplo de este tipo de APIs
podemos citar:

Java 2D: grficos 2D y manipulacin de imgenes


Java Media Framework : Elementos crticos en el tiempo: audio, video...
Java Animation: Animacin de objetos en 2D
Java Telephony: Integracin con telefona
Java Share: Interaccin entre aplicaciones multiusuario
Java 3D: Grficos 3D y su manipulacin

Es SEGURO :

La seguridad en Java tiene dos facetas. En el lenguaje, caractersticas como los punteros o el
casting implcito que hacen los compiladores de C y C++ se eliminan para prevenir el acceso
ilegal a la memoria. Cuando se usa Java para crear un navegador, se combinan las
caractersticas del lenguaje con protecciones de sentido comn aplicadas al propio navegador.

El lenguaje C, por ejemplo, tiene lagunas de seguridad importantes, como son los errores de
alineacin . Los programadores de C utilizan punteros en conjuncin con operaciones aritmticas.
Esto le permite al programador que un puntero referencie a un lugar conocido de la memoria y
pueda sumar (o restar) algn valor, para referirse a otro lugar de la memoria. Si otros
programadores conocen nuestras estructuras de datos pueden extraer informacin confidencial
de nuestro sistema. Con un lenguaje como C, se pueden tomar nmeros enteros aleatorios y
convertirlos en punteros para luego acceder a la memoria:

printf( "Escribe un valor entero: " );


scanf( "%u",&puntero );
printf( "Cadena de memoria: %sn",puntero );

Otra laguna de seguridad u otro tipo de ataque, es el Caballo de Troya . Se presenta un programa
como una utilidad, resultando tener una funcionalidad destructiva. Por ejemplo, en UNIX se
visualiza el contenido de un directorio con el comando ls . Si un programador deja un comando
destructivo bajo esta referencia, se puede correr el riesgo de ejecutar cdigo malicioso, aunque el
comando siga haciendo la funcionalidad que se le supone, despus de lanzar su carga
destructiva. Por ejemplo, despus de que el caballo de Troya haya enviado por correo el
/etc/shadow a su creador, ejecuta la funcionalidad de ls persentando el contenido del directorio.
Se notar un retardo, pero nada inusual.

El cdigo Java pasa muchos tests antes de ejecutarse en una mquina. El cdigo se pasa a
travs de un verificador de byte-codes que comprueba el formato de los fragmentos de cdigo y
aplica un probador de teoremas para detectar fragmentos de cdigo ilegal -cdigo que falsea
punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de un objeto-.

Si los byte-codes pasan la verificacin sin generar ningn mensaje de error, entonces sabemos
que:

El cdigo no produce desbordamiento de operandos en la pila


El tipo de los parmetros de todos los cdigos de operacin son conocidos y correctos
No ha ocurrido ninguna conversin ilegal de datos, tal como convertir enteros en punteros
El acceso a los campos de un objeto se sabe que es legal: public, private, protected
No hay ningn intento de violar las reglas de acceso y seguridad establecidas

El Cargador de Clases tambin ayuda a Java a mantener su seguridad, separando el espacio de


nombres del sistema de ficheros local, del de los recursos procedentes de la red. Esto limita
cualquier aplicacin del tipo Caballo de Troya , ya que las clases se buscan primero entre las
locales y luego entre las procedentes del exterior.

Las clases importadas de la red se almacenan en un espacio de nombres privado, asociado con
el origen. Cuando una clase del espacio de nombres privado accede a otra clase, primero se
busca en las clases predefinidas (del sistema local) y luego en el espacio de nombres de la clase
que hace la referencia. Esto imposibilita que una clase suplante a una predefinida.

En resumen, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a


zonas delicadas de memoria o de sistema, con lo cual evitan la interaccin de ciertos virus. Java
no posee una semntica especfica para modificar la pila de programa, la memoria libre o utilizar
objetos y mtodos de un programa sin los privilegios del kernel del sistema operativo. Adems,
para evitar modificaciones por parte de los crackers de la red, implementa un mtodo ultraseguro
de autentificacin por clave pblica. El Cargador de Clases puede verificar una firma digital antes
de realizar una instancia de un objeto. Por tanto, ningn objeto se crea y almacena en memoria,
sin que se validen los privilegios de acceso. Es decir, la seguridad se integra en el momento de
compilacin, con el nivel de detalle y de privilegio que sea necesario.

Dada, pues la concepcin del lenguaje y si todos los elementos se mantienen dentro del estndar
marcado por Sun, no hay peligro. Java imposibilita, tambin, abrir ningn fichero de la mquina
local (siempre que se realizan operaciones con archivos, stas trabajan sobre el disco duro de la
mquina de donde parti el applet), no permite ejecutar ninguna aplicacin nativa de una
plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar
nuestra mquina para hacer peticiones o realizar operaciones con otra. Adems, los intrpretes
que incorporan los navegadores de la Web son an ms restrictivos. Bajo estas condiciones (y
dentro de la filosofa de que el nico ordenador seguro es el que est apagado, desenchufado,
dentro de una cmara acorazada en un bunker y rodeado por mil soldados de los cuerpos
especiales del ejrcito), se puede considerar que Java es un lenguaje seguro y que los applets
estn libres de virus.

Respecto a la seguridad del cdigo fuente, no ya del lenguaje, JDK proporciona un


desemsamblador de byte-code, que permite que cualquier programa pueda ser convertido a
cdigo fuente, lo que para el programador significa una vulnerabilidad total a su cdigo. Utilizando
javap no se obtiene el cdigo fuente original, pero s desmonta el programa mostrando el
algoritmo que se utiliza, que es lo realmente interesante. La proteccin de los programadores ante
esto es utilizar llamadas a programas nativos, externos (incluso en C o C++) de forma que no sea
descompilable todo el cdigo; aunque as se pierda portabilidad. Esta es otra de las cuestiones
que Java tiene pendientes.

Es PORTABLE :

Ms all de la portabilidad bsica por ser de arquitectura independiente, Java implementa otros
estndares de portabilidad para facilitar el desarrollo. Los enteros son siempre enteros y adems,
enteros de 32 bits en complemento a 2. Adems, Java construye sus interfaces de usuario a
travs de un sistema abstracto de ventanas de forma que las ventanas puedan ser implantadas
en entornos Unix, Pc o Mac.

Es INTERPRETADO :

El intrprete Java (sistema run-time) puede ejecutar directamente el cdigo objeto. Enlazar
(linkar) un programa, normalmente, consume menos recursos que compilarlo, por lo que los
desarrolladores con Java pasarn ms tiempo desarrollando y menos esperando por el
ordenador. No obstante, el compilador actual del JDK es bastante lento. Por ahora, que todava
no hay compiladores especficos de Java para las diversas plataformas, Java es ms lento que
otros lenguajes de programacin, como C++, ya que debe ser interpretado y no ejecutado como
sucede en cualquier programa tradicional.

Se dice que Java es de 10 a 30 veces ms lento que C, y que tampoco existen en Java proyectos
de gran envergadura como en otros lenguajes. La verdad es que ya hay comparaciones
ventajosas entre Java y el resto de los lenguajes de programacin, y una ingente cantidad de
folletos electrnicos que supuran fanatismo en favor y en contra de los distintos lenguajes
contendientes con Java. Lo que se suele dejar de lado en todo esto, es que primero habra que
decidir hasta que punto Java, un lenguaje en pleno desarrollo y todava sin definicin definitiva,
est maduro como lenguaje de programacin para ser comparado con otros; como por ejemplo
con Smalltalk, que lleva ms de 20 aos en cancha.

La verdad es que Java para conseguir ser un lenguaje independiente del sistema operativo y del
procesador que incorpore la mquina utilizada, es tanto interpretado como compilado. Y esto no
es ningn contrasentido, me explico, el cdigo fuente escrito con cualquier editor se compila
generando el byte-code. Este cdigo intermedio es de muy bajo nivel, pero sin alcanzar las
instrucciones mquina propias de cada plataforma y no tiene nada que ver con el p-code de
Visual Basic. El byte-code corresponde al 80% de las instrucciones de la aplicacin. Ese mismo
cdigo es el que se puede ejecutar sobre cualquier plataforma. Para ello hace falta el run-time,
que s es completamente dependiente de la mquina y del sistema operativo, que interpreta
dinmicamente el byte-code y aade el 20% de instrucciones que faltaban para su ejecucin. Con
este sistema es fcil crear aplicaciones multiplataforma, pero para ejecutarlas es necesario que
exista el run-time correspondiente al sistema operativo utilizado.

Es MULTITHREADED :

Al ser multithreaded (multihilvanado, en mala traduccin), Java permite muchas actividades


simultneas en un programa. Los threads (a veces llamados, procesos ligeros), son bsicamente
pequeos procesos o piezas independientes de un gran proceso. Al estar los threads contruidos
en el lenguaje, son ms fciles de usar y ms robustos que sus homlogos en C o C++.

El beneficio de ser miltithreaded consiste en un mejor rendimiento interactivo y mejor


comportamiento en tiempo real. Aunque el comportamiento en tiempo real est limitado a las
capacidades del sistema operativo subyacente (Unix, Windows, etc.), an supera a los entornos
de flujo nico de programa (single-threaded) tanto en facilidad de desarrollo como en rendimiento.

Cualquiera que haya utilizado la tecnologa de navegacin concurrente, sabe lo frustrante que
puede ser esperar por una gran imagen que se est trayendo. En Java, las imgenes se pueden
ir trayendo en un thread independiente, permitiendo que el usuario pueda acceder a la
informacin en la pgina sin tener que esperar por el navegador.

Es DINAMICO :

Java se beneficia todo lo posible de la tecnologa orientada a objetos. Java no intenta conectar
todos los mdulos que comprenden una aplicacin hasta el tiempo de ejecucin. Las librera
nuevas o actualizadas no paralizarn las aplicaciones actuales (siempre que mantengan el API
anterior).
Java tambin simplifica el uso de protocolos nuevos o actualizados. Si su sistema ejecuta una
aplicacin Java sobre la red y encuentra una pieza de la aplicacin que no sabe manejar, tal
como se ha explicado en prrafos anteriores, Java es capaz de traer automticamente cualquiera
de esas piezas que el sistema necesita para funcionar.

Java, para evitar que los mdulos de byte-codes o los objetos o nuevas clases, haya que estar
trayndolos de la red cada vez que se necesiten, implementa las opciones de persistencia, para
que no se eliminen cuando de limpie la cach de la mquina

También podría gustarte