Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Memoria Estatica
Memoria Estatica
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:
* 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.
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:
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.
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.
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.
Realojamiento de memoria
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 :
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 :
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.
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.
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:
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:
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:
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.
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.
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 :
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