P. 1
Memoria Estática

Memoria Estática

|Views: 11.875|Likes:
Publicado porpluis_andre706

More info:

Published by: pluis_andre706 on Sep 05, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOCX, PDF, TXT or read online from Scribd
See more
See less

08/21/2013

pdf

text

original

Memoria Estática La forma más fácil de almacenar el contenido de una variable en memoria en tiempo de ejecución es en memoria estática o permanente

a lo largo de toda la ejecución del programa. No todos los objetos (variables) pueden ser almacenados estáticamente. Para que un objeto pueda ser almacenado en memoria estática su tamaño (número de bytes necesarios para su almacenamiento) ha de ser conocido en tiempo de compilación, como consecuencia de esta condición no podrán almacenarse en memoria estática: * Los objetos correspondientes a procedimientos o funciones recursivas, ya que en tiempo de compilación no se sabe el número de v ariables que serán necesarias. * Las estructuras dinámicas de datos tales como listas, árboles, etc. ya que el número de elementos que las forman no es conocido hasta que el programa se ejecuta. Las técnicas de asignación de memoria estática son sencilla s. A partir de una posición señalada 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 asignación de memoria puede hacerse en tiempo de compilación y los objetos est án vigentes desde que comienza la ejecución 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 estáticamente se aloja en la memoria estática un registro de activación correspondiente a cada uno de los subprogramas. Estos registros de activación contendrán las variables locales, parámetros formales y valor devuelto por la función. Dentro de cada registro de activación las variables locales se organizan secuencialmente. Existe un solo registro de activación para cada procedimiento y por tanto no están permitidas las llamadas recursivas. El proceso que se sigue cuando un procedimiento p llama a otro q es el siguiente: 1. p evalúa los parámetros 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 código máquina han de realizarse sobre alguna zona de memoria temporal. (En algún momento debe haber una zona de memoria que contenga el valor intermedio 15, y el valor intermedio 4 para sumarlos a continuación). En caso de utilización de memoria estática és ta zona de temporales puede ser común a todo el programa, ya que su tamaño puede deducirse en tiempo de compilación. 2. q inicializa sus variables y comienza su ejecución. Dado que las variables están permanentemente en memoria es fácil implementar la pr opiedad de que conserven o no su contenido para cada nueva llamada
Memoria Dinámica

¿Qué es la memoria dinámica?

