Ir al contenido principal

Tipo de Representación de Estructuras de Datos en Memoria

Almacenamiento Real

Según Dietel La organización y administración de la “memoria principal”, “memoria primaria” o “memoria real” de un sistema ha sido y es uno de los factores más importantes en el diseño de los S.O., y me atrevo a decir que no solo de los S.O. sino de todo software existente, ya que mientras se aumenta la capacidad de almacenamiento real, se brindan posibilidades de creación de software mas robusto como por ejemplo las suites de Adobe, si comparamos el consumo de memoria de CS3 y CS6, encontraremos una diferencia notable en cuanto a funcionalidad del software y consumo de RAM.

Debemos tener claro que memoria y almacenamiento son términos diferentes, si revisamos su significado según la RAE tenemos:

Memoria: Dispositivo físico, generalmente electrónico, en el que se almacenan datos e instrucciones para recuperarlos y utilizarlos posteriormente.

Almacenamiento: Acción y efecto de almacenar.

Almacenar: Registrar información en la memoria de un ordenador.

Entonces la memoria es el dispositivo físico y el almacenamiento es el proceso que se lleva a cabo para ingresar ciertos datos dentro de una memoria.


Es importante tener en cuenta que el almacenamiento puede realizare en dispositivos de almacenamiento volátil (RAM, Caché) o dispositivos de almacenamiento no volátil (discos duros, Memorias extraibles, etc.), se considera como primario el almacenamiento realizado en dispositivos volátiles y secundario en dispositivos no volátiles.

Recordemos que según el modelo de maquina de Von Neumann, implementado en el hardware de computador actual, los datos y programas deben encontrarse en el almacenamiento principal o primario para ejecutarse y poder hacer referencia directa a éstos, y la estructura de la memoria debe poseer la capacidad de reutilización de la maquina de Alan Turing.

Para efectos de desarrollo del tema, durante este entrada haremos referencia a ambos como un todo en el cual, por abstracción, se incluye el proceso y el dispositivo, por lo que en ocasiones se utilizaran como sinónimo.


El almacenamiento es de hecho un proceso mas complejo dentro del cual encontramos conceptos como direcciones virtuales de memoria, paginación, dirección física, etc. pero de manera simple podemos representarlo de la siguiente manera:




Representación de Estructuras de Datos por Posiciones

Es llamada también Almacenamiento Contiguo, en ésta el lugar físico donde se almacena un elemento determina automáticamente su posición relativa en la estructura de datos, los arreglos y los registros (records en C++) son ejemplos de estructuras de datos almacenados en bloques contiguos, podemos ver una representación aproximada a continuación:




Ventajas.
  • Fácil implementación.
  • Rapidez de recorrido, debido a que la dirección de cada elemento está implícita en su posición física.

Desventajas.

Al realizar manipulaciones de los elementos

  • Al agregar un nuevo elemento en algún lugar que no sea el último, se tiene que desplazar los elementos hacia abajo que están después de la posición de inserción deseada logrando que se genere un espacio para poder agregar un nuevo elemento.
  • Al borrar un elemento que no sea el último deja un espacio no permitido entre los elementos, para lo cual se tiene que desplazar una posición hacia arriba los elementos,que están después del elemento borrado.
Representación de Estructuras de Datos por Ligas

Es llamada también Almacenamiento Disperso, en este tipo de representación la ubicación física de un elemento no determina la posición relativa que tiene dentro de la Estructura de Datos, por lo cual dos elementos contiguos en la Estructura de Datos no necesariamente deben estar almacenados físicamente en posiciones contiguas dentro del espacio de almacenamiento, para ello es necesario que cada elemento almacene la dirección física del siguiente elemento, lo que significa que cada elemento debe contener 2 o más campos.


A manera de mostrar un aproximado de la estructura en memoria tenemos:


Recordemos que las direcciones de memoria utilizan el formato 0xffffffff y no el mostrado en el esquema.


Ventajas.

  • La representación no es exclusiva debido a que mantiene una organización lineal.
  • Posibilidad de agregar y eliminar elementos de la estructura, sin tener que desplazar los elementos que ya estaban en ella.
  • Permite un uso más eficiente del espacio de almacenamiento ya que puede crecer o decrecer en tiempo de ejecución, según requiera el usuario.

Desventajas.
  • Cada elemento deber “recordar” donde está alguno de los elementos, cada espacio es un elemento compuesto por (dato y la dirección del siguiente elemento).
  • Las operaciones requieren mayor tiempo de procesamiento, debido a que el acceso no es directo, se requiere realizar un recorrido hasta encontrar el elemento deseado.

