REPÚBLICA BOLIVARIANA DE VENEZUELA MINISTERIO DEL PODER POPULAR PARA LA EDUCACIÓN UNIVERSITARIA, CIENCIA Y TECNOLOGÍA INSTITUTO UNIVERSITARIO POLITÉCNICO “SANTIAGO MARIÑO” EXTENSIÓN MARACAY
ESTRUCTURAS DE DATOS FÍSICAS Y LÓGICAS Revista Digital
Autor: Alfonso A. Arias M. C.I.: 27.646.696 Asignatura: Sistemas Operativos I Docente de la asignatura: Prof. Merlin Ortega
Maracay, Agosto 2020
ESQUEMA
ESTRUCTURAS DE DATOS LOGICAS Y FISICAS
En forma general, en informática, la estructura lógica es el esqueleto
o
armazón
conceptual.
Está
constituido
por
abstracciones de la realidad para enfocarse en el ámbito conceptual sin entrar en detalles físicos (estos detalles son descritos en la estructura física).
Se
denomina
dato
cualquier
objeto
manipulable
por
el
ordenador. Un dato puede ser un carácter leído de un teclado, información
almacenada
en
un
disco,
un
número que se
encuentra en la memoria principal, entre otros.
Una Estructura de Datos es una colección de datos organizada de un modo particular y sobre la que se definen ciertas operaciones.
Sera
homogénea
cuando
todos
los
datos
elementales que la forman son del mismo tipo o heterogénea, en caso contrario.
Los tipos de datos más frecuentes utilizados en los diferentes lenguajes
de programación son los
datos
simples
(lógico,
carácter, entero, real) y los datos estructurados o compuestos. Los tipos de datos simples o primitivos no están compuestos de otras estructuras de datos; son los más frecuentes y utilizados por casi todos los lenguajes. Los tipos de datos compuestos se construyen a partir de otros tipos de datos; un ejemplo es la cadena de caracteres.
Las estructuras de datos Lógicas pueden ser de dos tipos: Estáticas: Son aquellas en las que el tamaño ocupado en memoria se define antes de que el programa se ejecute y no puede modificarse durante la ejecución del programa. Estas estructuras están implementadas en casi todos los lenguajes: registros, ficheros y tablas (o arrays).
Dinámicas: Son aquellas cuya ocupación en memora puede aumentar o disminuir en tiempo de ejecución. La elección del tipo de estructura de datos idónea a cada aplicación dependerá esencialmente del tipo de aplicación y en menor medida del lenguaje, ya que si no tiene implementada una estructura, deberá ser simulada con el algoritmo adecuado.
En
ocasiones
interesará
manejar
las
estructuras
como
elementos únicos, y otras nos interesará manejar los elementos
que componen los tipos de datos estructurados como elementos separados.
Clasificaciones de las agrupaciones de datos:
Según cómo se ubiquen en la memoria del ordenador:
o
Agrupaciones contiguas/Agrupaciones enlazadas
➔ Las agrupaciones contiguas son aquellas que ocupan posiciones sucesivas o contiguas de bits en memoria. La posición de un elemento dentro de la agrupación se puede calcular sumando al comienzo de la agrupación una cantidad determinada. ➔ Las agrupaciones enlazadas son aquellas que tienen la información dispersa en la memoria, y la manera de acceder desde un elemento a otro es mediante la dirección en memoria dónde está el siguiente elemento.
Según los tipos de datos que contengan:
o
Agrupaciones homogéneas/Agrupaciones heterogéneas
➔ Las agrupaciones homogéneas son aquellas que guardan grupos de elementos iguales (todos los elementos guardados son enteros, reales). ➔
Las agrupaciones heterogéneas son las que agrupan
elementos (campos) de diferentes tipos.
Según si tienen un tamaño fijo de elementos o puede crecer:
o
Agrupaciones estáticas/Agrupaciones dinámicas
➔ Las agrupaciones estáticas son las que guardan un número predeterminado de elementos, que no puede ser modificado en el momento en que se ejecuta el programa. Hay que elegir el número cuando escribimos el programa, antes de compilarlo. ➔ Las agrupaciones dinámicas son aquellas que pueden ir modificando el número de elementos que contienen a medida que va siendo necesario guardar más información.
Estructuras Estáticas Simples:
Booleanos: El tipo de dato lógico o booleano es en computación aquel que puede representar valores de
lógica
binaria,
esto
es
2
valores,
que
normalmente representan falso o verdadero.1 Se utiliza normalmente en la programación, estadística, electrónica, matemáticas (Álgebra booleana), etc.
Para generar un dato o valor lógico a partir de otros tipos de datos, típicamente, se emplean los operadores relacionales (u operadores de relación), por ejemplo: 0 es igual a falso y 1 es igual a verdadero
(3>2)= 1 = verdadero
(7>9)= 0 = falso
Una vez se dispone de uno o varios datos de tipo booleano, estos se pueden combinar en expresiones lógicas mediante los operadores lógicos (Y, O, NO). Un ejemplo de este tipo de expresiones sería:
verdadero Y falso → falso
falso O verdadero → verdadero
NO verdadero → falso
Carácter: Un carácter es una unidad de información que corresponde aproximadamente con un grafema o con una unidad o símbolo parecido, como los de un alfabeto o silabario de la forma escrita de un lenguaje natural.
Un ejemplo de carácter es una letra, un número o un signo de puntuación. El concepto también abarca a los caracteres de control, que no se corresponden con símbolos del lenguaje
natural sino con otros fragmentos de información usados para procesar textos, tales como el retorno de carro y el tabulador, así como instrucciones para impresoras y otros dispositivos que muestran dichos textos (como el avance de página).
Los
ordenadores
y
los
equipos
de
comunicaciones
representan caracteres mediante el uso de una codificación que asigna un valor a cada carácter (típicamente, un valor entero representado
por
una
secuencia
de
bits)
que
puede ser
almacenado o transmitido por una red. La codificación más común ha sido hasta hace poco ASCII, si bien actualmente se está haciendo más popular el Unicode. Un ejemplo de codificación no digital sería el código Morse, que en lugar de usar bits representa los caracteres mediante una serie de impulsos eléctricos de longitud variable (puntos y rayas).
Enteros: Un tipo de dato entero en computación es un tipo de dato que puede representar un subconjunto finito de los números enteros. El número mayor que puede representar depende del espacio usado por el dato y la posibilidad (o no) de representar números negativos. Los tipos de dato entero disponibles y su tamaño dependen del lenguaje de programación usado así como la arquitectura en cuestión. Por ejemplo, si para almacenar un número entero disponemos de 4 bytes de memoria tememos que:
4 bytes = 4 × 8 = 32 bits
Con
32
bits
se
pueden
representar
232=4294967296
valores:
Solo positivos (enteros sin signo): del 0 al 4294967295
Positivos y negativos (enteros con signo): del -2147483648
al 2147483647
Las típicas operaciones aritméticas: suma, resta, multiplicación y división se pueden realizar con datos de tipo entero. En el caso de la división, el resultado podría ser un valor real, en ese caso, si el resultado se ha de almacenar como entero la parte decimal del resultado deberá ser eliminada, en principio hay dos métodos para hacerlo:
El redondeo: Aproximar el valor real al entero más cercano
(Ej: 3,8-->4 / 3,2-->3)
El truncamiento: Eliminar del valor real la parte decimal (Ej:
3,8-->3 / 3,2-->3)
Real: El tipo de dato real es un tipo de dato en programas informáticos que representa la aproximación de un número real.
Al igual que los números enteros, el tipo real está limitado superior e inferiormente según la cantidad de memoria que haya disponible para almacenarlo. Otro elemento importante a tener en cuenta en este tipo de datos es la precisión con que se pueden representar números con decimales, cuantos decimales se pueden
representar.
Esta
característica
también
está
directamente relacionada con la cantidad de memoria disponible para almacenar un valor real.
Las típicas operaciones aritméticas:
Suma
Resta
Multiplicación
División
Estructuras Estáticas Estructuradas:
String: En programación, una cadena de caracteres, palabras, ristra de caracteres o frase (string, en inglés) es una secuencia ordenada (de longitud arbitraria, aunque finita) de elementos que pertenecen a un cierto lenguaje formal o alfabeto análogas a una fórmula o a una oración. En general, una cadena de caracteres es una sucesión de caracteres (letras, números u otros signos o símbolos). Si no se ponen restricciones al alfabeto, una cadena podrá estar formada por cualquier combinación finita de los caracteres disponibles (las letras de la 'a' a la 'z' y de la 'A' a la 'Z', los números del '0' al '9', el espacio en blanco ' ', símbolos diversos '!', '@', '%', etcétera).
En este mismo ámbito, se utilizan habitualmente como un tipo de dato predefinido, para palabras, frases o cualquier otra sucesión de caracteres. En este caso, se almacenan en un vector de datos, o matriz de datos de una sola fila (array, en inglés). Las cadenas se pueden almacenar de manera física:
seguidas;
enlazados letra a letra.
Generalmente los caracteres se guardan uno a continuación de otro para fines de eficiencia en el acceso.
Al considerar las cadenas como un tipo de datos, hay que definir cuáles son las operaciones que es posible hacer con ellas. En principio, podrían ser muchas y llegar a ser muy sofisticadas. Las siguientes son algunas de ellas:
Asignación: Consiste en asignar una cadena a otra.
Concatenación: Consiste en unir dos cadenas o más (o una
cadena con un carácter) para formar una cadena de mayor tamaño.
Búsqueda: Consiste en localizar dentro de una cadena una
subcadena más pequeña o un carácter.
Extracción: Se trata de sacar fuera de una cadena una
porción de la misma según su posición dentro de ella.
Comparación: Se utiliza para comparar dos cadenas.
Arreglo: Se le denomina vector, formación, matriz (en inglés array, del cual surge la mala traducción arreglo), a una zona de almacenamiento contiguo que contiene una serie de elementos del mismo tipo, los elementos de la matriz. Desde el punto de vista lógico una matriz se puede ver como un conjunto de elementos ordenados en fila (o filas y columnas si tuviera dos dimensiones).
En principio, se puede considerar que todas las matrices son de una dimensión, la dimensión principal, pero los elementos de dicha fila pueden ser a su vez matrices (un proceso que puede ser recursivo), lo que nos permite hablar de la existencia de matrices multidimensionales, aunque las más fáciles de imaginar son las de una, dos y tres dimensiones.
Estas estructuras de datos son adecuadas para situaciones en las que el acceso a los datos se realice de forma aleatoria e impredecible. Por el contrario, si los elementos pueden estar ordenados y se va a utilizar acceso secuencial sería más adecuado utilizar una lista, ya que esta estructura puede cambiar de tamaño fácilmente durante la ejecución de un programa, siendo esta última una estructura dinámica (al no tener un tamaño definido). Todo vector se compone de un determinado número de elementos, lo cual lo hace que sea una estructura estática. Cada
elemento es referenciado por la posición que ocupa dentro del vector. Dichas posiciones son llamadas índice y siempre son correlativos. Existen tres formas de indexar los elementos de una matriz:
Indexación base-cero (0): en este modo el primer elemento
del vector será la componente cero ('0') del mismo, es decir, tendrá el índice '0'. En consecuencia, si el vector tiene 'n' componentes, el último elemento tendrá como índice el valor 'n-1'. El lenguaje C y el lenguaje Java son un ejemplo típico que utiliza este modo de indexación.
Indexación base-uno (1): en esta forma de indexación, el
primer elemento de la matriz tiene el índice '1' y el último tiene el índice 'n' (para una matriz de 'n' componentes). Lua es un ejemplo de lenguaje que usa este tipo de indexación.
Indexación
base-n
(n):
este
es
un
modo versátil
de
indexación en la que el índice del primer elemento puede ser elegido libremente, en algunos lenguajes de programación se permite que los índices puedan ser negativos e incluso de cualquier tipo escalar (también cadenas de caracteres).
Registro: Un registro, en programación, es un tipo de dato estructurado formado por la unión de varios elementos bajo una misma estructura. Estos elementos pueden ser, o bien datos elementales (entero, real, carácter,...), o bien otras estructuras de datos. A cada uno de esos elementos se le llama campo.
Un registro se diferencia de un vector en que éste es una colección de datos iguales, es decir, todos del mismo tipo, mientras que en una estructura los elementos que la componen, aunque podrían serlo, no tiene por qué ser del mismo tipo.
Archivo: Un archivo es un fichero (dato) almacenado en algún recurso
de
memoria,
generalmente
en
Disco
Duro,
pero
dependiendo del uso (en ciertos casos) son almacenados en RAM.
Un Fichero tiene muchas funciones, en programación, estos almacenan códigos o parte de ellos (en ocasiones se divide el código en varios archivos). También es posible que se necesita almacenar datos que el usuario introduce ("Como sus datos, nombre de usuario y contraseña, etc.), estos se empaquetan en un archivo y podrán ser usados luego por el programa por ejemplo, cuando el usuario desee loguearse de nuevo.
Estructuras Dinámicas:
Pilas: Una pila (stack en inglés) es una lista ordenada o estructura de datos que permite almacenar y recuperar datos, siendo el modo de acceso a sus elementos de tipo LIFO (del inglés Last In, First Out, «último en entrar, primero en salir») . Esta estructura se aplica en multitud de supuestos en el área de informática debido a su simplicidad y capacidad de dar respuesta a numerosos procesos.
Para el manejo de los datos cuenta con dos operaciones básicas: apilar (push), que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado.
En cada momento solamente se tiene acceso a la parte superior de la pila, es decir, al último objeto apilado (denominado TOS, Top of Stack en inglés). La operación retirar permite la obtención de este elemento, que es retirado de la pila permitiendo el acceso al anterior (apilado con anterioridad), que pasa a ser el último, el nuevo TOS.
Las pilas suelen emplearse en los siguientes contextos:¿
Evaluación de expresiones en notación postfija (notación
polaca inversa).
Reconocedores sintácticos de lenguajes independientes del
contexto.
Implementación de recursividad.
En un sistema operativo cada proceso tiene un espacio de memoria (pila) para almacenar valores y llamadas a funciones.
Una pila acotada es una pila limitada a un tamaño máximo impuesto en su especificación.
Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobre una pila de platos, y una operación retirar equivaldría a retirarlo.
Habitualmente, junto a las dos operaciones básicas de apilar y desapilar (push, pop), las pilas puede implementar otra serie de funciones:
Crear (constructor): crea la pila vacía.
Tamaño (size): regresa el número de elementos de la pila.
Apilar (push): añade un elemento a la pila.
Desapilar (pop): lee y retira el elemento superior de la pila.
Leer último (top o peek): lee el elemento superior de la pila
sin retirarlo.
Vacía (empty): devuelve cierto si la pila está sin elementos
o falso en caso de que contenga alguno.
Una pila puede implementarse fácilmente ya sea mediante una matriz o una lista enlazada. Lo que identifica a una estructura de datos como una pila en cualquier caso no es su estructura sino su interfaz: al usuario solamente se le permite colocar y extraer datos en el modo que se espera de una pila y algunas otras operaciones auxiliares.
Colas: Una cola (también llamada fila) es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la
operación de extracción pull por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir.
Las colas se utilizan en sistemas informáticos, transportes y operaciones de investigación (entre otros), donde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas.
La particularidad de una estructura de datos de cola es el hecho de que solo podemos acceder al primer y al último elemento de la estructura. Así mismo, los elementos solo se pueden eliminar por el principio y solo se pueden añadir por el final de la cola.
Operaciones Básicas:
Crear: se crea la cola vacía.
Encolar: se añade un elemento a la cola. Se añade al final
de esta.
Desencolar: (sacar, salir, eliminar): se elimina el elemento
frontal de la cola, es decir, el primer elemento que entró.
Frente: (consultar, front): se devuelve el elemento frontal
de la cola, es decir, el primer elemento que entró.
Listas: Una lista es una colección de elementos homogéneos entre los que existe una relación lineal. 1. Cada elemento de la lista, a excepción del primero, tiene un único predecesor. 2. Cada elemento de la lista, a excepción del último, tiene un único sucesor.
Las listas no son arreglos (arrays), aunque ambos representan secuencias de elementos de un tipo, los arreglos tienen longitud fija; las listas, no; es decir, las listas son flexibles y permiten cambio de implementación. En una lista enlazada, cada elemento apunta al siguiente excepto el último que no tiene sucesor y el valor del enlace es null. Por ello los elementos son registros que contienen el dato a almacenar y un enlace al siguiente elemento. Los elementos de una lista, suelen recibir también el nombre de Nodos de la lista.
ESTRUCTURA DE DATOS FISICAS
Es el área donde el procesador puede acceder directamente. La responsabilidad de la gestión de dichas memorias cae sobre el sistema operativo. La memoria principal es la más rápida pero no es
tan
grande
como
para
mantener
guardado
todos
los
programas y los datos.
Clasificación de los dispositivos de almacenamiento
Velocidad de acceso a los datos
Coste por unidad de datos
Fiabilidad
pérdida de datos por fallo de alimentación o crash del
sistema
fallo físico del dispositivo de almacenamiento
Se puede diferenciar el almacenamiento:
almacenamiento volátil
almacenamiento no-volátil
Jerarquía de las Memorias
Almacenamiento primario: es el más rápido pero es volátil (caché, memoria principal) Almacenamiento secundario: Es no volátil, moderadamente rápido; también llamado almacenamiento en linea (memoria flash, discos magnéticos). Almacenamiento terciario: Es no-volátil, es lento; también llamado almacenamiento off-line (cinta magnética, almacenamiento óptico)
Discos Magnéticos Parámetros:
Capacidad: 10MB - 10GB Tasa de Transferencia: 1 - 5 MB/s Tiempo de Búsqueda (seek time): 2 - 30 ms Tiempo espera (latency): 4 - 8 ms Velocidades: 60 - 120 rpm (8-17ms) Tiempo medio entre fallos: 3 - 91 años
Estructura de un Disco Magnético
Optimización de Acceso a Disco Un bloque es una secuencia continua de sectores de una sola pista de un plato Algoritmos de planificación del brazo del disco: minimizar el movimiento del brazo (algoritmo del ascensor) Organización de los ficheros: se optimiza el tiempo de acceso organizando los bloques de acuerdo a cómo van a ser accedidos los datos.
Memoria intermedia de escritura no volátil: se escriben los bloques a una RAM no volátil intermedia; el controlador escribirá a disco cuando no tenga más peticiones pendientes. Disco de registro histórico: es un disco dedicado a escribir un registro histórico secuencial, eliminando así el tiempo de búsqueda. (Parecido al RAM no volátil)
En discos duros y otros soportes, la estructura lógica hace referencia a su sector de arranque, la tabla de asignación de ficheros (FAT), el directorio raíz y la zona de datos, de forma conceptual, sin hablar sobre cómo son físicamente almacenados los datos en el disco, ni específicamente qué datos se almacenan.
RAID
Redundant Arrays of Inexpensive Disks Originalmente, una alternativa más barata a los discos grandes y caros. Hoy en día los RAIDs son utilizados por su gran ancho de banda y su fiabilidad. De aquí que la “I” se intrerprete como independiente más que como inexpensive.
Mejora de la fiabilidad vía Redundancia Un sistema con 100 discos, cada uno con un TMEF de 100.000 h (aprox. 11 años) tendrá un TMEF del sistema de 1000 h (aprox. 41 días) Redundancia: almacena información extra que se puede utilizar para recuperar información perdida en un fallo del disco. P.Ej.: Mirroring (o shadowing) o duplica cada disco. Los discos lógicos consisten de 2 discos físicos o cada escritura se realiza en los dos discos o si uno de los 2 discos falla, los datos se encuentran o disponibles en el otro.
Niveles de RAID Se pueden mejorar las prestaciones introduciendo paralelismo. Consideraremos 4 discos de datos y los discos adicionales para la información redundante: o RAID de nivel 0 o RAID de nivel 1 o RAID de nivel 2 o RAID de nivel 3 o RAID de nivel 4 o RAID de nivel 5 o RAID de nivel 6
RAID 0 (No redundante): o Tiras a nivel de Bloque o No redundante o En aplicaciones de alta velocidad, donde no sea crítico la pérdida de datos.
RAID 1 (Con espejo): o Discos en espejo. o Buenas características en escritura o Populares para aplicaciones de almacenamiento de ficheros log.
RAID 2 (Redundante con código Hamming): Códigos de Correción de Errores Tipo Memoria (Memory Style ECC) RAID 3 (Bit de paridad intercalado): o Se utiliza un único bit de paridad; no-detección o Cuando se escriben los datos, se calcula el bit de paridad y se escribe. o Notable mejora de prestaciones en grandes trasferencias. o En un entorno a transacciones, el entorno sufre pues sólo se puede ejecutar una sola E/S a la vez
RAID 4 (Paridad en bloques): o Proporciona tasas de lectura de bloques independientes más altas que el nivel 3. o Sin embargo, el bloque de paridad es un cuello de botella para escrituras de bloques independientes.
RAID 5 (Paridad distribuida a nivel de bloques):
o o o
Datos y paridad distribuidos en los discos. Mejores niveles de transferencia de E/S que el nivel 4. Reemplaza en la práctica al nivel 4.
Disco Óptico
CD-ROM o Los discos son portátiles o Gran capacidad de almacenamiento (600MB) o Tiempos de búsqueda y latencia grandes; menores tasas de transferencia de datos que los discos magnéticos.
DVD (de 1.7 hasta 17 GB) WORM (Write-Once Read-Many) Discos Regrabables
Cinta Magnética Para grandes volúmenes da datos (5GB) El medio más barato de almacenamiento Normalmente se utiliza para back-up o para transferir información entre sistemas. Se utilizan robots de cintas (con varias) para grandes capacidades (desde terabytes hasta petabytes)
Estructura de Ficheros La base de datos se almacena como una colección de ficheros. Cada fichero es una secuencia de registros. Cada registro es una secuencia de campos.
Registros de Longitud Fija
Aproximación sencilla Los registros pueden ocupar dos bloques
Listas libres
Mejor aprovechamiento del espacio Cuidado con los punteros clavados
Registros de Longitud Variable Surgen de varias maneras en las BD: Almacenamiento de varios tipos de registros en un mismo archivo Tipos de registros que permiten longitudes variables para uno o para varios de los campos. Tipos de registro que permiten campos repetidos.
Registros de Longitud Variable: cadenas de bytes no resulta sencillo volver a utilizar el espacio no queda espacio para el aumento de tamaño de los registros.
RLV: Estructura de páginas con ranuras Se mantiene siempre compacto el espacio libre y el ocupado. Los punteros son indirectos, nunca fijos
Organización de los Registros en Archivos
Montículo: en cualquier sitio libre
Secuencial: de acuerdo al orden secuencial dado por el valor de una clave. Asociativa (hash): de acuerdo a la función hash de algún atributo. En agrupaciones: se pueden guardar en el mismo archivo registros de varias relaciones diferentes.