La solución consiste en utilizar memoria dinámica. va solici tando más memoria al sistema operativo para guardarlas. Cuando se hace una reserva de memoria con g_malloc y. gulong numero_ de_bytes ). etc. void g_free (gpointer memoria_reservada ). y declarar un array de tamaño MAX_LINEAS. puesto que no podemos saber en tiempo de compilación dónde nos dará huecos el sistema operativo (en la memoria de nuest ro PC). gpointer g_malloc0 (gulong numero_de_by tes ). y. Realojamiento de memoria En determinadas ocasiones. Existe otro conjunto de funciones que nos permiten reservar memoria de una forma parecida a cómo se hace en los lenguajes orientados a objetos. llena esa zona de memoria con ceros. básicamente. que recibe un puntero a memoria que apunta a una región que es la que será acomodada al nuevo tamaño y devuelve el puntero a la nueva zona de memoria. Un ejemplo simple podría ser el de un programa que lee las líneas de un archivo y las ordena. Sobre el tratamiento de memoria. el us o de esa memoria no tiene sentido. es necesario ajustar el tamaño de una zona de memoria (ya sea para hacerla más grande o más pequeña). gpointer g_malloc (gulong numero_de_bytes ). Para eso. sino que. Por tanto. darle un valor vergo nzosamente grande. GLib ofrece la función g_realloc. además. en un momento dado. Y el sustituto de free es g_free que. obviamente. Una manera de manejar ese ``número indeterminado''. Liberación de memoria. GLib dispone de una serie de instrucciones que sustituyen a las ya conocidas por todos malloc. De esa manera. Esto. La memoria dinámica es un espacio de almacenamiento que se solicita en tiempo de ejecución. Memoria Dinámica. no sólo reserva una zona de memoria. con un número de bytes que le pasemos como parámetro. es el puntero.Supongamos que nuestro programa debe manipular estructuras de datos de longitud desconocida. Asignación dinámica . también existe una función similar llamada g_malloc0 que. Además. y tras leer la última. a medida que el proceso va necesitando espacio para más líneas. las funciones que sustituyen a las ya mencionadas son g_malloc y g_free. Nuestro programa no sólo quedaría limitado por ese valor máximo. El anterior puntero es liberado y no se debería utilizar más: gpointer g_realloc (gpointer memoria_reservada . free. es el momento de liberar esa memoria. siguiendo con el modo de llamar a las funciones en GLib. lo cual nos puede beneficiar si se necesita un zona de memoria totalmente limpia. El medio para manejar la memoria que otorga el sistema operativo. sobre todo cuando se utilizan estructuras de datos dinámicas. es muy ineficiente (y feo). funciona igual que la anteriormente mencionada. ordenarlas. Reserva de memoria . La función g_malloc posibilita la reserva de una zona de memoria. sería declarar una constante MAX_LINEAS. sino que además gastaría esa enorme cantidad de memoria para procesar hasta el más pequeño de los ficheros. deberemos leer un número indeterminado de líneas.

El conjunto de huecos es analizado para determinar cuál hueco es el más indicado para asignarse. C++ es un lenguaje que adolece de falta de seguridad. ya que las clases son algo parecido. La búsqueda termina al encontrar un hueco lo suficientemente grande. Ni el primer o el mejor ajuste es claramente el mejor en términos de uso de espacio. Java reduce en un 50% los errores más comunes de programación con lenguajes como C y C++ al eliminar muchas de las características de éstos. solamente ocupa 215 Kb de RAM. La búsqueda se debe de realizar en toda la tabla. La búsqueda puede iniciar ya sea al inicio o al final del conjunto de huecos o en donde terminó la última búsqueda. a menos que la tabla esté ordenada por tamaño. por ello Java se diseñó para ser parecido a C++ y así facilitar un rápido y fácil aprendizaje. Las estrategias más comunes para asignar algún hueco de la tabla son: Primer ajuste: Consiste en asignar el primer hueco con c apacidad suficiente. lo que reduce la fragmentación de la memoria. Peor ajuste: Asigna el hueco más grande. lo que hace es eliminar las palabras reservadas (struct. Además. entre las que destacan: y y y y y y aritmética de punteros no existen referencias registros (struct) definición de tipos (t ypedef) macros (#define) necesidad de liberar memoria (free) Aunque. el reciclador se encarga de ello y como es un thread de baja prioridad. Mejor ajuste: Busca asignar el espacio más pequeñ o de los espacios con capacidad suficiente. No es necesario preocuparse de liberar memoria. son: Es SIMPLE : Java ofrece toda la funcionalidad de un lenguaje potente. se debe de buscar en toda la tabla de huecos a menos que esté organizada por tamaño. Una vez más. el intérprete completo de Java que hay en este momento es muy pequeño. Las características principales que nos ofrece Java respecto a cualquier otro lenguaje de programación. Esta estrategia produce los huecos de sobra más grandes. cuando entra en acción. Java elimina muchas de las características de otros lenguajes como C++. typedef). 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. pero sin las características menos usadas y más confusas de éstos. Esta estrategia produce el menor desperdicio de memoria posible. en realidad. . para mantener reducidas las especificaciones del lenguaje y añadir características muy útiles como el garbage collector (reciclador de memoria dinámica).El proceso de compactación del punto anterior es una instancia particular del problema de asignación de memoria dinámica. permite liberar bloques de memoria muy grandes. el cual es el cómo satisfacer una necesidad de tamaño n con una lista de huecos libres. pero por lo general el primer ajuste es más rápido. los cuales pudieran ser de más uso si llegan procesos de tamaño mediano que quepan en ellos. Existen much as soluciones para el problema. pero C y C++ son lenguajes más difundidos.

Las clases en Java tienen una representación en el runtime que permite a los programadores interrogar por el tipo de clase y enlazar dinámicamente la clase con el resultado de la búsqueda. es decir. que son el resultado de la compilación de un progra ma Java. para evitar la posibilidad de sobreescribir o corromper memoria resultado de punteros que señalan a zonas equiv ocadas. También implementa los arrays auténticos . en el ciclo de desarrollo. como en C++. para asegurar el funcionamiento de la aplicación. Este inconveniente es resuelto por Java mediante un a interfaz específica llamada RTTI ( RunTime Type Identification ) que define la interacción entre objetos excluyendo variables de instancias o implementación de métodos. Esta característica deriva del lenguaje Objective C. propietario del sistema operativo Next. instancias . Existen librerías de rutinas para acceder e interactuar con p rotocolos como http y ftp . en vez de listas enlazadas de punteros. clases y sus copias. orden de operadores. Maneja la memoria para eliminar las preocupaciones por parte del programador de la lib eración o corrupción de memoria. con comprobación de límites. Java obliga a la declaración explícita de métodos.Es ORIENTADO A OBJETOS : Java implementa la tecnología básica de C++ con algunas mejoras y elimina algunas cosas para mantener el objetivo de la simplicidad del lenguaje. reduciendo así las posibilidades de error. que se corran en varias máquinas. interactuando. Las plantillas de objetos son llamadas. pues: y y y y Comprobación de punteros Comprobación de límites de arrays Excepciones Verificación de byte-codes Es de ARQUITECTURA NEUTRAL : . necesitan ser construidas y destruidas en espacios de memoria. etc. En C++ se suele trabajar con librerías dinámicas (DLLs) que obligan a recompilar la aplicación cuando se retocan las funciones que se encuentran en su interior. realiza una verificación de los bytecodes . Es DISTRIBUIDO : Java se ha construido con extensas capacidades de interconexión TCP/IP. Es un código de máquina virtual que es interpretado por el intérprete Java. y ya tiene generada la pila de ejecución de órdenes. lo antes posible. La comprobación de tipos en Java ayuda a detectar errores. Estas instancias. Java proporciona. Es ROBUSTO : Java realiza verificaciones en busca de problemas tanto en tiempo de compilación como en tiempo de ejecución. sino que proporciona las librerías y herramientas para que los programas puedan ser distribuidos. La verdad es que Java en sí no es distribuido. la resolución dinámica de métodos. Java trabaja con sus datos como objetos y con interfaces a esos objetos. pero ya ha pasado todas las fases del compilador: análisis de instrucciones. Java incorpora funcionalidades inexistentes en C++ como por ejemplo. como en C++.. Soporta las tres características propias del paradigma de la orientación a objetos: encapsulación. No es el código máquina directamente entendible por el hardware. Estas características reducen drásticamente el tiempo de desarrollo de aplicaciones en Java. Además. Esto permite a los programadores acceder a la información a través de la red con tanta facilidad como a los ficheros locales. herencia y polimorfismo.

habrá APIs de Java que también entren en conta cto directo con el hardware y serán dependientes de la máquina.Para establecer Java como parte integral de la red. como ejemplo de este tipo de APIs podemos citar: y Java 2D: gráficos 2D y manipulación de imágenes . Apple y probablemente haya grupos de desarrol lo trabajando en el porting a otras plataformas. Linux. Aix.x. El código fuente Java se "compila" a un código de bytes de alto nivel independiente de la máquina. sin importar en modo alguno la máquina en que ha sido generado. En una representación en que tuviésemos que indicar todos los elementos que forman parte de la arquitectura de Java sobre una plataforma genérica. que también nos permitirían acceder directamente al hardware de la máquina. obtendríamos una figura como la siguiente: En ella podemos ver que lo verdaderamente dependiente del sistema es la Máquina Virtual Java (JVM) y las librerías fundamentales. Windows NT. que sí es dependiente de la máquina. SunOs 4. Mac. Irix.1. Además. Windows 95. el compilador Java compila su código a un fichero objeto de formato independiente de la arquitectura de la máquina en que se ejecutará. Actualmente existen sistemas run-time para Solaris 2.x. Cualquier máquina que tenga el sistema de ejecución ( run-time ) puede ejecutar ese código objeto. Este código (byte-codes) está diseñado para ejecutarse en una máquina hipotética que es implementada por un sistema run-time.

tal como convertir enteros en punteros El acceso a los campos de un objeto se sabe que es legal: public. Si un programador deja un comando destructivo bajo esta referencia. viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de un objeto -. ya que las clases se buscan primero entre las locales y luego entre las procedentes del exterior. Cuando una clase del espacio de nombres privado accede a otra clase. Si los byte-codes pasan la verificación sin generar ningún mensaje de error. después de la nzar su carga destructiva. Los programadores de C utilizan punteros en conjunción con operaciones aritméticas.puntero ).. se puede correr el riesgo de ejecutar código malicioso. aunque el comando siga haciendo la funcionalidad que se le supone. Por ejemplo. Esto limita cualquier aplicación del tipo Caballo de Troya . Se notará un retardo. Por ejemplo. entonces sabemos que: y y y y y El código no produce desbordamiento de operandos en la pila El tipo de los parámetros de todos los códigos de operación son conocidos y correctos No ha ocurrido ninguna conversión ilegal de datos. después de que el caballo de Troya haya enviado por correo el /etc/shadow a su creador. pri vate. Esto le permite al programador que un puntero referencie a un lugar conocido de la memoria y pueda sumar (o restar) algún valor.y y y y y Java Media Framework : Elementos críticos en el tiempo: audio. El código Java pasa muchos tests antes de ejecutarse en una máquina. tiene lagunas de seguridad importantes. resultando tener una funcionalidad destructiva. En el lenguaje. El código se pasa a través de un verificador de byte -codes que comprueba el formato de los fragmentos de código y aplica un probador de teoremas para detectar fragmentos de código ilegal -código que falsea punteros. del de los recursos procedentes de la red.. printf( "Cadena de memoria: %sn". se pueden tomar números enteros aleatorios y convertirlos en punteros para luego acceder a la memoria: printf( "Escribe un valor entero: " ). características como los punteros o el casting implícito que hacen los compiladores de C y C++ se eliminan para prevenir el acceso ilegal a la memoria. video. para referirse a otro lugar de la memoria. scanf( "%u". Se presenta un programa como una utilidad. Con un lenguaje como C. protected No hay ningún intento de violar las reglas de acceso y seguridad establecidas El Cargador de Clases también ayuda a Java a mantener su seguridad. como son los errores de alineación . Si otros programadores conocen nuestras estructuras de datos pueden extraer información confidencial de nuestro sistema. se c ombinan las características del lenguaje con protecciones de sentido común aplicadas al propio navegador. El lenguaje C. Las clases importadas de la red se almacenan en un espacio de nombres privado. pero nada inusual. separando el espacio de nombres del sistema de ficheros local. Otra laguna de seguridad u otro tipo de ataque. en UNIX se visualiza el contenido de un directorio con el comando ls . Cuando se usa Java para crear un navegador.&puntero ). primer o se . es el Caballo de Troya . por ejemplo. ejecuta la funcionalidad de ls persentando el contenido del directorio. asociado con el origen. Java Animation: Animación de objetos en 2D Java Telephony: Integración con telefonía Java Share: Interacción entre aplicaciones multiusuario Java 3D: Gráficos 3D y su manipulación Es SEGURO : La seguridad en Java tiene dos facetas.

Esta es otra de las cuestiones que Java tiene pendientes. Por tanto. implementa un método ultraseguro de autentificación por clave pública. La protección de los programadores ante esto es utilizar llamadas a programas nativos. Es PORTABLE : Más allá de la portabilidad básica por ser de arquitectura independiente. también. con lo cual evitan la interacción de ciertos virus. nadie puede utilizar nuestra máquina para hacer peticiones o realizar operaciones con otra. Por aho ra. Java no posee una semántica específica para modificar la pila de programa. Es decir. JDK proporciona un desemsamblador de byte-code. que todavía no hay compiladores específicos de Java para las diversas plataformas. Esto imposibilita que una clase suplante a una predefinida. que es lo realmente interesante. No obstante. aunque así se pierda portabilidad. Utilizando javap no se obtiene el código fuente o riginal. dentro de una cámara acorazada en un bunker y rodeado por mil soldados de los cuerpos especiales del ejército). con el nivel de detalle y de privilegio que sea nece sario. éstas trabajan sobre el disco duro de la máquina de donde partió el applet). consume menos recursos que compilarlo. abrir ningún fichero de la máquina local (siempre que se realizan operaciones con archivos. Java construye sus interfaces de usuario a través de un sistema abstracto de ventanas de forma que las ventanas puedan ser implantadas en entornos Unix. se puede considerar que Java es un lenguaje seguro y que los applets están libres de virus. que permite que cualquier programa pueda ser convertido a código fuente. la memoria libre o utilizar objetos y métodos de un programa sin l os privilegios del kernel del sistema operativo. no hay peligro. Dada. los intérpretes que incorporan los navegadores de la Web son aún más restrictivos. Los enteros son siempre enteros y además. no ya del lenguaje. desenchufado. Además. La verdad es que ya hay comparaciones ventajosas entre Java y el resto de los lenguajes de programación. lo que para el programador significa una vulnerabilidad total a su código. Bajo estas condiciones (y dentro de la filosofía de que el único ordenador seguro es el que está apagado. el compilador actual del JDK es bastante lento. Enl azar (linkar) un programa. Pc o Mac. Es INTERPRETADO : El intérprete Java (sistema run -time) puede ejecutar directamente el código objeto. Java imposibilita. las aplicaciones de Java resultan extremadamente seguras . En resumen. la seguridad se integra en el momento de compilación. por lo que los desarrolladores con Java pasarán más tiempo desarrollando y menos esperando por el ordenador. y que tampoco existen en Java proyectos de gran envergadura como en otros lenguajes. Además. Respecto a la seguridad del código fuente. no permite ejecutar ninguna aplicación nativa de una plataforma e impide que se utilicen otros ordenadores como puente. ya que debe ser interpretado y no ejecutado como sucede en cualquier programa tradicional.busca en las clases predefinidas (del sistema local) y luego en el espacio de nombres de la clase que hace la referencia. normalmente. Java implementa otros estándares de portabilidad para facilitar el desarrollo. Java es más lento que otros lenguajes de programación. Se dice que Java es de 10 a 30 veces más lento que C. pues la concepción del lenguaje y si todos los elementos se mantienen dentro del estándar marcado por Sun. para evitar modificaciones por parte de los crackers de la red. pero sí desmonta el programa mostrando el algoritmo que se utiliza. como C++. externos (incluso en C o C++) de forma que no sea descompilable todo el código. ningún objeto se crea y almacena en memoria. enteros de 32 bits en complemento a 2. ya que no acceden a zonas delicadas de memoria o de sistema. es decir. Además. El Cargador de Clases puede verificar una firma digital antes de realizar una instancia de un objeto. sin que se validen los privilegios de acceso. y una ingente cantidad d e .

está maduro como lenguaje de programación para ser comparado con otros. Cualquiera que haya utilizado la tecnología de navegación concurrente. como por ejemplo con Smalltalk. Java no intenta conectar todos los módulos que comprenden una aplicación hasta el tiempo de ejecución. las imágenes se pueden ir trayendo en un thread independiente. Este código intermedio es de muy bajo nivel. Al estar los threads contruidos en el lenguaje. un lenguaje en pleno desarrollo y toda vía sin definición definitiva. Y esto no es ningún contrasentido. en mala traducción). permitiendo que el usuario pueda acceder a la información en la página sin tener que esperar por el navegador. En Java. pero sin alcanzar las instrucciones máquina propias de cada plataforma y no tiene nada que ver con el p -code de Visual Basic. Para ello hace falta el run -time. es tanto interpretado como compilado. son más fáciles de usar y más robustos que sus homólogos en C o C++. que lleva más de 20 años en cancha. procesos ligeros). Los threads (a veces llamados. Es MULTITHREADED : Al ser multithreaded (multihilvanado. son básicamente pequeños procesos o piezas independientes de un gran proceso. que interpreta dinámicamente el byte-code y añade el 20% de instrucciones que faltaban para su ejecución. sabe lo frustrante que puede ser esperar por una gran imagen que se está trayendo. Ese mismo código es el que se puede ejecutar s obre cualquier plataforma. me explico. el código fuente escrito con cualquier editor se compila generando el byte-code. que sí es completamente dependiente de la máquina y del sistema operativo. etc. .folletos electrónicos que supuran fanatismo en favor y en contra de los distintos lenguajes contendientes con Java. El beneficio de ser miltithreaded consiste en un mejor rendimiento interactivo y mejor comportamiento en tiempo real. Java permite muchas ac tividades simultáneas en un programa. aún supera a los entornos de flujo único de programa (single -threaded) tanto en facilidad de desarrollo como en rendimiento. Las librería nuevas o actualizadas no paralizarán las aplicaciones actuales (siempre que manteng an el API anterior). Windows.). Lo que se suele dejar de lado en todo esto. pero para ejecutarlas es necesario que exista el run-time correspondiente al sistema operativo utilizado. El byte-code corresponde al 80% de las instrucciones de la aplicación. La verdad es que Java para conseguir ser un lenguaje independiente del sistema opera tivo y del procesador que incorpore la máquina utilizada. Es DINAMICO : Java se beneficia todo lo posible de la tecnología orientada a objetos. Con este sistema es fácil crear aplicaciones multiplataforma. Aunque el comportamiento en tiempo real está limitado a las capacidades del sistema operativo subyacente (Unix . es que primero habría que decidir hasta que punto Java.

Si su sistema ejecuta una aplicación Java sobre la red y encuentra una pieza de la aplicación que no sabe manejar. para evitar que los módulos de byte -codes o los objetos o nuevas clases. implementa las opciones de persistencia. Java. para que no se eliminen cuando de limpie la caché de la máquina . Java es capaz de traer automáticamente cualquiera de esas piezas que el sistema necesita para funcionar. haya que estar trayéndolos de la red cada vez que se necesiten. tal como se ha explicado en párrafos anteriores.Java también simplifica el uso de protocolos nuevos o actualizados.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->