Punteros

Antes de entrar en la estructura de un puntero, recordemos lo que acontece cuando se declara una variable, sin importar el tipo, a ésta se asocian tres atributos fundamentales: su nombre, su tipo y su dirección en memoria, por ejemplo:





int x;




Ahora bien en el caso de los punteros tenemos que sin lugar de dudas, son una de las razones fundamentales para que el lenguaje C sea tan potente y tan utilizado, dentro de sus características tenemos:


  • Un puntero es una variable como cualquier otra.
  • Una variable puntero (o puntero) es una variable que contiene direcciones de otras variables.
  • Un puntero es una variable que contiene una dirección de memoria, utilizando punteros su programa puede realizar muchas tareas que no sería posible utilizando tipos de datos estándar.
  • Cuando se referencia (se hace uso) al valor de la variable, el compilador de C accede automáticamente a la dirección de memoria donde se almacena un dato.
  • A través de estos puede lograrse la eficiencia en el acceso a una dirección de memoria utilizando un puntero.
Puntero Null

Un puntero nulo no apunta,valga la redundancia, a ninguna parte (dato válido) en particular, es decir, éstos se utilizan para proporcionar a un programa un medio de conocer cuando una variable puntero no direcciona a ninguna direccion de memoria, Ejemplo en C++:

#include <stdio.h>
char *punteroChar = NULL;


Hemos declarado un puntero "p", el cual podrá almacenar la dirección de memoria de un tipo de dato char, pero que en el instante de su declaración no apunta a ningún valor en especifico.

Puntero Void.

Este apunta a cualquier tipo de dato, estos pueden 
en realidad apuntar  al universo de tipos de datos primitivos o definidos por el usuario, podemos declararlo en c++ asi:


#include <stdio.h>

void *puntero;

Nota.


No debemos confundir los punteros void y NULL. Un puntero nulo no direcciona a ningún dato válido. Un puntero void direcciona datos de un tipo no especificado. Un puntero void se puede igualar a nulo si no se direcciona ningún dato válido. Nulo es un valor; void es un tipo de dato, ejemplo en C++.


#include <stdio.h>

void *puntero = NULL;

El punto declarado anteriormente no apunta a ningún dato y a ningún tipo.

Punteros en Java y C++

En el caso del lenguaje C y C++, los punteros pueden implementarse a través de una sintaxis simple, pero en el caso de Java encontraremos en la red muchos aportes en los que se dice que los punteros no existen o no se pueden implementar en Java, para aclarar esa situación pondré en perspectiva la naturaleza de ambos lenguajes.

C++ es un lenguaje nacido a partir de la integración de características de orientación a objetos implementados en Simula 67, y del lenguaje C, el cual es un lenguaje perteneciente al paradigma imperativo, lo que hace que la declaración y uso de los punteros deba realizarse de manera explicita a través de declaraciones.


En el caso de Java, derivado directo de C++,  el uso de direcciones de memoria se realiza de manera implícita en cualquier tipo de dato no primitivo, los datos primitivos son int, float, double, String, etc., esto es abstracción pura en los lenguajes orientados a objetos, el hecho que no podamos identificar los punteros como en el caso de C++ no significa en ningún momento que estos no se utilicen.


Referencias

Bibliográficas.

  • Aguilar, Luis J. (2004).Algoritmos y estructuras de datos, una perspectiva en C. McGraw-Hill.
  • Aguilar, Luis J. (2001).Programación en C, Metodología, algoritmos y estructura de datos. McGraw-Hill.
  • H. M. Deitel.(1987). Introducción a los Sistemas Operativos. Addison-Wesley Iberoamericana, México.
  • Sebesta, Robert W. (2010) Concepts of  Programming Languages. (9ª Edición). PEARSON.
Electrónicas.




Comentarios

Entradas más populares de este blog

Contenidos

A continuación se listan los contenidos a desarrollar en el presente Blog: Introducción. Conceptos Básicos. Tipos de Representación de Estructuras de Datos en Memoria. Arreglos(Vectores y Matrices). Archivos. Listas Encadenadas. Filas. Pilas. Arboles Binarios. Grafos. Se utilizara para codificar las estructuras de datos se utilizara el lenguaje de programación Java con el IDE NetBeans y Visual Studio 2013 con Visual C++ en aplicaciones MFC basadas en cuadros de dialogo. Puedes descargar NetBeans aquí .