Source: http://docplayer.es/1120713-75-06-organizacion-de-datos.html
Timestamp: 2017-07-20 18:53:50+00:00

Document:
[75.06] Organización de Datos - PDF
[75.06] Organización de Datos
Download "[75.06] Organización de Datos"
Milagros Villalba Farías
1 [75.06] Organización de Datos María Inés Parnisari 3 de agosto de 2013 Índice I Sistemas de archivos 2 II Organización de archivos 24 III FTRS (Full Text Retrieval System) 49 IV Compresión 77 V Criptografía 80 12 Objetivo: cómo representar y almacenar datos en archivos para su resguardo, recuperación y transmisión de forma eciente y segura. Dato: representación de un objeto (cosa concreta o abstracta, o evento pasado o futuro) en una unidad lógica llamada registro, formado por campos que describen al objeto (los atributos). Archivo de datos: unidad lógica de almacenamiento permanente de registros, administrada por un sistema operativo. Dentro de un archivo los registros pueden agruparse en bloques o páginas. Diseño de datos: tiene dos etapas que son independientes del lenguaje de programación utilizado. 1. Diseño conceptual 1 : implica denir los atributos. Atributos: representan a un dato, y tienen un valor (que puede ser nulo). Cada atributo tiene una lista de valores permitidos (el dominio). Pueden ser: Simples. Edad Compuestos. Dirección Obligatorios. Nombre y apellido Opcionales Para cada atributo debe denirse: Monovalentes. Sexo Polivalentes. Teléfonos ID único. DNI ID externos. Código postal Identidad: el nombre. Estructura, en caso de que sean compuestos. Cardinalidad (? = opcional, * = ninguno o varios, + = uno o varios) Extensión 2. Diseño lógico: implica denir tipos o dominios para atributos, y la forma de almacenamiento y recuperación. a) Tipos de valores: int, float, char, char[], string, boolean, binary b) Forma de almacenamiento: registros de longitud ja o registros de longitud variable. Parte I Sistemas de archivos 2 Sistema operativo: responsable de manejar recursos físicos (hardware) y lógicos (carpetas y archivos). Provee una interfaz controlada entre ambos. Conceptos de sistemas operativos: Proceso: programa en ejecución. Tiene asignado un espacio de direcciones. El espacio de direcciones contiene el programa ejecutable, los datos del programa y su pila. Toda la información de cada proceso se almacena en una tabla de procesos. Varios procesos pueden ser instancias de un mismo programa. Un sistema que puede ejecutar varios procesos simultáneamente se denomina multitarea. En estos sistemas, la CPU le asigna un quantum de tiempo a cada proceso, y cuando este tiempo se acaba, se ejecuta otro proceso. 1 Bases de Datos: conceptos. Silberschatz. Capítulo 2. 2 Sistemas Operativos Modernos. Tanenbaum. Capítulo 4. 2 3 Figura 1: Multitasking. Espacio de direcciones: porción de la memoria principal que se le asigna a un proceso. Es un mecanismo de protección manejado por el sistema operativo y por el hardware. Archivos y directorios: los directorios agrupan archivos u otros directorios. La jerarquía de archivos tiene forma de árbol. Existe un directorio raíz, y el directorio actual. Funciones del sistema operativo: 1. Identicar y localizar archivos mediante jerarquía de directorios. 2. Permitir a usuarios o grupos de usuarios establecer permisos de acceso a archivos. 3. Asignar espacio en discos, administrando la ocupación y liberación de archivos. 4. Coordinar la relación entre uno o varios procesos en ejecución, y su deseo de acceder al mismo dispositivo de almacenamiento simultáneamente (concurrencia). 5. Coordinar la comunicación entre la CPU (que maneja tiempos electrónicos rápidos) y los dispositivos de almacenamiento (que maneja tiempos mecánicos lentos), mediante el uso de buers. Sistema de archivo: parte del sistema operativo que administra los archivos. Los sistemas de archivos se almacenan en disco. 1 Archivos Requerimientos para el almacenamiento de información a largo plazo: Debe ser posible almacenar mucha información. La información debe sobrevivir a la terminación del proceso que la utilice. Varios procesos deben ser capaces de acceder a la misma información concurrentemente. Archivo: unidad lógica de información creada por los procesos. Estructura de archivos: Secuencia de bytes: provee la mayor exibilidad. Secuencia de registros de longitud ja. Árbol: formado por registros que tienen un campo llave. Tipos de archivos según la función que cumplen: Archivos regulares: contienen información del usuario. Pueden ser ASCII o binarios. 34 Archivos especiales de caracteres: modelan dispositivos de E/S. Archivos especiales de bloques: modelan discos. Archivos especiales de red: para comunicar procesos. Directorios: mantienen la estructura del sistema de archivos. Tipos de archivos según los datos que contienen: 1. De datos maestros. Representan cosas reales. Ejemplo: un archivo de productos. 2. Transaccionales. Representan eventos. Ejemplo: un archivo con registros de ventas de productos. 3. De reporte: para presentarle a un usuario. Ejemplo:.pdf 4. De trabajo: resultados parciales de procesamiento. Ejemplo:.tmp 5. De control de datos: para almacenar metadatos o administrar el acceso a otros archivos. 6. De intercambio de datos: representan datos de forma estándar para trabajar más fácil entre varias aplicaciones. Ejemplo: XML. 7. De recursos de programa. Ejemplo: video, audio, imágenes De productos de programas. Ejemplo:.doc,.xls De empaquetado de archivos. Ejemplo:.tar,.rar,.zip... Posibles atributos de archivos: Atributos de protección: usuarios permitidos, contraseña, creador, propietario. Atributos bandera (binarios): sólo lectura, oculto, del sistema, de archivo, ascii/binario, de acceso aleatorio, temporal, de bloqueo. Atributos extras: longitud de registro, posición de la llave en el registro, longitud de la llave, hora de creación, hora de último acceso, hora de última modicación, tamaño actual, tamaño máximo. Operaciones posibles en un archivo: Create Open Read Seek Get attributes Rename Delete Close Write Append Set attributes Create crea un archivo sin datos y establece algunos atributos. Open lleva los atributos y la lista de direcciones de disco a memoria principal. Se debe especicar un modo de apertura. Close obliga a escribir el último bloque del archivo (ush). Read requiere tres parámetros: el le descriptor (entero que referencia al archivo), cuántos datos se necesitan leer, y dónde colocarlos (un buer). Rename evita tener que copiar el archivo en otro nuevo con el nuevo nombre. 45 2 Directorios Tipos de directorio: Directorios jerárquicos, son árboles con uno o más niveles. Directorio de un solo nivel, que puede simular un directorio jerárquico si a los archivos los nombramos como si fueran un directorio. Ejemplo: usr/ast/file. Nombres de rutas: Absoluto: ruta desde el directorio raíz al archivo. Relativa: se utiliza en conjunto con el directorio de trabajo. Operaciones posibles en un directorio: Create dir Open dir Read dir Link Rename Delete dir Close dir Unlink Link: llamada al sistema que permite a un archivo aparecer en más de un directorio. Hard link: relación bidireccional entre una ruta y un archivo. Dos rutas apuntan a la misma estructura que contiene metadatos sobre un archivo. En UNIX BSD: Al hacer un hard link, se incrementa el contador de hard links en el nodo-i del archivo. Todos los nodos-i tienen, al menos, 1 en su contador. Cuando se borra un hard link, el contador decrece. Cuando el contador llega a cero, el archivo se borra denitivamente. Soft link / symbolic link: relación unidireccional entre una ruta y un archivo. En UNIX BSD: La carpeta original (1) apunta al nodo-i del archivo X. El siguiente directorio (2) que quiera tener una referencia al archivo, crea un archivo que contiene la ruta del archivo original X. Si es borra el archivo X, la ruta (2) tiene un puntero inválido. Figura 2: Hard links y soft links. Los hard links no requieren espacio extra en el disco, y los soft links sí. Los soft links pueden apuntar a archivos en otras máquinas, en la misma red o por Internet. Los hard links solo pueden apuntar a archivos dentro de la misma partición. 56 3 Distribución del sistema de archivos Ejemplo: UNIX BSD. Figura 3: Distribución posible de un sistema de archivos 1. MBR (Master Boot Record): se utiliza para arrancar la computadora. 2. Tabla de particiones: proporciona las direcciones de inicio y n de cada partición. Proporciona el nombre de la partición activa. 3. Para cada partición: a) Boot block: contiene el módulo de arranque del sistema operativo de esa partición. b) Superblock: contiene todos los parámetros clave acerca del sistema de archivos. c) Administración del espacio libre: información acerca de los bloques libres, en forma de bitmap o una lista de punteros. d) Nodos-i: arreglo de estructuras de datos, uno por archivo, que indica todo acerca del archivo. La cantidad de nodos-i es ja, y se establece al crear la partición. e) Directorio raíz. f ) Todos los otros directorios y archivos. 4 Implementación de archivos Objetivo: mantener un registro acerca de qué bloques del disco van con cuál archivo. Formas: 1. Asignación contigua: almacenar cada archivo como una serie contigua de bloques de disco. Cada archivo comienza al inicio de un nuevo bloque, y puede desperdiciarse espacio en el último bloque de cada archivo. Ventajas: a) Es simple de implementar. Sólo hay que guardar, por cada archivo, la dirección de disco del primer bloque y la cantidad de bloques que ocupa. b) El rendimiento de lectura es excelente. El archivo completo se puede leer en una sola operación. Desventajas: 67 a) Con el tiempo, el disco se fragmenta. Cuando se quita un archivo quedan bloques libres, y no se pueden compactar en el momento. Solución posible: mantener una lista de bloques libres. Problema de esta solución: cuando se cree un archivo nuevo será necesario conocer su tamaño nal para poder elegir el hueco apropiado. 2. Asignación de lista enlazada: cada archivo es una lista enlazada de bloques de disco. La primera palabra del primer bloque del archivo se usa como puntero al próximo bloque, hasta llegar a un puntero inválido (n de archivo). Figura 4: Asignación de lista enlazada. Ventajas: a) No se produce fragmentación, porque cada bloque se puede aprovechar. b) La entrada del directorio se reduce a almacenar, para cada archivo, la dirección de disco del primer bloque. Desventajas: a) La lectura aleatoria es lenta. Para llegar al bloque n, se necesita leer los n 1 bloques anteriores. b) El puntero ocupa mucho espacio. 3. FAT / Asignación de lista enlazada utilizando una tabla en memoria: misma estructura anterior, pero los punteros de cada bloque del disco se almacenan en una tabla en memoria. Esta tabla contiene tantas entradas como bloques de disco haya. Cada entrada posee un puntero al bloque siguiente del archivo. Además se tiene un directorio que, para cada archivo, tiene el número del bloque inicial. 7 8 Figura 5: FAT. Ventajas: a) El bloque completo contiene datos. b) La lectura aleatoria es mucho más rápida, porque la lista enlazada está en memoria. Desventajas: a) Toda la tabla debe estar en la memoria todo el tiempo. Con un disco de 200 GB, se requiere una FAT que ocupa 600 MB en memoria. 4. Nodos-i: cada archivo y cada directorio tiene asociado una estructura de datos llamada nodo-i. Estos son registros de longitud ja con los siguientes campos 3 : a) Propietario y grupo del propietario, b) Tipo de archivo (regular, directorio, de caracteres, de red, de bloque) c) Permisos de acceso (9 bits), d) Fechas de acceso y modicación, e) Cantidad de registros del directorio que referencian al nodo-i (contador de hardlinks) f ) Tamaño del archivo en bytes, g) Lista de bloques de almacenamiento del archivo: 1) Bloques 0 a 9 contienen direcciones directas 2) Bloque 10 contiene dirección indirecta simple 3) Bloque 11 contiene dirección indirecta doble 4) Bloque 12 contiene dirección indirecta triple 3 El nombre del archivo NO es un campo del nodo-i. Se guarda en la entrada del directorio. 89 Figura 6: Nodo-i Cada vez que un archivo cambia, cambia su correspondiente nodo-i. Pero si el contenido del nodo-i cambia, no necesariamente cambiará el archivo también. La copia de un nodo-i a memoria contiene, además de los campos ya mencionados, los siguientes: Ventajas: Estado del nodo-i en memoria (bloqueado/desbloqueado, proceso esperando por el nodo-i, la copia en memoria es distinta a la que está en el disco por un cambio en el nodo-i, la copia en memoria es distinta a la que está en el disco por un cambio en los datos del archivo, el archivo es un punto de montaje), Número de dispositivo que contiene al archivo, Número de nodo-i, Punteros a otros nodos-i en memoria (el sistema encadena los nodos-i en memoria de igual forma que los buers de bloques), Contador que indica el número de instancias del archivo que están activas. Cuando este contador llega a 0, el nodo-i se libera y se lo agrega a la lista de nodos-i libres. a) El nodo-i necesita estar en memoria solo cuando está abierto el archivo. Si cada nodo-i ocupa n bytes, y el máximo de archivos abiertos es k, la memoria total ocupada por los nodos-i es nk bytes. Desventajas: a) El número del nodo-i es simplemente un índice a un sector del disco que contiene al nodo-i en sí. Por lo tanto, hay una cantidad ja de nodos-i posibles. 5 Implementación de directorios 9 10 Implementación de archivos mediante... Entrada de directorio debe contener... Asignación contigua Nombre de archivo + Dirección de disco del primer bloque + Cantidad de bloques que ocupa el archivo Asignación de lista enlazada (en disco y en memoria) Nombre de archivo + Dirección de disco del primer bloque Nodos-i Nombre de archivo + Número del nodo-i del archivo. El directorio raíz suele ser el nodo-i 0. Para leer un archivo... 6 Asignación de espacio en disco El disco se divide en bloques. Cada archivo puede ocupar uno o más bloques. Hay que tomar ciertas decisiones: 1. ¾Bloques contiguos o no? Si son contiguos se genera fragmentación externa, aunque la lectura es más veloz. 2. ¾Tamaño del bloque? Si son muy grandes, perdemos espacio por fragmentación interna. Si son muy chicos, perdemos tiempo al buscar cada bloque. En general se eligen bloques desde 1 KB hasta 4 KB. 3. ¾Cómo registramos los bloques libres? a) Lista enlazada de bloques libres, donde cada bloque contiene tantos números de bloques de disco libres como pueda. Ejemplo: un bloque de disco de 1 KB puede contener 256 números de bloque de disco de 32 bits. b) Lista enlazada de bloques libres contiguos, donde cada bloque contiene un número de bloque libre + la cantidad de bloques libres que le siguen a ese. c) Mapa de bits de bloques libres. Un 1 representa bloque libre, un 0 representa bloque ocupado. El mapa de bits requiere menos espacio excepto cuando hay pocos bloques libres. 4. ¾Como aseguramos la consistencia del sistema de archivos? Se pueden realizar dos tipos de vericaciones de consistencia: a) Consistencia de bloques: se crean dos tablas, con una entrada por cada bloque de disco. Una tabla contiene los bloques en uso (hay que recorrer todos los nodos-i), la otra tabla contiene los bloques libres (hay que recorrer todo el mapa de bits o la lista enlazada de bloques libres). Si el sistema de archivos es consistente, cada bloque tendrá un 1 en la primera tabla o en la segunda. Si no es consistente, puede deberse a varios motivos: Bloque faltante (contador 0 en ambas tablas): no está en uso ni libre. Solución: marcarlo como libre. Bloque doblemente libre (contador 2 en tabla de libres). Solución: reconstruir la lista de bloques libres. 1011 Bloque doblemente ocupado (contador 2 en tabla de ocupados). Solución: copiar el bloque en otro, e insertar la copia en uno de los archivos. Es muy probable que uno de los archivos termine con basura, así que se lo debe reportar al usuario. b) Consistencia de directorios: se crea una tabla de contadores por archivo. Se inspecciona cada directorio, aumentando el contador cada vez que aparece el archivo. (Los hard links cuentan pero los soft links no). Cuando el vericador termina, la tabla está indexada por número de nodo-i. Después se comparan estos contadores con las cuentas de vínculos almacenadas en los mismos nodos-i. Si el sistema de archivos es consistente, ambas cuentas concordarán. Si no es consistente, puede deberse a dos motivos: Cuenta de vínculos del nodo-i > valor en tabla: reestablecer valor en el nodo-i. Cuenta de vínculos del nodo-i < valor en tabla: reestablecer valor en el nodo-i. 7 Concurrencia Los pedidos de acceso al disco se especican mediante el número de bloque que se necesita, y los niveles más bajos del sistema de archivos se encargan de convertir este número en cilindro, cara, sector. El algoritmo del ascensor es un técnica de optimización de los accesos al disco que consiste en reducir los movimientos de cambio de pista. Su nombre se deriva del comportamiento de un ascensor: mientras está ocupado, el ascensor viaja en una sola dirección (arriba o abajo); solo se detiene para dejar gente afuera o recoger nuevas personas. Funcionamiento: 1. Si el disco está desocupado y si hay una petición de lectura o escritura: a) El brazo del disco se mueve hacia dentro o hacia afuera, hacia el cilindro buscado. b) Si llega otra petición: 1) Si el nuevo cilindro buscado se encuentra en la dirección a la que viaja el brazo del disco, se lo lee / escribe. 2) Si no, se espera a que el brazo llegue al borde del plato, se le invierte la dirección, y se procede con la petición. 8 Optimización de rendimiento: buers y cachés 4 Buer: sección de la memoria principal disponible para almacenar copias de bloques del disco, que luego se escribirán en él. Esta sección puede no ser suciente para almacenar todos los bloques de un archivo, por lo que se necesita administrar el buer. Es muy común que el sistema utilice varios buers para realizar la E/S de un programa (al menos dos: uno para la lectura, y otro para la escritura). Multiple buering: procedimiento mediante el cual dos buers intercambian sus roles luego de una tarea de lectura o escritura. Esto permite al sistema operativo trabajar con un buer mientras el otro se está cargando del disco o vaciando hacia el disco. Reemplazo de buers: cuando se necesita una parte de buer y no hay lugar, hay varias técnicas para mandar bloques al disco y hacer lugar: LRU (Least Recently Used) para mandar el bloque que se utilizó primero al disco. MRU (Most Recently Used) para mandar el bloque que se utilizó último al disco. 4 Bases de Datos: Conceptos. Silberschatz. Capítulo 11, sección 4 y 5. 11 12 Bloques sujetados (pinned blocks): son bloques que están en el buer y que no tienen permitido escribirse en el disco. El acceso al disco es un millón de veces más lento que a la memoria. Por ello, existen optimizaciones para mejorar el rendimiento: 1. Uso de caché Buer caché 5 : estructura de software cuyo objetivo es minimizar los accesos a disco. Agrupa una colección de bloques que se leyeron del disco y se mantienen en memoria. El sistema de buers de UNIX consta de dos partes: a) Secuencia de tamaño jo de bloques de memoria (los buers). La cantidad de buers es limitada y se especica al inicializar el sistema. Un buer se corresponde con uno y solo un bloque de disco. El tamaño del buer no puede ser menor al tamaño de un bloque de disco. b) Secuencia de encabezados de buers (buer headers) que identican a cada buer. Contienen: 1) Número lógico de dispositivo 6 2) Número de bloque en disco 3) Banderas: bloqueado/desbloqueado, datos válidos/inválidos, escribiendo/leyendo, otro proceso está esperando por este buer, escritura diferida (el buer contiene datos válidos que aún no fueron escritos en el disco) 4) Puntero al buer en sí 5) Puntero a los buers anterior y siguiente en la cola de dispersión 6) Puntero a los buers libres anterior y siguiente en la lista de buers libres (a) Buer caché (b) Lista de buers libres Figura 7: Buer cache Los buer headers siempre están en alguna cola de dispersión, y pueden o no estar en la lista de buers libres. 5 The Design of the UNIX Operating System. Capítulo 3. 6 El número físico del disco lo calcula la controladora del disco. 1213 Los buers libres se almacenan mediante una lista circular doblemente enlazada de buer headers. Esta lista preserva el orden de LRU. Cuando se necesita un buer, se lo saca del principio de la lista (o del medio, si se necesitaba un buer especíco). Cuando se agrega un buer libre, se lo agrega al nal de la lista. Los buers en uso se dividen en varias colas de dispersión (parámetro congurable), que pemiten que la búsqueda de un buer en particular sea rápida. Cada cola es una lista doblemente enlazada de buer headers. Cuando el kernel necesita un buer, lo pone en una y solo una de las colas de dispersión, mediante la aplicación de una función de hash. Cuando el kernel usa un buer, lo marca como bloqueado, y si no está en uso, lo desbloquea. Cuando se desbloquean, se los coloca en la lista de buers libres (si tiene datos válidos, al nal de la cola, y sino, al principio), pero no se los saca de las colas de dispersión. Algoritmo 1 Algoritmo brelse para liberar un buer 1 salida: ninguna 2 { 3 despertar todos los procesos que quieren un buffer libre 4 despertar todos los procesos que querian este buffer 5 bloquear interrupciones 6 si (buffer tiene datos validos y buffer no es viejo) 7 agregar buffer al final de la lista de buffers libres 8 si no: 9 agregar buffer al principio de la lista de buffers libres 10 permitir interrupciones 11 desbloquear(buffer) 12 } Algoritmo 2 Algoritmo bread para leer un bloque 1 salida: buffer que contiene datos 2 { 3 obtener buffer del bloque (algoritmo getblk) 4 si (buffer tiene datos validos) 5 devolver buffer 6 iniciar lectura de disco a buffer 7 sleep (evento: lectura finalizada) 8 devolver buffer 9 } 1314 Algoritmo 3 Algoritmo getblk para obtener un bloque 1 salida: buffer bloqueado que se puede usar para manejar un bloque de disco 2 { 3 buffer no encontrado = true 4 mientras (buffer no encontrado) 5 { 6 cola de dispersion = cola((num Dispositivo * num Bloque) mod cant Colas) 7 si (bloque en cola de dispersion) 8 { 9 bloquear interrupciones 10 si (buffer bloqueado) 11 { 12 marcar el buffer con "hay un proceso esperando" 13 sleep (evento: buffer desbloqueado) 14 continuar 15 } 16 marcar el buffer como "bloqueado" 17 permitir interrupciones 18 remover el buffer de la lista de libres 19 devolver buffer 20 } 21 si no 22 { 23 si (no hay buffers en la lista de libres) 24 { 25 sleep (evento: se libera algun buffer) 26 continuar 27 } 28 remover primer buffer de la lista de libres 29 si (buffer marcado como "escritura diferida") 30 { 31 remover buffer de la lista de libres 32 marcar buffer como "escribiendo" 33 escribir el buffer al disco asincronicamente 34 // asinc = el kernel NO espera que la escritura termine 35 continuar 36 } 37 remover buffer de la vieja cola de dispersion 38 insertar buffer a la nueva cola de dispersion 39 devolver buffer 40 } 41 } 42 } Algoritmo 4 Algoritmo bwrite para escribir un bloque de disco 1 salida: ninguna 2 { 3 iniciar escritura a disco 4 si (I/O sincronica) 5 sleep (evento: escritura completa) 6 liberar buffer (algoritmo brelse) 7 si (buffer marcado como "escritura diferida") 8 marcar el buffer para ponerlo al principio de la lista de libres 9 } 1415 Ventajas Acceso uniforme al disco. El coódigo es más prolijo. No hay restricciones de alineación de bytes. Reduccion de accesos al disco. Algoritmo getblk previene corrupción de datos. Desventajas El sistema es vulnerable a caidas; lo que se escribió en el buer pero no en el disco se pierde. La copia de datos muy grandes es más lenta, porque se realiza dos veces (del proceso al kernel y del kernel al disco). 2. Lectura adelantada de bloque Tratar de colocar bloques en la caché antes de que se necesiten. Si se necesita el bloque k, se planica una lectura asincrónica al bloque k + 1. Esta estrategia es más rápida para los archivos que se leen en forma secuencial. 3. Reducción del movimiento del brazo del disco Al asignar bloques al disco, se intenta ponerlos de forma consecutiva (y en el mismo cilindro), utilizando el bitmap de bloques libres como referencia. También la colocación de los nodos-i se puede optimizar, poniéndolos todos al principio del disco, o todos en el medio, o distribuidos en grupos de cilindros junto con la lista de bloques libres y los bloques. 9 Ejemplos de sistemas de archivos 9.1 Linux: ext2 Estructura del sistema de archivos: Linux admite varias docenas de sistemas de archivos mediante la capa Virtual File System (VFS). VFS oculta de los procesos y las aplicaciones de nivel superior las diferencias entre muchos tipos de sistemas de archivos que Linux acepta. VFS dene un conjunto de abstracciones básicas del sistema de archivos y las operaciones que se permiten en estas abstracciones. VFS acepta sistemas de archivos con cuatro estructuras principales: Superbloque Dentry Nodo-i Archivo Contiene información sobre el sistema de archivos. Representa una entrada de directorio. Se crea mediante el sistema de archivos al instante. Cada nodo-i describe un archivo, directorio o dispositivo. Representación en memoria de un archivo abierto. Nombres de archivos de 255 caracteres. Archivo: consiste en una secuencia de 0 o más bytes. No se distingue entre archivos ASCII o binarios, o cualquier otro tipo. Es un sistema de archivos jerárquico. Sistema de archivos ext2: Estructura: 1516 Figura 8: Sistema de archivos ext2. Seguridad: Superblock: contiene la cantidad de nodos-i, la cantidad de bloques de disco, y el principio de la lista de bloques libres. Descriptor de grupo: contiene la localización de los bitmaps, la cantidad de bloques y nodos-i libres, y la cantidad de directorios. Bitmap de bloques, de 1 KB. Bitmap de nodos-i, de 1 KB. Nodos-i, de 128 bytes cada uno. Bloques de datos. Una entrada de directorio contiene: Número de nodo-i, Tamaño de la entrada, Tipo de entrada (archivo, directorio, dispositivo), Longitud del nombre del archivo, Nombre el archivo. Cada proceso tiene su propia le descriptor table (tabla descriptora de procesos). El sistema tiene una única open le descriptor table. Cada usuario tiene un User ID (UID), un número entero desde 1 a El usuario con UID 0 es el root (supervisor). Los usuarios se pueden organizar en grupos. Cada grupo tiene su propio Group ID (GID). Cada proceso lleva el UID y el GID de su dueño. Los permisos de los archivos se heredan del proceso que los creó. Cada archivo tiene 9 bits de seguridad: 3 bits rwx (r=read, w=write, x=execute) para el dueño, 3 bits rwx para el grupo del dueño, y 3 bits rwx para el resto. Los directorios son archivos, y por lo tanto también tienen 9 bits de seguridad, pero el bit x se reere al permiso de búsqueda. 9.2 Linux: ext3 Es el mismo que ext2 pero incorpora la funcionalidad de journaling, por lo que ext3 es más lento que ext2. 1617 9.3 UNIX: BSD (Berkeley Software Distribution) Figura 9: UNIX File System Estructura del sistema de archivos: Los registros de directorio son de longitud variable. Cada uno contiene: Nombre del archivo o subdirectorio, Número de nodo-i del archivo o subdirectorio. El volumen se organiza en bloques (en general de 4 KB cada uno), pero para minimizar la fragmentación interna, el sistema maneja fragmentos de bloque que deben tener de tamaño submúltiplo del tamaño de bloque (por ejemplo, de 1 KB). Los fragmentos de bloque se utilizan para asignárselos a bloques nales de archivos. Entonces, un bloque puede tener fragmentos de distintos archivos, pero un archivo no puede tener sus fragmentos en distintos bloques. Un volumen se compone de varias secciones: 1. Boot block: contiene el módulo de arranque del sistema operativo de esa partición. 2. Superblock: contiene todos los parámetros clave acerca del sistema de archivos. Se encuentra replicado en distintas partes del sistema, para asegurar su integridad. Contiene: a) Tamaño del sistema de archivos, b) Tamaño de los bloques, c) Bitmap para para control de fragmentos de bloque libres d) Cantidad de nodos-i libres, e) Lista de nodos-i libres, f ) Puntero al primer nodo-i libre, g) Campos para bloquear los mapas de bloques y la lista de nodos-i libres, h) Campo que indica que el superblock ha sido modicado. 3. Inode list: lista de nodos-i del sistema de archivo. El tamaño de esta lista debe ser especicado por el administrador al congurar el sistema. 4. Data blocks. Un block de datos puede pertenecer a uno y solo un archivo. Los datos se dividen en áreas conformadas por cilindros adyacentes. Cada área tiene su superblock propio, para aumentar la seguridad. Cada grupo de cilindros tiene su propia lista de nodos-i. La política de asignación de espacio procura que los archivos queden localizados en una misma área. El sistema trata de ubicar los nodos-i de un directorio en una misma área. 1718 Cada proceso tiene su propia user le descriptor table. El sistema tiene una única le table. Cuando un proceso abre o crea un archivo, el kernel devuelve un le descriptor que es un índice a la user le descriptor table de ese proceso. User le descriptor table: para cada archivo abierto por el proceso, contiene un puntero a la le table correspondiente a ese archivo. File table: estructura global del kernel, que para cada archivo abierto, contiene el desplazamiento en bytes en el archivo donde comenzará la próxima lectura o escritura. Inode table: Figura 10: Relación entre las tablas Cuando se llama a una system call 7 que involucra un le descriptor, el le descriptor se utiliza como un índice a la le descriptor table para localizar el puntero a la open le descriptor table y a su vez al nodo-i correspondiente al archivo. 9.4 Microsoft: DOS (Disk Operating System) Estructura del sistema de archivos: Los directorios son archivos cuyos registros contienen datos sobre los archivos del directorio, y localización del archivo en el disco: 8 bytes para el nombre del archivo + estado del archivo (nunca usado, borrado) 7 System call: función que le pide un servicio al kernel del sistema operativo. 1819 3 bytes para la extensión del nombre del archivo 1 byte para los atributos del archivo (normal, sólo lectura, oculto, de sistema, subdirectorio, modi- cado) 10 bytes reservados 2 bytes para la hora en que el archivo fue creado o actualizado 2 bytes para la fecha en que el archivo fue creado o actualizado 2 bytes para el bloque inicial del archivo en el disco 4 bytes para el tamaño del archivo en bytes Seguridad: no tiene mecanismos de seguridad más que la opción de ocultar archivos mediante el atributo correspondiente. Asignación de espacio en dispositivos de almacenamiento: 1. Boot record: contiene instrucciones para ayudar al sistema a cargar del disco a memoria programas para controlar la E/S de datos y para interpretar comandos. También contiene: nombre del fabricante, versión del sistema, cantidad de bytes por sector, cantidad de sectores por clúster, sectores reservados, sectores por pista, número de cabezas de lectoescritura. 2. FAT: contiene una entrada de 16 o 32 bits por cada clúster del disco. El registro de directorio de un archivo provee el clúster donde comienza el archivo, y la entrada de la FAT provee el número del siguiente clúster. a) Valor 0: clúster libre, b) Valor : clúster dañado c) Valores y : n de archivo. 3. Sectores del directorio raíz: el directorio raíz tiene capacidad limitada. 4. Resto de los directorios 9.5 Microsoft: NTFS (New Technology File System) Estructura del sistema de archivos: Es un sistema de archivos jerárquico que se desarrolló especícamente para la versión Windows NT. Utiliza direcciones de disco de 64 bits, y por lo tanto acepta particiones de hasta 16 exabytes. Archivo: consiste en varios atributos, y cada uno se representa mediante un ujo de bytes. Atributos residentes, se almacenan en la MTF Atributos no residentes Hay soporte para hard links, pero sólo se pueden aplicar a archivos del mismo volumen dado que al registro del archivo en la MFT se le agrega otro registro. Además, si se le cambia el tamaño o los atributos a un archivo, las entradas de los demás links pueden no ser actualizadas hasta que se abran. Hay soporte para soft links. Cada volumen se organiza como una secuencia lineal de clústeres (conjuntos de sectores) de tamaño jo (por lo general, 4 KB). Los fragmentos son conjuntos contiguos de clusters, y están especicados por: Virtual Cluster Number (VCN): número de cluster relativo respecto del archivo. Logical Cluster Number (LCN): número real de cluster lógico respecto del disco. 19 20 Cantidad de clusteres contiguos a partir de LCN. Master File Table (MFT): principal estructura de datos de cada volumen. Es un archivo extensible hasta 2 48 registros. Es una secuencia lineal de registros de 1 KB cada uno. Cada registro consiste en un encabezado de registro (número mágico para comprobar la validez del archivo, puntero al primer atributo, puntero al primer byte de espacio libre en el registro, número de registro base del archivo) más una secuencia de pares <encabezado de atributo (denición del atributo, longitud del valor), valor del atributo>. Figura 11: Ejemplo de registro de la MFT. Cada registro describe a un archivo o un directorio: Atributos del archivo. Figura 12: Atributos de un registro de la MFT. 20 21 Lista de direcciones de disco donde se encuentran sus bloques. Los directorios chicos son registros con varias entradas de directorios, cada una de las cuales describe a un archivo o directorio. Los directorios grandes utilizan árboles B+ para listar archivos, facilitando la búsqueda alfabética y la inserción. Si el archivo ocupa muchos bloques en disco, el primer registro de la MFT (registro base) de ese archivo apunta a los otros registros de la MFT del mismo archivo. Como es un archivo, se lo puede colocar en cualquier parte del disco. Un bitmap lleva el registro de las entradas libres en la MFT. Los primeros 16 registros de la MFT se reservan para describir los archivos de metadatos de NTFS. Figura 13: MFT de NTFS. Seguridad: NTFS proporciona compresión transparente de archivos. NTFS cuenta con una opción para cifrar directorios (y todos los archivos que hay en él). NTFS utiliza un diario de cambios (journal): es el archivo de metadatos $LogFile. Este archivo registra, cada 5 segundos, los cambios que se producen en todas las estructuras de disco, y si se completan con éxito, se elimina el registro correspondiente. Este archivo tiene dos tipos de registros: UNDO: para deshacer acciones que no se pudieron completar. REDO: para rehacer acciones que no se pudieron completar. Cada usuario y grupo se identica mediante un SID (Security ID). Cada SID es único en el mundo. Cuando un usuario comienza un proceso, el proceso y sus hilos corren bajo el SID del usuario. Cada proceso tiene un token de acceso, que indica quién es el propietario del proceso y qué valores y poderes están asociados con él. Cada objeto tiene asociado en la MFT un descriptor de seguridad, que indica quién puede realizar operaciones sobre él. 2122 Encabezado SID del propietario SID del grupo DACL (Discretionary Access List) SACL (System Access Control List) Especica quién puede usar el objeto. Contiene una o más ACL (Access Control Entries), y cada una de ellas tiene: un SID, un elemento binario (permitir/denegar), y un mapa de bits que indica qué tipo de operaciones tiene permitidas ese SID (execute, read, write, delete, write DAC, write owner ). Especica qué operaciones en el objeto se registran en el registro de eventos de seguridad del sistema. Contiene una o más ACL (Access Control Entries), y cada una de ellas tiene: un SID, un elemento (auditar), y un mapa de bits que indica qué tipo de operaciones se registrarán (execute, read, write, delete, write DAC, write owner ). Cuadro 1: Descriptor de seguridad. 9.6 IBM OS/2: HPFS (High Performance File System) Estructura del distema de archivos: File Node (FNODE): registros de especicación de archivos y directorios. Figura 14: FNODE. Longitud del nombre del archivo Primeros 15 caracteres del nombre del archivo Puntero al directorio que contiene este archivo (LSN - Logical Sector Number) Información de control Historia de accesos Atributos extendidos Listas de control de acceso 2223 Punteros al archivo o puntero al bloque del directorio raíz: hasta ocho punteros a fragmentos de archivo de hasta 16 MB cada uno. Cada puntero emplea 32 bits para la dirección inicial de cada fragmento y otros 32 bits para la cantidad de sectores contiguos de fragmentos. Si el archivo es muy grande y ocho punteros no son sucientes, se forma una estructura de árbol donde en lugar de guardar punteros se guardan punteros a allocation nodes (alnodes), con capacidad para 40 punteros a fragmentos cada uno. Directorios formados por uno o más bloques de directorio de 2 kb. Cada entrada de directorio contiene: longitud de entrada, fechas, longitud del nombre del archivo o subdirectorio, nombre del archivo o subdirectorio, puntero al FNODE (contiene información del archivo u otro puntero), puntero al bloque de directorio sucesor. Si un directorio es muy grande para ser descrito en un bloque, se le asignan más bloques y se organiza como un árbol B. Directorios ordenados alfabéticamente. Estructura del volumen: Figura 15: HPFS. Seguridad: Boot block (sectores 0 a 15), volume ID, bootstrap. Super block (puntero al FNODE del directorio raíz) Spare block (tabla de hotxes + Bloque de Directorio Vacío) Bandas. Las bandas miden 8 MB. Entre cada banda hay un bitmap de 8 KB de sectores libre. Una de las bandas es la de bloques de directorio. Los FNODES contienen listas de control de acceso. 2324 Parte II Organización de archivos 10 Archivos planos - streams En C/C++ hay dos formas posibles de manejar un archivo: utilizando rutinas de biblioteca, incluídas en stdio.h, o utilizando system calls. Utilizando rutinas La entrada/salida se realiza en registros. Primitivas para el manejo de archivos: Apertura Lectura Escritura Posicionamiento Cierre Utilizando rutinas FILE* fopen (char* nombrearchivo, char* modoapertura); unsigned int fread (void* bufferdestino, unsigned tamreg, unsigned cantidadregs, FILE* punteroalarchivo); unsigned int fwrite (void* bufferfuente, unsigned tamreg, unsigned cantidadregs, FILE* punteroalarchivo); int fseek (FILE* punteroalarchivo, long offset, int origen); int fclose (FILE* punteroalarchivo); Utilizando system calls La entrada/salida se realiza en bytes. Utilizando system calls int open (char* nombrearchivo, int flag_apertura [,int permisos]) int read (int filedescriptor, void* bufferdestino, unsigned cantidadbytes); int write (int filedescriptor, void* bufferfuente, unsigned cantidadbytes); int lseek (int filedescriptor, long offset, int origen); int close (int filedescriptor); 11 Medios de almacenamiento físicos 24 25 Nombre Descripción Costo $ Capacidad ¾Es volátil? Velocidad de transferencia Caché Manejado por hardware. Muy caro Muy poca Sí Muy alta Memoria Caro Poca Sí Muy alta (20 principal segundos) Memoria ash Discos magnéticos Discos ópticos Cintas Desde varios megabytes a varios gigabytes. Permite acceso aleatorio. Compuestos por celdas de un byte cada una. Para sobreescribir memoria, hay que borrar todo. Soporta un numero limitado de ciclos de borrado. Cintas magnéticas, discos duros, diskettes. Cada plato del disco está dividido en pistas, que son conjuntos de sectores. El conjunto de todas las pistas i de todos los platos conforman el cilindro i. Un bloque es un conjunto de sectores. CD (700 MB), DVD (4,7 GB), BluRay (25 GB) Se usa para crear copias de respaldo. Solo permite acceso secuencial. Caro Poca No Alta Barato Grande No Baja (58 días) Barato Grande No Baja Muy barato Cuadro 2: Tipos de almacenamiento. Grandísima No Muy baja Figura 16: Disco magnético. 12 Organización de archivos Historia: 1. Archivos secuenciales, uso de cintas magnéticas a) Mucho tiempo para hacer un seek! 2526 2. Índices que tenían una clave y el oset al archivo secuencial a) El índice podía ser muy grande! 3. Árboles n-arios para almacenar el índice a) Podían desbalancearse fácilmente = Mucho tiempo para hacer un seek! 4. Árboles n-arios balanceados (AVL) a) Aún requerían muchos accesos a disco! 5. Árboles B a) Los archivos no se pueden acceder de forma secuencial! 6. Árbol B+ a) Aún requerían varios accesos a disco! 7. Hashing (tablas de dispersión) a) El archivo no debe crecer de tamaño demasiado! 8. Hashing extensible Objetivo: cómo organizar datos en archivos para optimizar la eciencia en almacenamiento en disco, recuperación de disco y resguardo de los datos. Lo ideal es 1 acceso a disco, o la cantidad mínima que se pueda, para obtener toda la información que necesitamos en una sola lectura. ¾Dónde almacenar nuevos registros? ¾Cómo encontrar registros para borrarlos, modicarlos, o recuperarlos? Archivo: colección de registros formados por campos, que se mapean a bloques del disco. El tamaño de los bloques es jo y es determinado por el sistema operativo, pero el tamaño de los registros puede variar. Fragmentación interna: espacio perdido dentro de un registro, generalmente al nal. Fragmentación externa: espacio perdido entre registros. 13 Estructura de campos ¾Cómo representar campos de manera que no pierdan su identidad? Campos de longitud limitada Pierdo espacio Puedo no estar contemplando valores muy grandes Campos comienzan con su longitud en bytes El tamaño del campo que representa la longitud del campo debe elegirse con cuidado! Con 1 campo de 1 byte podemos decir, como máximo, registro de 256 bytes a continuación. Campos separados por un delimitador El delimitador tiene que ser elegido con cuidado! Campos identicados por el par clave, valor 2627 14 Estructura de registros Registros de longitud ja: producen fragmentación interna. 1. ¾Cómo borramos un registro y luego reclamamos el espacio? a) Estático: marcar el registro como borrado. Luego de que se borraron sucientes registros, se realiza una reconstrucción del archivo, eliminando los registros vacíos. 1) Ventaja: borrar un registro es rápido. 2) Desventaja: reorganizar el archivo es lento. Para insertar un registro nuevo, se busca secuencialmente hasta encontrar un registro borrado. b) Dinámico: usar una lista enlazada de registros libres. Le agregamos un le header al archivo que apunte al primer registro libre, el cual apunta al segundo registro libre, y así sucesivamente. Para borrar un registro: copiamos lo que dice el le header al registro. Y en el le header ponemos el número de registro que queremos borrar. Para insertar un registro: mantenemos una copia del número de registro apuntado por el registro apuntado por el le header. En el registro apuntado por el le header copiamos el registro. En el le header ponemos la copia de antes. Estructura de archivo necesaria: 1) File header: número del primer registro libre, -1 si no hay libres. 2) Para cada registro: a Bit bandera (libre/ocupado) b Datos. Si está libre: puntero a próximo registro libre. 2. ¾Como nos aseguramos que un registro requiera solo un acceso a disco? Hay que asegurarse de que el tamaño del bloque sea un múltiplo del tamaño del registro. Registros de longitud variable: producen fragmentación externa. ¾Cómo los implementamos? 1. Usar delimitadores que marquen el n de un registro. 2. Agregar el tamaño del registro al comienzo del mismo. 3. Usando registros de longitud ja. Si hay un tamaño máximo de registro que nunca se sobrepasa, usamos registros de ese tamaño para albergar registros de longitud variable. Problema: desperdicia mucho espacio. Un registro de longitud variable (RV) es representado por una lista enlazada de registros de longitud ja (RF). Problema: El primer RF del RV no desperdicia espacio, pero el resto sí (porque solo almacenan la información que no cabe en el primer RF). Solución: usar bloques ancla que contienen el primer RF, y usar bloques de overow que contienen la continuación de la lista. 4. Si los registros tienen una clave, usando un índice. El índice posee la clave primaria de cada registro, ordenados alfabéticamente para poder hacer búsquedas binarias. Para cada clave se guarda el oset al archivo de datos. El archivo de datos posee un encabezado que guarda el oset al primer registro libre. Luego, para cada registro de longitud variable, se guarda: La longitud de ese registro (para saber cuánto ocupa) Un bit bandera libre/ocupado (para poder borrar un registro) 2728 La cantidad de bytes libres del registro (en una modicación de un registro, puede que el nuevo registro sea más pequeño que el viejo; también se utiliza para encadenar registros libres) Datos Algoritmo de borrado: buscar el registro en el índice, buscar el registro en el archivo de datos, marcarlo como libre. Si el registro anterior o el siguiente están libres también, fundirlos en un solo registro libre. Borrar la clave del índice. Algoritmo de agregado: Si hay registros libres, seleccionar uno 8 y guardar el registro ahí, y actualizar la lista de registros libres. Si no hay registros libres, agregarlo al nal del archivo. 15 Modos de acceso a archivos Secuencial: los registros se acceden en orden, empezando por el principio, sin poder saltearse ninguno ni volver atrás. Formas de organización recomendadas si se preere este modo de acceso: Organización secuencial (tira de bytes) Organización balanceada secuencial (árbol B+ o B#) Organización secuencial indexada (archivo secuencial + índice) Relativo: los registros se acceden con posicionamiento. Formas de organización recomendadas si se preere este modo de acceso: Organización balanceada no secuencial (árbol B o B*) Organización directa (mediante hashing) Organización indexada 15.1 Modos de búsqueda Sea n la cantidad de registros de un archivo. Búsqueda secuencial: O(n) Búsqueda secuencial por bloques: O(n) Búsqueda directa: O(1) Búsqueda binaria: O (log 2 n). El archivo debe estar ordenado. 16 Archivos secuenciales Algoritmo 5 Primitivas de la organización secuencial 1 int S_OPEN (const char* nombrearchivo, int modoapertura); 2 int S_CLOSE (int filehandler); 3 int S_READ (int filehandler, void* regdestino); 4 int S_WRITE (int filehandler, const void* regfuente, unsigned long cantbytes); 5 int S_DESTROY (const char* nombrearchivo); 8 Estrategias de selección: First-t: devolver el primer registro vacío libre tal que tam(reg vacío) tam(reg) Best-t: ordenar la lista de registros vacíos en orden ascendente por tamaño, devolver el primer registro vacío libre tal que tam(reg vacío) tam(reg) Worst-t: ordenar la lista de registros vacíos en orden descendente por tamaño, devolver el primero. 2829 17 Archivos relativos Algoritmo 6 Primitivas de la organización relativa 1 int R_OPEN (const char* nombrearchivo, int modo); 2 int R_CLOSE (int filehandler); 3 int R_SEEK (int filehandler, int numreg); 4 int R_READ (int filehandler, int numreg, void* regdestino); 5 int R_READNEXT (int filehandler, void* regdestino); 6 int R_WRITE (int filehandler, int numreg, const void* regfuente); 7 int R_UPDATE (int filehandler, int numreg, const void* regfuente); 8 int R_DELETE (int filehandler, int numreg); 9 int R_DESTROY (const char* nombrearchivo); 10 int R_GETMAXREGS (int filehandler); 18 Archivos directos y hashing Archivo directo estático: El archivo tiene longitud ja y no extensible. Los registros tienen longitud ja y tienen una clave primaria. Cada registro del archivo posee un atributo extra que indica si el mismo está libre, ocupado, o fue borrado del archivo. Para realizar altas, bajas y modicaciones de registros en el archivo, se debe calcular su posición en el mismo con una función de hashing. Si dos registros hashean a la misma posición, la colisión debe resolverse. Factor de carga del archivo: # registros ocupados # registros disponibles Algoritmo 7 Primitivas de la organización directa 1 int D_OPEN (const char* nombrearchivo, int modoapertura); 2 int D_CLOSE (int handler); 3 int D_READ (int filehandler, void* regdestino); 4 int D_WRITE (int filehandler, const void* regfuente); 5 int D_UPDATE (int filehandler, const void* regfuente); 6 int D_DELETE (int filehandler, const void* regfuente); 7 int D_DESTROY (const char* nombrearchivo); Función de hashing: función f tal que f(k) = offset. Espacio de claves Espacio de direcciones Claves sinónimas producen colisión: evento en el cual, para dos claves k 1 y k 2 (k 1 k 2 ), se da que f(k 1 ) = f(k 2 ) Funciones de hashing perfectas No produce colisiones. Se pueden construir si conocemos de antemano las claves a hashear. 2930 18.2 Funciones de hashing no perfectas Pueden producir colisiones. Función módulo: f(k) = k mod N. El valor de N debería ser primo para que la función disperse uniformemente. Espacio de direcciones: [0..N 1] Función multiplicación: f(k) = N [k (x 1)]. El valor de x debería ser irracional. Espacio de direcciones: [0..N 1] Función fold&add: dividir la clave en partes de 2 o 4 bytes, aplicar la función de hashing a cada parte, y luego aplicar una operación que concatene los resultados (suma, XOR, etc.) 18.3 Aplicaciones Rolling hashing es una función de hash donde la entrada se hashea en una ventana que se mueve a lo largo de la entrada. Algoritmo de Rabin-Karp: es un método que usa una función de hashing para buscar un patrón de string en un texto. H = c 1 a k 1 + c 2 a k c k a 0, donde a es constante y c 1... c k son los caracteres de la entrada. Filtros de Bloom: para vericar la pertenencia de un elemento en un conjunto Funciones de hashing unidireccionales Una función de hashing unidireccional es de la forma H(M) = k. Tienen ciertos requisitos: Toma un valor de longitud variable M y devuelve un valor de longitud ja k (generalmente la longitud es de 128 bits). Dado M debe ser sencillo calcular k. Dado k debe ser muy difícil encontrar un M tal que H(M) = k. Dado M debe ser muy difícil encontrar un M tal que H(M) = H(M ) Aplicaciones: Autenticación de documentos Firmas digiales Códigos de vericación Algunas funciones de hashing unidireccionales: 1. MD5: devuelve un valor de 128 bits. 2. SHA: devuelve un valor de 160 bits. 3031 18.5 Resolución de colisiones en archivos directos estáticos 1. Búsqueda de posición libre Sean las funciones de hashing f(k) = offset y g(k) = offset g y el número de iteración i. P i es la posición en el archivo relativo donde se debe comprobar la inserción o búsqueda. a) Linealmente y cíclicamente: P i = f(k) + i Se inserta en el primer lugar disponible (registro libre o borrado) a partir de offset. Si se llega al nal del archivo, se vuelve al principio del mismo y se busca hasta llegar a offset. Si llegó a offset es porque no hay lugar disponible. Las búsquedas de un registro terminan cuando: Se encuentra el registro, o Se encuentra un registro libre, o Se vuelve a la posición inicial offset (luego de hacer un ciclo). Para borrar: buscar y marcar como libre. Desventaja: aglomeramiento de sinónimos en porciones del archivo. b) Cuadrático y cíclico: Ídem anterior. c) Doble hashing: P i = f(k) + i 2 P i = f(k) + i g(k) 2. Uso de área de overow Es el lugar donde se guardan los registros sinónimos. a) En el mismo archivo de datos. 1) Área de overow distribuida. Los registros de overow se intercalan con los archivos de datos (b registros de overow por cada a registros de datos). P osicion(k) = k + b(x div a) P osicionoverflow(k) = b(x div a) + a [(x div a) + 1] 2) Área de overow al nal. b) En otro archivo. 3. Encadenamiento de claves sinónimos (direccionamiento cerrado) a) En el mismo archivo: cada registro posee, además del ag antes mencionado (libre, ocupad, borrado), un puntero a otro registro sinónimo. Si el registro no tiene sinónimos, este puntero es -1. Método de doble pasada para cargar el archivo: 1) Guardar las claves que no producen colisiones. 2) Guardar las claves que producen colisiones, encadenando los sinónimos. b) En otro archivo: cada registro posee, además del ag antes mencionado, un puntero a un registro del archivo de overow. Este a su vez posee encadenamiento de sinónimos (n marcado con un puntero -1). 4. Uso de buckets: un bucket almacena una cantidad ja de registros. Cuando hay overow en el bucket, se debe utilizar otra técnica de resolución de colisiones. 5. Uso de varias funciones de hashing 3132 18.6 Hashing extensible Permite que el archivo crezca sin cambiar la función de hashing. Se necesitan 4 estructuras: 1. Archivo de tabla de dispersión, que guarda su tamaño de tabla (tt). La tabla posee punteros a bloques. 2. Archivo con bloques. Cada bloque soporta una cantidad ja de registros de longitud ja. Cada bloque tiene su tamaño de dispersión (td). bloque.td = 3. Archivo con lista de bloques libres. tabla.tt = distancia en tabla a otra ref #refs bloque en tabla 4. Función de hashing f tal que f(clave) =posición en la tabla que nos dará el puntero al bloque. Métodos: Mediante bit sujos: Las claves se representan en base 10. f(clave) = clave mod tabla.tt 3233 Algoritmo 8 Alta mediante bits sujos. 1 int postabla = fhash(registro.clave) 2 int numerobloque = tabla[postabla] 3 Bloque bloque = bloques[numerobloque] 4 5 if (bloque.contiene(registro.clave)) 6 return RES_REGISTRO_DUPLICADO 7 8 if (bloque.cantregslibres > tabla.cantregsporbloque) 9 bloque.insertar(registro) 10 return RES_OK // La clave no esta en el bloque y no se puede insertar en el 13 // El bloque aparece referenciado en la tabla solo 1 vez 14 if (bloque.td == tabla.tt) 15 tabla.duplicar() 16 tabla.tt *= Bloque nuevobloque // Uno nuevo o el primero de bloqueslibres 19 bloques.agregar(nuevobloque) // Si cree uno nuevo bloque.td *= 2 22 nuevobloque.td = bloque.td // Actualizo la referencia en la tabla 25 tabla[postabla] = numnuevobloque // La clave no esta en el bloque y no se puede insertar en el 28 // El bloque aparece referenciado en la tabla mas de 1 vez 29 else: 30 Bloque nuevobloque // Uno nuevo o el primero de bloqueslibres 31 bloques.agregar(nuevobloque) // Si cree uno nuevo bloque.td *= 2 34 nuevobloque.td = bloque.td // Actualizo las referencias en la tabla 37 int punteroinicial = numbloque 38 while (tabla[punteroinicial] == numbloque) 39 tabla[punteroinicial] = numnuevobloque 40 punteroinicial = (punteroinicial + bloque.td) mod (tabla.tt) bloque.redispersar() // Aplicar otra vez la funcion de hashing a sus elementos insertar(registro, tabla, bloques) 3334 Algoritmo 9 Baja mediante bits sujos 1 int postabla = funcionmod(registro.clave) 2 int numerobloque = tabla[postabla] 3 Bloque bloque = bloques[numerobloque] 4 5 if (! bloque.contiene(registro.clave)) 6 return RES_REGISTRO_NO_EXISTE 7 8 if (bloque.cantregslibres > 1) 9 bloque.eliminar(registro) 10 return RES_OK // El bloque queda vacio, podemos liberarlo? 13 else: 14 int postabla_atras = (postabla - bloque.td / 2) mod (tabla.tt) 15 int postabla_adelante = (postabla - bloque.td / 2) mod (tabla.tt) if (tabla[postabla_atras] == tabla[postabla_adelante): 18 // El bloque se lo puede agregar a "bloques libres" bloqueslibres.agregar(numbloque) 21 numbloquereemplazo = tabla[postabla_atras] 22 Bloque reemplazo = bloques[numbloquereemplazo] // Se reemplazan sus referencias en la tabla por otro bloque 25 int punteroinicial = numbloque 26 while (tabla[punteroinicial]!= numbloquereemplazo) 27 tabla[punteroinicial] = numbloquereemplazo 28 punteroinicial = (punteroinicial + reemplazo.td) mod (tabla.tt) reemplazo.td /= 2 31 if (tabla.mitadesiguales()) 32 tabla.cortarpormitad() else: 35 // No se puede marcar como libre, queda vacio 36 return RES_OK Mediante bits prejos Las claves se representan de forma binaria. La función de hash devuelve los log 2 (tabla.tt) bits menos signicativos de la clave, en base 10. f(clave) = ( ) clave [log2 (tabla.tt),...,0] 10 3435 Algoritmo 10 Alta mediante bits prejos. 1 int postabla = fhash(registro.clave) 2 int numerobloque = tabla[postabla] 3 Bloque bloque = bloques[numerobloque] 4 5 if (bloque.contiene(registro.clave)) 6 return RES_REGISTRO_DUPLICADO 7 8 if (bloque.cantregslibres < tabla.cantregsporbloque) 9 bloque.insertar(registro) 10 return RES_OK // La clave no esta en el bloque y no se puede insertar en el 13 // El bloque aparece referenciado en la tabla solo 1 vez 14 if (bloque.td == tabla.tt) 15 tabla.duplicar() // Elemento a elemento 16 tabla.tt *= Bloque nuevobloque // Uno nuevo o el primero de bloqueslibres 19 bloques.agregar(nuevobloque) // Si cree uno nuevo bloque.td *= 2 22 nuevobloque.td = bloque.td // Actualizo la referencia en la tabla 25 tabla[postabla] = numnuevobloque // La clave no esta en el bloque y no se puede insertar en el 28 // El bloque aparece referenciado en la tabla mas de 1 vez 29 else: 30 int viejott = tabla.tt 31 Bloque nuevobloque // Uno nuevo o el primero de bloqueslibres 32 bloques.agregar(nuevobloque) // Si cree uno nuevo bloque.td *= 2 35 nuevobloque.td = bloque.td // Actualizo las referencias en la tabla 38 int punteroinicial = 0 39 while (punteroinicial!= viejott) 40 if (tabla[punteroinicial] == numbloque) 41 tabla[punteroinicial] = numnuevobloque 42 punteroinicial += bloque.redispersar() insertar(registro, tabla, bloques) 3536 Algoritmo 11 Baja mediante bits prejos 1 int postabla = funcionmod(registro.clave) 2 int numerobloque = tabla[postabla] 3 Bloque bloque = bloques[numerobloque] 4 5 if (! bloque.contiene(registro.clave)) 6 return RES_REGISTRO_NO_EXISTE 7 8 if (bloque.cantregslibres > 1) 9 bloque.eliminar(registro) 10 return RES_OK // El bloque queda vacio, podemos liberarlo? 13 else: 14 // Calculo el vector donde posiblemente haya bloques de reemplazo 15 vector<int> posicionestabla 16 int cantbitsespaciobusqueda = log(tabla.tt,2) 17 int cantbitsprefijoclave = log(bloque.td,2) 18 claveconultimobitpermutado = clave.permutarultimobit() int cantidadvariantes = cantbitsespaciobusqueda - cantbitsprefijoclave 21 for (int i = 0; i < 2; i ++) 22 variante = getnextpermutacion (cantidadvariantes) 23 posicionestabla.agregar(claveconultimobitpermutado + variante) if (bloque.td == tabla.tt) 26 // El bloque se lo puede agregar a "bloques libres" bloqueslibres.agregar(numbloque) 29 numbloquereemplazo = tabla[posicionestabla(1)] 30 Bloque reemplazo = bloques[numbloquereemplazo] // Se reemplaza su referencia en la tabla por otro bloque 33 tabla[numbloque] = numbloquereemplazo 34 reemplazo.td /= else: 37 if (tabla[posicionestabla(1..etc)].elementosidenticosentresi()): 38 // El bloque se lo puede agregar a "bloques libres" bloqueslibres.agregar(numbloque) 41 numbloquereemplazo = tabla[posicionestabla(1)] 42 Bloque reemplazo = bloques[numbloquereemplazo] // Se reemplazan sus referencias en la tabla por otro bloque 45 int punteroinicial = numbloque 46 while (tabla[punteroinicial]!= numbloquereemplazo) 47 tabla[punteroinicial] = numbloquereemplazo 48 punteroinicial = (punteroinicial + reemplazo.td) mod (tabla.tt) reemplazo.td /= 2 51 if (tabla.mitadesiguales()) 52 tabla.cortarpormitad() else: 55 // No hay bloques de reemplazo, queda vacio. 56 return RES_OK 19 Archivos indexados Clave: expresión derivada de uno o más campos de un registro que se utiliza para localizar el mismo. Debe ser: Canónicos: debe haber una sola representación para dos claves similares. Ejemplo: The Beatles, THE BEATLES, the beatles deberían mapear a beatles. 3637 No cambiante: si el registro cambia y la clave cambia, luego tendrá que reorganizarse el archivo. Clave primaria: debe ser: Sin datos: no deben contener información, porque no sabemos si esa información podría repetirse en el futuro. Única: no puede haber dos registros con la misma clave primaria. Índice: herramienta para buscar registros. Se basan en los conceptos de clave,referencia. Un índice permite imponer orden en un archivo sin tener que ordenar el archivo. Un índice permite buscar un registro en un archivo de registros variables de forma rápida. Varios índices sobre un archivo permiten tener varias formas de acceder a un registro. Árbol balanceado: la distancia más corta a un nodo hoja diere en 1 con la distancia más larga. Árbol completamente balanceado: todos los caminos desde la raíz hasta un nodo hoja son del mismo largo. Para manejar archivos indexados con registros de longitud variable, en vez de contar la cantidad de registros que caben en un nodo, se cuenta la cantidad de bytes que caben. Algoritmo 12 Primitivas de la organización indexada 1 int I_DESTROY (char* nombrearchivo); 2 int I_OPEN (const char* nombrearchivo, int modoapertura); 3 int I_CLOSE (int filehandler); 4 int I_ADD_INDEX(int handler, const campo* clave); 5 int I_DROP_INDEX (int filehandler, int indexid); 6 int I_IS_INDEX (int filehandler, campo* clave); 7 int I_START (int filehandler, int indexid, char* operador, const void* valorreferencia); 8 int I_READ (int filehandler, void* regdestino); 9 int I_READNEXT (int filehandler, int indexid, void* regdestino); 10 int I_WRITE (int filehandler, const void* reg); 11 int I_UPDATE (int filehandler, const void* reg); 12 int I_DELETE (int filehandler, const void* reg); 19.1 Árbol B (indexado) Árbol B: estructura que intenta acceder y mantener un índice que es muy grande para mantener en memoria. Todos los nodos mantienen elementos almacenados. El orden de un árbol B es la cantidad máxima de nodos descendientes que puede tener un nodo interno. Cantidad de seeks necesarias para acceder por referencia a una clave: ( ) n log k 2 2 donde k = cantidad de registros lógicos, n = factor de bloqueo. Son árboles anchos y poco profundos. Todas las ramas tienen igual profundidad. Cada nodo del árbol posee: Claves: k como máximo, k 2 como mínimo. Punteros a nodos descendientes: k + 1 como máximo, k+1 2 como mínimo. La raíz puede no tener claves (si el árbol está vacío), y puede tener 0 descendientes, o más de 2. 3738 Los nodos hoja no tienen descendientes. Entre la cantidad mínima de claves y la cantidad mínima de descendientes, hay una diferencia de 1. El árbol está ordenado por clave. Cada clave en un nodo tiene dos referencias: una a un nodo con elementos de clave menor, y otra a un nodo con elementos de clave mayor. 1 BTreeNode root 2 root.isleaf = true 3 root.elements = 0 4 disk-write(root) 5 this->root = root 6 7 BTreeNode BTree::search (mothernode, key): 8 if mothernode.contains(key): 9 return mothernode 10 if mothernode.isleaf(): 11 return NULL // Key not found BTreeNode nexttofind = NULL 14 for each keyi in mothernode: 15 if mothernode[keyi] > key: 16 // Element with next higher key 17 nexttofind = mothernode[keyi].leftpointer // Element with node s max key 20 nexttofind = mothernode[maxkey].rightpointer return (search (nexttofind, key)) 1 BTreeNode leafnode = search(key) 2 if (leafnode.isfull()) 3 // Split 4 BTreeSuperNode supernode = leafnode 5 supernode.insert(key) 6 supernode.split() // 2-3 o supernode.promote(median) //More splits may be necessary 8 9 else: 10 leafnode.insert(key) 1 BTreeNode node = find(this->root,key) 2 if (node == NULL) 3 return false 4 if (node.isleaf()) 5 node.delete(key) 6 if (node.underflow()) 7 if (node.sibling.hasextrakeys()) 8 // Bajar uno del padre al nodo y 9 // subir uno del sibling al padre. 10 // El sibling es siempre el izquierdo o siempre el derecho 11 node.redistributewithsibling(node.sibling) 12 else: 13 // Juntar dos nodos en uno y bajar el separador del padre 14 node.concatenatewith(node.sibling, node.father) 15 if (node.father.underflow()) 16 node.father.redistributewithsibling() 17 else: 18 BTreeNode immediate = node.immediatelysuperiororinferior() 19 swap(node[key], immediate[key]) 20 immediate.delete (key) 19.2 Árbol B* (indexado) Es una variante del árbol B. 3839 Cada nodo del árbol posee: Claves: k como máximo, 2 3 k como mínimo. Punteros a nodos descendientes: k + 1 como máximo, 2k+1 3 como mínimo. Se realizan redistribuciones en el alta. Los split se realizan tomando 2 siblings y dividiéndolos en 3 nodos, donde cada uno tiene una carga de 2 3. La raíz es un caso especial, porque no tiene siblings. Entonces, para hacer un split de la raíz, puede elegirse entre las siguientes alternativas: Manejar la raíz como un nodo de un árbol B Raíz con más capacidad que los demás nodos, para que cuando hagamos un split, los dos nodos resultantes estén 2 3 llenos, Raíz con mucha más capacidad que los demás nodos, para que cuando hagamos un split, los tres nodos resultantes estén 2 3 llenos Ventajas con respecto a árbol B Menor altura del árbol, y por ende menor tiempo de búsqueda Aprovecha mejor el espacio en el nodo Desventajas con respecto a árbol B Altas y bajas más costosas, porque se redistribuye 19.3 Árbol B+ (indexado secuencial) Es una combinación entre un set indexado y un set secuencial. Por lo tanto, provee acceso secuencial e indexado. El set secuencial está formado por bloques (no necesariamente contiguos físicamente en disco) que contienen registros ordenados, y dos punteros (uno al bloque anterior, y uno al siguiente). El set indexado es un índice al set secuencial. Es un árbol B que contiene: Registros de longitud ja (usualmente del mismo tamaño de los bloques del set secuencial) que tienen claves para distinguir entre dos bloques. Cada nodo contiene N separadores y N + 1 descendientes. ó Registros de longitud variable que tienen: Figura 17: Index set block Contador de separadores (para poder hacer una búsqueda binaria sobre los mismos) Longitud total de los separadores (para poder acceder al índice de separadores) 3940 Separadores concatenados Índice a los separadores (la longitud de cada separador se obtiene con el puntero siguiente Puntero a otros bloques 1 BPlusTreeBlock block = findsequentialsetblock(key) 2 if (block + key = overflow): 3 block.split() // no se promueven claves, se distribuyen en 2 bloques 4 // Actualizar index set 5 if (node of index set in overflow) 6 // resolver como en arbol B. 7 else: 8 block.insert(key) 9 // Actualizar index set si corresponde. 1 BPlusTreeBlock block = findsequentialsetblock(key) 2 if (block - key = underflow): 3 if (block.rightneighbour.load = 1/2) 4 concat(block, block.rightneighbour) 5 markdeleted(block) // Con un mapa de bits 6 // Actualizar index set 7 indexset.remove(separator) 8 if (block.neighbors.load > 1/2) 9 redistributeload(block,block.neighbors) 10 indexset.update(separator) 11 else: 12 block.delete(key) 13 // El index set no cambia Árbol B# (indexado secuencial) 20 Ordenamiento de archivos Se tiene un archivo formado por registros con claves. Los registros están desordenados. Se lo quiere ordenar. 1. Métodos Internos: el tamaño del archivo no puede ser mayor al tamaño de la memoria disponible. a) Heapsort b) Quicksort c) Keysort: la suma de los tamaños de las claves de los registros no puede ser mayor al tamaño de la memoria disponible. 1 { 2 vector<pair<clave,puntero>> claves = archivodesordenado.getclaves() 3 claves.sort() // Ordenar por Clave 4 for parclavepuntero in claves: 5 Registro registro = archivodesordenado.getregistro(parclavepuntero.second) 6 archivoordenado.append(registro) 7 } Problema: Hay que leer el archivo dos veces, y la segunda lectura no es en forma secuencial. 2. Métodos Externos: se carga el archivo parcialmente en memoria, se ordena, se graban copias (particiones) y luego se hace merge de estas particiones. a) Mergesort: genera particiones del tamaño de la memoria. 4041 Algoritmo 13 Mergesort 1 { 2 Registro registroleido = archivodesordenado.getnextregistro() 3 registrosleidos.append(registroleido) 4 memorialibre = memorialibre - registroleido.tamanio 5 cantregsleidos ++ 6 } 7 8 archtempordenado _generarparticion(archivodesordenado, cantregsarchivo, cantregsleidos, tamaniomemoria) 9 { 10 vector<registro>* registrosleidos = new Vector() 11 int memorialibre = tamaniomemoria while (cantregsleidos < cantregsarchivo) 14 { 15 agregarregistroamemoria (archivodesordenado, *registrosleidos, &cantregsleidos, &memorialibre) while (cantregsleidos < cantregsarchivo && memorialibre > registroleido->tamanio()) 18 { 19 agregarregistroamemoria (archivodesordenado, *registrosleidos, &cantregsleidos, &memorialibre) 20 } 21 } registrosleidos.sort() 24 archtempordenado.agregar(registrosleidos) 25 delete(registrosleidos) // Libero la memoria 26 } void mergesort (archivodesordenado, archivoordenado) 29 { 30 int cantregsarchivo = archivodesordenado.getcantregs() 31 int cantregsleidos = 0 32 vector<archtempordenado> particiones //referencias a archivos // Genero las particiones 35 while (cantregsleidos < cantregsarchivo) 36 { 37 archtempordenado = _generarparticion(archivodesordenado,cantregsarchivo, &cantregsleidos, tamaniomemoria) 38 particiones->append(archtempordenado) 39 } mergepolifasico(particiones, archivoordenado) 42 } b) Mergesort con Replacement Selection: usa dos heaps. Mejor caso: archivo ordenado. Genera una partición del tamaño del archivo. Peor caso: archivo ordenado en forma inversa. Particiones de tamaño tamaño memoria como un sort interno. Caso medio: archivo con orden aleatorio. Particiones de tamaño 2 tamaño memoria 4142 ARCHIVO = 2,1,3,5,7,8,2,6,4,1,2,0,3,5 Tamaño registro = 1 byte, Tamaño RAM = 3 bytes Lectura Heap Heap Salida Comentarios primario en memoria secundario en memoria 2,1,3 1,2, ,3, ,5, ,7, , es menor a 5, va al heap secundario 6 8 2,6 8 6 es menor a 7, va al heap secundario. Se vació el heap primario - 2,6 2,6 - El heap 2 pasa a memoria 4 2,4, , es menor a 2, va al heap secundario 2 6 1,2 6 2 es menor a 4, va al heap secundario. Se vació el heap primario - 1,2 1,2 - El heap 2 pasa a memoria 0 0,1, ,2, ,3,5-2 Se terminó el archivo 3,5 3 Vaciamos el heap primario 5 5 Vaciamos el heap primario Cuadro 3: Ejemplo de Replacement Selection 4243 Algoritmo 14 Replacement Selection 1 { 2 vector<archivoordenado> particiones 3 vector<registro> registros = llenarmemoria(tamaniomemoria, archivodesordenado) 4 Heap heapprimario (registros) 5 Heap heapsecundario () // Aca se guardan los registros congelados 6 archivoordenado 7 particiones.agregar(archivoordenado) 8 9 bool haymasregistros =!archivodesordenado.eof() 10 mientras (haymasregistros &&! heapprimario.vacio()) 11 { Registro regminimo = heapprimario.quitarminimo() 14 archivoordenado.agregar(regminimo) si (heapprimario.vacio() 17 { 18 archivoordenado.close() 19 archivoordenado = open(nuevo archivoordenado) 20 particiones.agregar(archivoordenado) vector<registro> registros = llenarmemoria(tamaniomemoria, heapsecundario) 23 Heap heapprimario (registros) 24 continue 25 } Registro regleido = archivodesordenado.getnextregistro() 28 si (regleido.clave < regminimo.clave) 29 heapsecundario.insertar(regleido) si (regleido.clave > regminimo.clave) 32 heapprimario.insertar(regleido) 33 } 34 return particiones 35 } void mergesort(archivodesordenado, particiones, archivoordenado, tamaniomemoria) 38 { 39 vector<archivoordenado> particiones = replacementselection(archivodesordenado, tamaniomemoria) 40 mergepolifasico(particiones,archivoordenado) 41 } c) Mergesort con Natural Selection: Mejor caso: Peor caso: Caso medio: archivo con orden aleatorio. Particiones de tamaño 3 tamaño memoria 4344 ARCHIVO = 2,1,3,5,7,8,2,6,4,1,2,0,3,5 Tamaño registro = 1 byte, Tamaño RAM = 3 bytes Lectura Memoria Freezer (archivo) Salida Comentarios 2,1,3 2,1,3-1 Llenamos la memoria 5 2,5, ,5, ,5, ,8 2 2 es menor a 5, va al freezer 6 6,7, ,8 2,4 4 es menor a 6, va al freezer 1 7,8 2,4,1 1 es menor a 6, va al freezer (que se llena) - 7 Vaciamos la memoria ordenadamente - 8 Vaciamos la memoria ordenadamente 2,4,1-1 El freezer pasa a memoria 2 2,4, ,4 0 0 es menor a 2, va al freezer 3 2,4, ,4, , El archivo se terminó. 0-0 Copiamos lo del freezer a memoria. Nueva partición. Cuadro 4: Ejemplo de Natural Selection 4445 Algoritmo 15 Natural Selection 1 { 2 vector<archivoordenado> particiones 3 vector<registro> registros = llenarmemoria(tamaniomemoria, archivodesordenado) 4 Heap heap (registros) 5 archivoordenado archivoordenado 6 particiones.agregar(archivoordenado) 7 8 archivoordenado freezer (tamaniomemoria) // Aca se guardan los registros congelados 9 10 bool haymasregistros =!archivodesordenado.eof() 11 mientras (haymasregistros) 12 { 13 Registro regminimo = heap.quitarminimo() 14 archivoordenado.agregar(regminimo) Registro regleido = archivodesordenado.getnextregistro() 17 si (regleido.clave < regminimo.clave) 18 heap.insertar(regleido) si (regleido.clave > regminimo.clave) 21 freezer.agregar(regleido) 22 si (freezer.lleno()) 23 { 24 while (! heap.vacio()) 25 regminimo = heap.quitarminimo() 26 archivoordenado.agregar(regminimo) 27 registros = llenarmemoria(tamaniomemoria, freezer) 28 heap (registros) 29 } } 32 si (! freezer.vacio()) //Quedaron registros sin grabar a disco 33 { 34 vector<registro> registros = llenarmemoria(tamaniomemoria, freezer) 35 registros.sort() 36 particiones.agregar(archivoordenado(registros)) 37 } 38 return particiones 39 } void mergesort(archivodesordenado, particiones, archivoordenado, tamaniomemoria) 42 { 43 vector<archivoordenado> particiones = naturalselection(archivodesordenado, tamaniomemoria) 44 mergepolifasico(particiones,archivoordenado) 45 } d) Radix Sort: solo sirve para ordenar números enteros. Mejor caso = peor caso = caso medio = O(nk), donde n es la cantidad de elementos y k es la cantidad máxima de dígitos de los números. 4546 Figura 18: Radix Sort e) Bucket Sort: ordena ecientemente n números, donde cada número pertenece al rango [0..N 1], y N no es mucho más grande que n, o N < n. Figura 19: Bucket Sort 21 Operaciones entre 2 o más archivos 21.1 Intersección (match) Se tienen dos archivos ordenados por clave. Se quiere obtener un archivo que contenga los registros que están en ambos archivos. 1 { 2 boolean maselementos = proximoitem(lista1) && proximoitem(lista2) 3 mientras (maselementos): 4 si (item(lista1) < item(lista2)): 5 maselementos = proximoitem(lista1) 6 si (item(lista1) > item(lista2)): 7 maselementos = proximoitem(lista2) 8 si (item(lista1) == item(lista2)): 9 salida.agregar(item(lista1)) 10 maselementos = proximoitem(lista1) && proximoitem(lista2) 11 } 21.2 Unión (merge) Se tienen dos archivos ordenados por clave. Se quiere obtener un archivo que contenga los registros que están en uno o en ambos archivos. 4647 1 { 2 boolean maselementoslista1 = proximoitem(lista1) 3 boolean maselementoslista2 = proximoitem(lista2) 4 mientras (maselementoslista1 maselementoslista2): 5 si (item(lista1) < item(lista2)): 6 salida.agregar(item(lista1)) 7 maselementos = proximoitem(lista1) 8 si (item(lista1) > item(lista2)): 9 salida.agregar(item(lista2)) 10 maselementos = proximoitem(lista2) 11 si (item(lista1) == item(lista2)): 12 salida.agregar(item(lista1)) 13 maselementoslista1 = proximoitem(lista1) 14 maselementoslista2 = proximoitem(lista2) 15 } 21.3 Merge de k vías Objetivo: hacer la unión de k archivos, donde k 8. Entrada: k listas ordenadas, cada una de tamaño n. Salida: lista de tamaño nk Orden: O(nk 2 ) 1 // Crear lista de indices 2 int indices[1..k] = int contador = 0 5 mientras (contador < kn): 6 // Obtener el numero de lista 7 // cuyo proximo elemento sin procesar es el minimo 8 // (ignora listas para las cuales indices[j] > n) 9 para cada j entre 1 y k: 10 int minimo = min (listas[j][indices[j]]) salida[contador] = listas[p][indices[p]] 13 indice[p] += 1 14 contador += Apareo Se tiene un archivo maestro y un archivo transaccional que reporta cambios sobre el maestro. Los archivos están ordenados por la misma clave y tienen el mismo formato de registro, con la excepción de que los registros de los archivos transaccionales deben tener un campo extra que indique si es una transacción alta, baja, o modicación. 1 boolean masregistrosmaestros = proximoitem(listamaestra) 2 boolean masregistrostransacc = proximoitem(listatransacciones) 3 mientras (masregistrosmaestros masregistrostransacc) 4 { 5 si (item(listamaestra) < item(listatransacciones)) 6 { 7 salida.agregar(item(listamaestra)) 8 masregistrosmaestros = proximoitem(listamaestra) 9 } 10 si (item(listamaestra) > item(listatransacciones)) 11 { 12 si (operacion(item(listatransacciones)) == "alta"): 13 salida.agregar(item(listatransacciones)) 14 si (operacion(item(listatransacciones)) == "baja"): 15 mostrar(error EN BORRADO POR REGISTRO INEXISTENTE) 16 si (operacion(item(listatransacciones)) == "modificacion"): 17 mostrar(error EN MODIFICACION POR REGISTRO INEXISTENTE) 4748 18 masregistrostransacc = proximoitem(listatransacciones) 19 } 20 si (item(listamaestra) == item(listatransacciones)) 21 { 22 si (operacion(item(listatransacciones)) == "alta"): 23 mostrar(error EN ALTA POR REGISTRO DUPLICADO) 24 si (operacion(item(listatransacciones)) == "modificacion"): 25 salida.agregar(item(listatransacciones) masregistrosmaestros = proximoitem(listatransaccionesmaestra) 28 masregistrostransacc = proximoitem(listatransacciones) 29 } 30 } 4849 Parte III FTRS (Full Text Retrieval System) Objetivo: encontrar material de naturaleza no estructurada, que satisface una necesidad de información, en una colección muy grande. La necesidad de información se expresa en una query, y se quiere ordenar los documentos de más a menos relevantes, y presentarle al usuario un subconjunto de los más relevantes. Los documentos no tienen estructura clara. No hay campos denidos. No existe una respuesta correcta para una consulta. Cada documento puede ser más o menos relevante a una consulta. La relevancia es subjetiva. No sólo importa la velocidad de respuesta sino la calidad de la respuesta. Se intenta buscar una aproximación a lo que el usuario pide. Término: unidad mínima de información consultable. Documento: unidad mínima de información recuperable. Puede ser un un capítulo o un párrafo, una página web, o un libro completo. Colección: puede ser homogénea (es decir, todos los documentos tratan de un tema) o no homogéneas (por ejemplo, la Web). Etapas para alcanzar el objetivo: 1. Elegir el modelo que permita calcular la relevancia de un documento frente a una consulta. "Cómo adivinar lo que el usuario quiso preguntar 2. Diseñar algoritmos y estructuras de datos que lo implementen de forma eciente (índice). "Cómo no tardar demasiado 22 Indexación Modelos clásicos: Booleano Conjuntos difusos Extendido Vectorial Generalizado LSI (Latent Semantic Indexing) Redes Neuronales Probabilístico Redes bayesianas Redes de inferencia bayesiana Índice invertido: índice de clasicación de documentos por término. En la versión básica, por cada término se tiene la lista de documentos en los que aparece el término. El conjunto de términos es el vocabulario o léxico. Las listas de cada término son listas invertidas. Un índice tiene granularidad, que es la precisión con la que se guardan las posiciones de cada término en cada documento (word level, paragraph level, etc.). Como regla general, los índices invertidos son mejores a los signature les y los bitmaps tanto en espacio ocupado como en velocidad de resolución de consultas. 4950 22.1 Modelo booleano Formas de implementación: 1. Índice invertido. Formadas por dos estructuras: a) Vocabulario: Estructura de búsqueda. Suele ser un árbol B. < i(termino),freq t, oset lista invertida > La frecuencia de cada término se almacena aquí para resolver las consultas más ecientemente (sin tener que acceder a sus listas invertidas), del término menos a más frecuente. b) Listas Invertidas: una por cada término, contiene una lista ordenada de forma ascendente de los números de documentos donde se encuentra ese término. Si el índice es posicional: < < d 1, d 2,..., d freqt > { ]} { ]} d 1, freq td1, [pos 1,..., pos freqtd1 ;... ; d freqt, freq tdfreqt, [pos 1,..., pos freqtdfreqt > Algoritmo 16 Fase 1 de 2: scanning 1 indice de archivos = {} 2 archivo temporal = {} 3 archivo de lexico = {} 4 5 para cada "doc" en coleccion: 6 7 indice de archivos += <num doc, doc> 8 9 para cada palabra en doc: 10 si palabra es termino indexable: 11 si termino no esta en lexico: 12 archivo de lexico += termino num termino = posicion de "termino" en "lexico" 15 archivo temporal += <num doc, num termino, pos termino> num doc return archivo temporal // Este archivo esta ordenado por numero de doc 20 return lexico // Esto deberia estar en memoria al resolver consultas 5051 Algoritmo 17 Fase 2 de 2: indexing 1 archivo indice = {} 2 archivo invertido de documentos = {} 3 archivo invertido de posiciones = {} 4 5 ordenar "archivo temporal" por "num termino" y luego por "num doc" y luego por "pos termino" 6 7 num termino actual = primer "num termino" 8 9 mientras ("archivo temporal" tenga registros): leer <num term, num doc, pos termino> 12 frecuencia = mientras (num termino actual == "num term"): 15 lista posiciones += pos termino 16 lista documentos += <num doc, offset lista posiciones> 17 frecuencia puntero a indice invertido = ftell(archivo invertido) 20 archivo invertido de documentos += lista documentos 21 archivo indice += <lexico[num term], frecuencia, puntero a indice invertido> 2. Índices de rmas (bitstring signature le): se representa a cada documento mediante una rma única de B bits. Se utilizan N funciones de hash (si N = 1, debería ser B = tamaño del léxico). Cada función de hash devuelve un valor entre 0 y B 1. Sean: b: cantidad máxima de bitslices a procesar para resolver una consulta p: probabilidad de que un bit de una rma valga 1 p = b ( z N z: cantidad tolerable de falsos positivos en una consulta z = p b N f: cantidad de pares término, documento únicos q: cantidad de términos en una consulta N: cantidad de documentos en la colección B: cantidad de funciones de hashing a usar ) W: cantidad de bits de la rma B = f N b q W = 1 1 B 1 p Receta: W = V B 0,8 5152 Algoritmo 18 Indexar mediante índices de rmas 1 para cada doc en coleccion: 2 firma de doc = B bits en cero 3 para cada term en doc: 4 para cada funcion en funcioneshash: 5 numero bit = funcion(term) 6 encender "numero bit" en la firma de doc //puede haber colisiones! 7 guardar firma de doc en archivo secuencial Algoritmo 19 Consultar mediante índices de rmas 1 documentos candidatos = {} 2 firma de consulta = B bits en cero 3 4 para cada term de consulta: 5 para cada funcion en funcioneshash: 6 numero bit = funcion(term) 7 encender "numero bit" en la firma de consulta //puede haber colisiones! 8 para cada doc de coleccion: 9 si (firma(doc) AND firma de consulta == firma de consulta) 10 documentos candidatos += doc resultados = revisar(documentos candidatos) // descarto docs que tengan falsos positivos 13 devolver resultados Ventajas No se necesita mantener en memoria el léxico durante la resolución de consultas. Son ecientes para consultas conjuntivas de muchos términos. Desventajas Produce falsos positivos. (Para disminuir la cantidad hay que agregar más bits a la rma, o agregar más funciones de hash). No soportan consultas rankeadas. 2 o 3 veces más grande que un índice invertido. Se necesita leer todo el archivo para resolver una consulta. La función de hash debe generar valores distribuidos uniformemente. Son inecientes para colecciones donde el tamaño de cada documento es muy variable. 3. Índices de porciones de rmas (bitslice signature le): cada registro i del archivo índice (secuencial) representa los bits en la i ésima posición de la rma de todos los documentos. 5253 Algoritmo 20 Indexar mediante índices de porciones rmas 1 archivo indice = {} 2 3 para cada doc en coleccion: 4 para cada term en doc: 5 para cada funcion en funcioneshash: 6 numero bit = funcion(term) 7 archivo temporal += <numero bit, id doc> 8 9 ordenar archivo temporal por "numero bit + id doc" para cada "numero bit" en archivo temporal: 12 porcion = {} 13 para cada "id doc": 14 encender bit n "id doc" en la porcion 15 archivo indice += porcion devolver archivo indice Algoritmo 21 Consultar mediante índices de porciones de rmas 1 documentos candidatos = {} 2 firma de consulta = B bits en cero 3 para cada term de consulta: 4 para cada funcion en funcioneshash: 5 numero bit = funcion(term) 6 encender "numero bit" en la firma de consulta // puede haber colisiones 7 para cada bit encendido en la firma de la consulta: 8 chequear el registro n "bit encendido" del archivo indice 9 documentos candidatos += documentos que tienen 1 en el registro resultados = revisar(documentos candidatos) // descarto docs que tengan falsos positivos 12 devolver resultados Ventajas Comparado con índice de rma: solo hay que leer F N registros, donde N es la cantidad de términos de la consulta y F la cantidad de funciones de hash. Desventajas 4. Bitmaps: cada registro i del archivo índice (secuencial) representa un término i. Cada registro tiene tantos bits como documentos halla (j): p(t i, d j ) = { 1 si t i d j 0 si t i d j 5354 Algoritmo 22 Indexación con bitmaps. 1 N = cantidad de docs 2 para cada doc en coleccion: 3 para cada term en doc: 4 si no esta en vocabulario: 5 agregar <term, id term> a vocabulario 6 si esta: 7 obtener su id term de vocabulario 8 agregar <id term, id doc> a archivo temporal 9 10 ordenar archivo temporal por "id term + id doc" 11 para cada id term en archivo temporal: 12 firma term = N bits en 0 13 para cada id doc: 14 encender bit "id doc " de firma term agregar firma term a bitmap Algoritmo 23 Consultas con bitmaps. 1 candidatos = {} 2 para cada term en consulta: 3 obtener su id term de vocabulario 4 docs = obtener registro "id term" del bitmap 5 candidatos += docs 6 7 revisar candidatos para descartar falsos positivos Ventajas No produce falsos positivos. Eciente para consultas booleanas. Pueden armarse índices secundarios sobre él. Desventajas Desperdicia mucho espacio (si hayn documentos y n términos, ocupa Nn bits). Los bitmaps se pueden comprimir con árboles de derivación binaria. 5455 Figura 20: Árboles de derivación binaria Modelo vectorial Dados los documentos D = {d 1, d 2,..., d N } (hay N documentos) y los términos T = {t 1, t 2,..., t H } (hay H términos), cada documento d j se modela como un vector dj = [p (t 1, d j ), p (t 2, d j ),..., p (t H, d j )] donde p (t i, d j ) es el peso del término i en el documento j. Hay varias formas para representar estos pesos, una de ellas es: donde: p (t i, d j ) = ( ) N ft ij log }{{} 10 n i } {{ } peso local peso global ft ij = frecuencia del término i en el documento j (si aumenta ft ij, aumenta p (t i, d j )) n i = cantidad de documentos en los que aparece el término i (si aumenta n i, disminuye p (t i, d j )). Forma de implementación: Listas invertidas. Formadas por dos estructuras: 1. Vocabulario: Estructura de búsqueda. Suele ser un árbol B. < i(termino),peso global, f t, oset lista invertida > La frecuencia de cada término se almacena aquí para resolver las consultas más ecientemente (sin tener que acceder a sus listas invertidas), del término más a menos frecuente. 2. Entradas de listas invertidas, una por cada término: < doc 1, γ freq t,d 1 ;... ; doc ft, γ freq t,d ft doc 1 > doc ft 5556 a) Si la colección de documentos es muy grande, en orden decreciente de frecuencia normalizada. b) Si la colección de documentos es chica, en orden creciente de documento Modelo probabilístico 23 Consultas Hay dos tipos: Sim (d, q) = P (d es relevante para la consulta q) P (d no es relevante para la consulta q) Booleanas: la consulta es una lista de términos combinados con conectivas AND (+), OR, NOT (-). Relevancia: binaria. 1 es relevante, 0 no lo es. Un documento es relevante para un término sí y sólo sí contiene a ese término. Ventajas Desventajas Muy usado por expertos. Pequeñas variaciones en la consulta producen resultados muy distintos. No discrimina entre documentos más o menos relevantes. No tiene en cuenta la frecuencia de aparición de las palabras. No considera matchs parciales. No permite ordenar los resultados. El usuario promedio no entiende reglas lógicas. Usar ANDs produce mucha precisión pero bajo recall. Usar ORs produce mucho recall pero baja precisión. Rankeadas: la consulta es una lista de términos. Se aplica una heurística para decidir la similitud entre cada documento con la consulta. Ventajas Desventajas Mayor precisión que con Se requiere más información que consultas booleanas para resolver consultas booleanas Requiere mayor procesamiento que para resolver consultas booleanas 5657 23.1 Booleanas Algoritmo 24 Consultas conjuntivas en el modelo booleano. 1 consulta(q): 2 para cada term de q: 3 obtener del arbol B# su frecuencia y la direccion en disco de su lista invertida 4 5 identificar el term de q con la menor frecuencia 6 leer la lista invertida del termino con la menor frecuencia 7 C = {lista invertida del termino con la menor frecuencia} 8 9 para cada term restante de q: 10 leer su correspondiente lista invertida 11 para cada "num doc" en C: 12 si ("num doc" no esta en la lista invertida de term): 13 C = C - {"num doc"} 14 si ( C = 0): 15 devolver no hay resultados para cada "num doc" en C: 18 devolver doc correspondiente La consulta debe ser modicada con las leyes de De Morgan para llevarla a la forma normal disyuntiva. Se realizan las operaciones de conjuntos correspondientes sobre las listas invertidas. Como estas están ordenadas, se puede operar recorriéndolas secuencialmente. Si una lista es corta y la otra larga, puede buscarse binariamente los elementos de la lista corta en la lista larga. Si las listas estuvieran codicadas con d gaps, se ahorra espacio pero no se puede realizar la búsqueda binaria, y conviene almacenar, cada tanto, un valor absoluto. Costo de procesar la consulta q: O f t t q Si las listas se codican con d gaps, el orden es el mismo pero la constante es mayor. Ventaja: para una consulta conjuntiva, la cantidad de documentos resultado siempre es menor o igual que la frecuencia del término de la consulta menos frecuente Rankeadas A diferencia del modelo booleano, en este modelo, agregar un término a la consulta agranda la búsqueda en vez de achicarla. En las consultas de este modelo, los documentos devueltos podrían no contener a todos los términos de la consulta (pero deben contener al menos uno). Se necesita devolver, por ejemplo, los 100 documentos más similares a la consulta, y luego seleccionar los más relevantes, en lo que se conoce como el proceso de ranking Coordinate matching Para cada documento, se cuenta la cantidad de términos de la consulta que posee. Muestra primero los documentos que tienen más términos de la consulta. Representa a cada documento d y consulta como un vector v de H componentes. v i = { 1 si t i d 0 si t i d 5758 Algoritmo 25 Resolución de consulta con coordinate matching. 1 vector consulta = (0,0,0,...,0) // vector de longitud H 2 vector consulta [termino] = frecuencia termino en consulta 3 4 para cada documento en coleccion: 5 vector documento = (0,0,0,...,0) // vector de longitud H 6 para cada termino en documento: 7 vector documento [termino] = frecuencia termino en documento 8 9 para cada documento en coleccion: 10 ranking documento = vector consulta x vector documento // producto interno ordenar los rankings en orden descendente Ventajas Desventajas No tiene en cuenta la frecuencia de los términos en los documentos Asume que todos los términos tienen igual importancia Favorece a los documentos más largos porque tienen más términos Producto interno Representa a cada documento d y consulta como un vector v de H componentes. v i = freq i,d Ventajas Desventajas Asume que todos los términos tienen igual importancia Favorece a los documentos más largos porque tienen más términos Producto interno mejorado Reconoce que cada término tiene una importancia determinada. ( ) N I t = log 10 ft Representa a cada documento con un vector v de H componentes. v i = frecuencia termino i en documento I t Representa a cada consulta con un vector c de H componentes. c i = frecuencia termino i en consulta Algoritmo 26 Resolución de consulta con producto interno mejorado. 1 para cada documento en coleccion: 2 ranking documento = v x c // producto interno 3 4 ordenar los rankings en orden descendente Ventajas Reconoce que cada término tiene una importancia determinada. Desventajas Favorece a los documentos más largos porque tienen más términos. 5859 Distancia coseno Representa a cada documento y consulta como un vector v de H componentes. v i = [p (t 1, d),..., p (t H, d)] N p (t i, d) = ft i,d log 10 norma euclídea n i El vector de la consulta tiene en cuenta los pesos de cada término. La similitud entre dos documentos d i y d j se calcula mediante la distancia coseno 9 : di d j sim(d i, d j ) = = d i dj norma euclídea = norma innito t p (t, d i) p (t, d j ) t p (t, d i) 2 t p (t, d j) 2 t p (t, d i) p (t, d j ) max freq di max freq dj Si se usa la norma euclídea, esta similitud es un valor entre 0 y 1. Si los documentos son iguales, tienen similitud 1, y si no comparten términos, la similitud es 0. Para calcular la similitud entre una consulta q y un documento d, se transforma la consulta en un vector con H componentes. Para resolver más rápidamente la consulta, se pueden realizar dos aproximaciones: Las consultas poseen términos distintos (con lo cual ft q 1 para todo t), q es constante para cualquier consulta (afecta el valor de la similitud pero no el orden del ranking) d sim (q, d) ( ) ft i,d N t q log 10 d n i } {{ } } {{ } peso global peso local = norma del vector. Es el peso del documento en toda la colección. ft ij d j = frecuencia normalizada del término i en el documento j. Este valor se debe almacenar en el índice para evitar tener que hacer el cálculo en cada consulta. p(t i, d j ) = ft i,j log 10 ( N n i ) = peso del término i en el documento j. ft i,j es la frecuencia del término i en la el documento j. Ventajas Reconoce que cada término tiene una importancia determinada. Al incorporar en el cálculo d, no favorece a los documentos más largos. Desventajas 9 Teorema: similitud = cos θ = X Y. Geométricamente, θ es el ángulo entre los vectores X e Y X Y 5960 Algoritmo 27 Cálculo de ranking en el modelo vectorial para colecciones chicas 1 // la lista invertida de un termino esta formada por <cantidad docs, (num doc, freq norm) +> 2 // la lista invertida esta ordenada por "num doc" creciente 3 para cada doc en coleccion: 4 acumulador[doc]= 0 5 para cada term en consulta: 6 recuperar lista de invertida para "term" 7 para cada entrada de la lista invertida <doc, freq norm>: 8 acumulador[doc] += peso global term * freq norm 9 10 ordenar los acumuladores en forma decreciente 11 devolverlos en ese orden Algoritmo 28 Cálculo de ranking en el modelo vectorial para colecciones grandes (devuelve k resultados) 1 // la lista invertida de un termino esta formada por <long, (num doc, freq norm) +> 2 // la lista invertida esta ordenada por "freq norm" decreciente 3 4 para cada term en consulta: 5 leer su lista invertida 6 7 ordenar las listas invertidas por "peso global" decreciente 8 9 para cada lista invertida: 10 pivote lista = primer doc lista contador resultados = 0 13 mientras (contador resultados < k) 14 para cada lista invertida: 15 sim (pivote lista, term) = peso global term * freq norm doc devolver doc pivote con mayor valor de "sim" 18 en la lista que tenia el pivote que acabamos de devolver: 19 avanzar en 1 el pivote contador resultados Retroalimentación en el modelo vectorial Puede preguntársele al usuario cuáles documentos recuperados son relevantes y cuáles no, y volver a pesar todo en función de la respuesta. Sea V el conjunto de documentos recuperados para una consulta. El usuario los clasica en V r (resultados relevantes) y V nr (resultados no relevantes). La fórmula de Rochio modica el vector de la consulta de la siguiente manera: c m = α c + ( ) ( ) β di γ di V r V nr d i V r d i V nr Para no tener que pedirle al usuario los documentos no relevantes, puede asumirse que γ = Consultas especiales 24.1 Consultas de frases Por ejemplo: Segunda Guerra Mundial. La distancia entre los términos debe ser exactamente la indicada en la frase. Si hay un documento que posee todos los términos, hay que, además, conocer la posición relativa de cada término en el documento. 6061 Hay dos formas de resolver estas consultas: Índice invertido booleano posicional: con tres estructuras: Vocabulario: < i(termino),id termino, cantidad docs, oset lista invertida > Listas de documentos: para un término, se almacenan cantidad docs registros del siguiente formato: < id doc, freq termino en doc, oset lista posiciones doc > Listas de posiciones: para un término y un documento, se almacena el siguiente registro: < p 1, p 2,..., p freq termino en doc > Biword index: los términos se indexan de a pares. Para cada rstword hay una lista de nextwords que lo siguen, los documentos y la posición del par en ese documento. Si se combina un biword index para términos comunes con un índice invertido para términos raros, se reduce a la mitad el tiempo de resolución de una consulta, con un space overhead del 10 % del índice invertido. (a) Biword index. (b) Biword index con índice invertido. Figura 21: Biword index. 6162 La resolución de una consulta se resuelve descomponiendo la misma en pares de términos. 1 resolver consulta (c): 2 ordenar los terminos de c de mas raros a mas comunes, guardando sus posiciones originales en c 3 buscar la lista invertida del termino mas raro, y guardarla temporalmente. 4 para cada termino restante de c: 5 buscar su lista invertida 6 hacer merge con la lista temporal 24.2 Consultas de términos próximos / cercanos Por ejemplo: algoritmos árboles ~4. Si hay un documento que posee todos los términos, hay que, además, conocer la posición relativa de cada término en el documento. La distancia entre los términos no debe superar la distancia dada. Para reducir el espacio ocupado por el índice, se puede tener un índice de bloques: se almacena el bloque donde ocurre cada término Consultas con wildcards Ejemplos: cas*, am?r. El wildcard * signica uno o más caracteres desconocidos. El wildcard? signica un caracter desconocido. Métodos de resolución: 1. Fuerza bruta: recorrer el léxico secuencialmente. Ventajas Desventajas No se requieren estructuras adicionales. Es muy lento si los wildcards aparecen al principio. No se requiere que el léxico esté ordenado. No permite búsquedas de tipo *x". 2. Índice secundario de léxico rotado: para cada término del léxico se almacenan todas sus rotaciones. Por ejemplo: frozen se convierte en frozen, rozen f, ozen fr, zen fro, en froz, n froze, frozen (el caracter indica el comienzo del término). Para buscar fro* se buscan los términos correspondientes a todas las rotaciones que comiencen con fro. Cada rotación apunta a un solo elemento del índice invertido de términos, porque cada rotación pertenece a un sólo término. El término al que reere la rotación se obtiene rotando la rotación hasta llevar el a un extremo, para luego quitarlo. Algoritmo 29 Indexación con léxico rotado. 1 para cada termino distinto: 2 obtener sus rotaciones 3 para cada rotacion: 4 agregar <i(rotacion)> a archivo de lexico rotado (arbol B) 6263 Algoritmo 30 Resolución de consultas con léxico rotado. 1 si hay un solo wildcard: 2 rotar consulta y llevar el wildcard al extremo derecho 3 candidatos = buscar todos los lexicos rotados que comiencen igual, y devolver el termino asociado 4 hacer OR de candidatos 5 buscar documentos que tienen los candidatos 6 7 si hay mas de un wildcard: 8 rotar consulta y llevar un wildcard al extremo derecho 9 1era opcion: 10 candidatos = buscar todos los lexicos rotados que comiencen igual, hasta el primer wildcard 11 2da opcion: 12 separar el termino en tantas partes como wildcards haya 13 candidatos = buscar los lexicos rotados de cada parte 14 devolver AND de candidatos Ventajas Permite resolver consultas de tipo *x, x*, *x*, x*y. Se pueden realizar búsquedas binarias sobre el léxico rotado. Desventajas El léxico rotado debe estar ordenado. Se requiere un índice secundario que ocupa espacio (un término de n caracteres aporta n + 1 rotaciones). 3. Índice secundario de n-gramas: es un índice invertido de n-gramas. Para cada término del léxico se almacenan todos sus n-gramas, para cada n-grama se guarda la lista de punteros a términos que tienen ese n-grama. Por ejemplo: frozen contiene los 2-gramas fr, ro, oz, ze, en. Para reducir los falsos positivos en los resultados, también puede guardarse el caracter de n de término: f, fr, ro, oz, ze, en, n, aunque esta técnica no sirve para 1-gramas. Para buscar el patrón fro* se buscan las listas de términos correspondientes a los digramas f, fr, ro y se hace la intersección de las listas. Cuanto más grande es n, más tamaño ocupa el índice secundario, pero las consultas devuelven menos falsos positivos. Si n es chico, hay muchos más falsos positivos y hay un alto costo de procesamiento. ¾Por qué se producen falsos positivos? Ejemplo: si la consulta es ten*, se descompone en te y en, y eso puede devolver como resultado tense (resultado OK) y enter (falso positivo, contiene los digramas te y en pero no en forma consecutiva). Algoritmo 31 Indexación con n-gramas. 1 archivo temporal = {} // secuencial 2 archivo listas de terminos = {} // secuencial 3 archivo de n-gramas = {} // arbol B 4 5 para cada documento en coleccion: 6 para cada termino en documento: 7 si termino NO esta en vocabulario: 8 agregarlo y obtener su id termino 9 descomponer termino en sus n-gramas 10 para cada n-grama: 11 agregar <n-grama, id termino> a archivo temporal ordenar archivo temporal por "n-grama + id termino" 15 para cada n-grama: 16 offset = agregar lista de id_terminos a "archivo listas de terminos" 17 agregar <n-grama, offset> a "archivo de n-gramas" 6364 Algoritmo 32 Resolución de consultas con n-gramas. 1 separar consulta en sus n-gramas 2 3 para cada n-grama de consulta: 4 terminos candidatos (n-grama) = buscar cada n-grama en índice y devolver sus terminos asociados 5 6 hacer AND de todos los terminos candidatos 7 candidatos = verificar cada termino candidato por falsos positivos contra la consulta 8 devolver OR de candidatos Figura 22: Índice de n-gramas en memoria. Si el léxico está desordenado (para colecciones dinámicas), se pueden aplicar algunas optimizaciones: a) Thresholding: usar un valor límite jo. Cuando la cantidad de candidatos a una consulta cae por debajo de este valor, directamente se accede a los documentos para eliminar falsos positivos. b) Blocking: ablocar el léxico. La ventaja es que disminuye el tamaño del índice secundario, por dos motivos: algunos n-gramas aparecerán varias veces en un bloque, pero solo se necesita una referencia, y los valores de los punteros serán menores y podrán ser representados en menos bits. Cuanto más grandes son los bloques, menos tamaño requiere el índice, pero se necesita más tiempo para acceder al léxico. Figura 23: Índice de n-gramas en memoria. Si el léxico está ordenado (para colecciones estáticas), se pueden aplicar algunas optimizaciones: 6465 1) Comprimir el índice secundario mediante run-length encoding. 2) Ablocar el índice secundario. 3) Usar front coding. 4) Usar búsquedas binarias. Ventajas Desventajas Ocupa menos espacio que un índice de léxico rotado. Pueden haber falsos positivos Consultas de términos parecidos Por ejemplo: ~Swarzeneger. Se utiliza, por ejemplo, cuando no se está seguro de cómo se escribe el término. Distancia de Levenshtein: métrica para medir la diferencia entre dos cadenas de texto. La distancia entre dos strings a y b es la cantidad mínima de ediciones de un caracter (inserciones, supresiones y sustituciones) necesarias para cambiar de una palabra a la otra. Para reducir el cálculo de distancias en la resolución de consultas, se utilizan índices de espacios métricos. Estos calculan muchas distancias al momento de construir el índice. Un espacio métrico se dene como el par (U, d). U es el universo de objetos, y d es una función de distancia tal que d(x, y) 0 para todo (x, y) U, d(x, x) = 0 para todo x U, d(x, y) = d(y, x) para todo (x, y) U, d(x, y) d(x, z) + d(z, y) para todo (x, y, z) U (desigualdad triangular). Objetivo: dada una consulta q U, se pueden querer dos cosas. 1. Los objetos (términos) de U que estén, como máximo, a una distancia r de q. Existen dos formas de resolver esta consulta. Algoritmo 33 Algoritmo de selección de pivotes. 1 pivotes = {} 2 M = maxima longitud de termino en el vocabulario 3 pivotes += {primer termino del vocabulario} 4 para cada termino en vocabulario: 5 si para cada pivote se cumple (d(termino, pivote) >= coef * M ): //coef entre 0.4 y pivotes += {termino} 7 devolver pivotes a) Mediante clusters de objetos: para cada cluster, se le asocian términos y un radio. (Cluster (pivote,radio,(termino, d(termino,pivote)+)) +) Algoritmo 34 Indexar mediante clusters de objetos. 1 para cada termino: 2 para cada pivote: 3 calcular d(termino,pivote) 4 5 para cada termino: 6 cluster asignado = min(pivote : d(termino, pivote)) // politicas de desempate? 7 8 para cada cluster: 9 radio = max (d(termino,pivote)) 6566 Algoritmo 35 Resolver consultas mediante clusters de objetos. 1 C = {} 2 para cada cluster: 3 si ( d(q,pivote ) > r + radio): 4 continuar // Descartamos clusters cuyo radio no interseque con el radio de consulta 5 si no: 6 para cada term en cluster: 7 si ( d(q,pivote) - d(term,pivote) > r): 8 continuar // Descartar terminos que no esten en el radio de la consulta 9 si no: 10 si (d(q,term) <= r) 11 C = C + {term} 12 devolver C b) Mediante SSS (Sparse Spatial Selection): se eligen algunos términos pivotes, y para cada término y para cada pivote, se almacena la distancia del término al pivote. SSS(Firma(d(termino,pivote1),..,d(termino,pivoteK))+) Algoritmo 36 Indexar mediante SSS. 1 para cada termino: 2 para cada pivote: 3 guardar d(termino,pivote) Algoritmo 37 Resolver consultas mediante SSS. 1 C = {} 2 para cada pivote: 3 calcular d(q,pivote) 4 para cada termino de vocab: 5 si para algun pivote se cumple ( d(q,pivote) - d(termino, pivote) > r): 6 continue // Siguiente termino 7 si no: 8 C = C + {termino} 9 10 R = {} 11 para cada Candidato en C: 12 si ( 0 < d(q,candidato) <= r) 13 R = R + {Candidato} 14 devolver R 2. Los k objetos de U que estén más cercanos a q. a) Mediante árboles de aproximación espacial (K NN). 25 Evaluación de un sistema de consultas Para evaluar la efectividad de un sistema de consultas, se utilizan dos estadísticas acerca de los resultados devueltos ante una query: Precisión: cuántos documentos recuperados son relevantes. Mide cuán cerca estamos del objetivo. P = {Relevantes} {Devueltos} {Devueltos} Ejemplo: si de 50 documentos devueltos 35 son relevantes a la consulta, la precisión es = 70 %. 66 67 Recuperación (recall ): cuántos documentos relevantes se recuperaron". Mide el grado de exhaustividad del sistema. {Relevantes} {Devueltos} R = {Relevantes} Ejemplo: si había 70 documentos relevantes a la consulta, y si se devuelven 50 de los cuales solo 35 son relevantes, el recall es de = 50 %. (a) Cuando aumenta la precisión, baja el recall, y viceversa. (b) Precisión y recall. Figura 24: Evaluación de consultas. 26 Implementación Cantidad de documentos Cantidad de términos Cantidad de términos distintos Cantidad de punteros a documentos Cantidad de espacio requerida como máximo N F n f f log 2 n bits Ley de Zipf: modela la distribución de frecuencias de las palabras de un léxico. Unas pocas palabras (las stopwords) aparecen muchas veces, y muchas palabras aparecen pocas veces. La palabra más frecuente aparece el doble de veces que la segunda palabra más frecuente, el triple de veces que la tercera palabra más frecuente, etc. Sean: N términos distintos, k la frecuencia, s el valor del exponente que caracteriza la distribución f(k; s, N) = 1/k s N n=1 (1/ns ) Ley de Heaps: el número de términos únicos V de una colección con N términos es aproximadamente N. De forma más general: V = C N β donde C y β (0, 1) dependen del tipo de texto. En la práctica, C [5, 50] y β (0,4; 0,6). Además, V suele ser menos del 1 % de N. Es decir: el vocabulario entra en memoria RAM (5 MB para 1 GB de texto). 6768 26.1 Compresión del léxico Transformar las palabras antes de indexarlas. 1. Usar una lista de stopwords, para no indexar palabras que se repiten mucho. Ejemplos: el, la, que, ellos, nosotros, y frases como sin embargo, a pesar de, etc. Ventajas Desventajas El índice ocupa menos espacio. Muchas consultas incluyen stopwords, y solo podrían resolverse analizando todos los documentos. No tiene sentido eliminar stopwords si el índice invertido se almacena comprimido, porque los punteros de las palabras más frecuentes pueden almacenarse con muy pocos bits. No tiene sentido eliminar stopwords si se usan índices de rmas o bitmaps. Las stopwords se deben guardar en un archivo, y cargarlas en memoria al momento de indexar. 2. Usar case folding y eliminar signos de puntuación, acentos, etc. 3. Usar stemming: guardar solo el tallo de las palabras. Ventajas Desventajas Aumenta el recall. Baja la precisión. 4. Reducción de plural a singular: person# representa persona y personas. 5. Reducción de género y número de adjetivos: buen? representa buen, bueno, buena, buenos, buenas. 6. Sustituir palabras por sus sinónimos. (Luego hay que modicar la consulta también). Métodos para almacenar el léxico ordenado: 1. Términos de longitud ja: se destina un espacio jo para cada término, equivalente a la longitud del término más largo x. Ventajas Puede hacerse búsqueda binaria (término: x bytes, puntero a lista invertida: 4 bytes) Desventajas Ocupa mucho espacio 2. Concatenación de términos: todos los términos se almacenan de forma contigua, y se utilizan punteros para acceder a ellos. (puntero a archivo de términos: 4 bytes, puntero a lista invertida: 4 bytes) 3. Front coding: aprovecha el hecho de que el vocabulario está ordenado alfabéticamente y que los comienzos se repiten. En el léxico (hojas del árbol B#) se almacenan registros con la siguiente estructura: (# chars iguales al anterior: 1 byte, # chars distintos al anterior : 1 byte, chars distintos, puntero a lista invertida: 4 byt El primer registro de cada hoja debe almacenar el término completo: (longitud del término: 1 byte, término: longitud, puntero a lista invertida : 4 bytes) Ejemplo: 6869 codazo, codearse, codera, codicia, codiciar, codiciosa, codicioso, codicar, codigo 6 codazo# 3 5 earse# 4 2 ra# 3 4 icia# 7 1 r# 6 3 osa# 8 1 o# 4 5 car# 4 2 go# Ventajas El léxico ocupa menos espacio. Desventajas La búsqueda de un término implica descomprimir secuencialmente la hoja. 4. Front coding parcial o por secciones: En el léxico (hojas del árbol B#) se almacenan registros con la siguiente estructura: (# chars iguales al anterior, # chars distintos al anterior, chars distintos, puntero a lista invertida)+) El primer registro de cada hoja, y cada n registros (n # registros en hoja) debe almacenar el término completo: (longitud del término,término,puntero a lista invertida) Ejemplo: codazo, codearse, codera, codicia, codiciar, codiciosa, codicioso, codicar, codigo 6 codazo# 3 5 earse# 4 2 ra# <p1> 7 codicia# 7 1 r# 6 3 osa# <p2> 9 codicioso# 4 5 car# 4 2 go# <p3> 9 3 Las búsquedas comienzan desde la derecha. Hay 3 campos de control: a) 3: cantidad de secciones en la hoja b) 9: cantidad de términos en la hoja c) <p3>: posición relativa de <p2> Ventajas Se puede hacer una búsqueda n aria del léxico. 5. Hashing perfecto y mínimo: no se guardan los términos. a) Se utiliza una función de hashing que es: Desventajas Desperdicia más espacio que el front coding. 1) Perfecta: no produce colisiones. 2) Mínima: genera todos los valores posibles del espacio de direcciones. 3) Preservadora de orden: sean los strings s 1 y s 2. Entonces s 1 < s 2 f(s 1 ) < f(s 2 ) Compresión de listas invertidas 1. d gaps: la lista invertida para el término t de la forma f t ; d 1, d 2,..., d ft se almacena en forma ascendente mediante diferencias sucesivas: f t ; d 1, d 2 d 1, d 3 d 2,..., d ft d ft 1 Como son más comunes las d gaps pequeñas, se puede utilizar codicación de longitud variable. 2. Codicación alineada a bytes: representa números naturales con la mínima cantidad de bytes, usando los 2 bits más signicativos del código para indicar la cantidad de bytes empleados. Rango de números representable Codicación en bytes xxxxxx xxxxxx xxxxxxxx xxxxxx xxxxxxxx xxxxxxxx 6970 Métodos que describen la distribución de probabilidad de las d gaps: 1. Globales: un mismo modelo para comprimir todas las listas invertidas. a) Parametrizados 1) Bernoulli: utiliza como parámetro la densidad de punteros del archivo invertido. La probabilidad de cada distancia d gap es la distribución geométrica pr[x] = (1 p) x 1 p, donde p = f N n es la probabilidad de que un documento al azar posea un término al azar. 2) Frecuencia observada: utiliza como parámetro la densidad exacta de punteros del archivo invertido. b) No parametrizados 1) Binario: La probabilidad de cada distancia d gap es uniforme (pr[x] = 1 N ). Un entero x se codica como x en binario de log 2 N bits (N es la cantidad de documentos). 2) Unario: La probabilidad de cada distancia d gap es pr[x] = 2 x. Un entero x 1 se codica como x 1 bits en cero (uno) seguido de un bit en uno (cero). Ejemplo: 3) Gamma (γ): (x = 5) en unario = 0000 }{{} 1 4 bits en cero La probabilidad de cada distancia d gap es pr[x] 1 2x. 2 Un entero x se codica como el número (1 + log 2 x ) en unario, concatenado con el número (x 2 log 2 x ) en binario, en log 2 x bits. (La parte en unario especica cuántos bits se necesitan para codicar a x, y la parte en binario codican x en esa cantidad de bits). Receta: a Escribir el número en binario. b Restarle 1 a la cantidad de bits escritas en el paso anterior, y agregarle esa cantidad de ceros al principio. Ejemplo: (x = 5) en gamma = }{{} 5 en binario Decodicación: extraer el código unario c u, y tratar los próximos c u 1 bits como un número binario, para obtener el segundo valor c b. El valor de x se calcula como x = 2 cu 1 + c b Ejemplo anterior: = = 5 4) Delta (δ): La probabilidad de cada distancia d gap es pr[x] 1 2x(log x) 2. Un entero x se codica como el número (1+ log 2 x ) en gamma, concatenado con el número (x 2 log 2 x ) en binario, en log 2 x bits. (La parte en gamma especica cuántos bits se necesitan para codicar a x, y la parte en binario codican x en esa cantidad de bits). La codicación en δ ocupa más espacio que la codicación γ cuando x < 15. Cuando x 15, δ ocupa menos espacio. El 0 no se puede representar. 7071 Ejemplo: (x = 5) en delta = (1 + 2) en gamma, (5 2 2 ) en binario de 2 bits = 011, 01 Decodicación: extraer el código gamma c g, y tratar los próximos c g 1 bits como un número binario, para obtener el segundo valor c b. El valor de x se calcula como x = 2 cg 1 + c b 2. Locales: las listas invertidas de cada término se comprimen de acuerdo a un parámetro (generalmente, la frecuencia del término). Comprimen mejor que los métodos globales, pero son más difíciles de implementar. a) Bernoulli: implementado con códigos de Golomb, que aproxima una codicación con Human: usa un parámetro ajustable g para codicar un entero x > 0 en dos partes: el cociente q y el residuo r. x q + 1 en unario, donde q = g. r = x qg en binario de log 2 g bits. Puede demostrarse que si g satisface (1 p) g + (1 p) g+1 1 < (1 p) g 1 + (1 p) g el código es óptimo. (Es decir, g se relaciona con la probabilidad p de que un término se encuentre en un documento). Entonces el parámetro g óptimo es, para cada término: g optimoterm = ( ) log2 (2 p term ) round log 2 (1 p term ) p term = # docs que tienen el term # docs b = log 2 g y = 2 b g Si r < y = r en b 1 bits Si r y = y + r en b bits Nota: si p > 0,5, el código de Golomb es más efectivo si el archivo invertido se complementa antes de comprimir. El parámetro g se debe almacenar al comienzo de cada lista invertida, para poder descomprimirla. Problema: si a un término le agrego un nuevo documento, hay que volver a codicar la lista afectada (porque cambió p term y por ende g). Decodicación: Se tiene la siguiente cadena y si sabe que contiene 2 números con g = 385. Primer número x 1 : Prejo: q + 1 = 110 = 3 = q = 2 b = log 2 g = 9 y = 2 b g =72 Sujo: b 1 bits siguientes al prejo = = 129. Como es mayor/igual a y, tomamos un bit más = = 258. r = sufijo y = 131 x 1 = g q + r = 901 Segundo número x 2 : Prejo: q + 1 = 10 = 2 = q = 1 Sujo: b 1 bits siguientes al prejo = = 13. Como es menor a y, ese es el sujo. r = sufijo = 13 x 2 = g q + r = 398 Figura 25: Unario, delta, gamma y Golomb 26.3 Colecciones dinámicas La organización de las listas invertidas en el archivo secuencial depende de la política de actualización del índice: Actualizaciones por reconstrucción total (para actualizaciones poco frecuentes): Las listas invertidas son registros de longitud variable. El oset en el archivo del léxico es el oset del comienzo del registro de longitud variable. Actualizaciones incrementales (para actualizaciones muy frecuentes): Las listas invertidas son bloques de tamaño jo, con un campo extra que dice el término de la lista. Bloque (cantlistas : 1, (offsetlista) cantlistas, Lista (idt : 2, cantdocs : 2, (doc : 2) cantdocs) cantlistas) Si el término leído no estaba en el índice: El archivo secuencial de términos se actualiza normalmente. Se inserta la lista invertida en un bloque. Para esto, podría ser necesario relocalizar listas ya existentes en un bloque, para hacer lugar a la nueva. Si el término leído estaba en el índice: Se actualiza la lista invertida del término en el bloque. El oset en el archivo del léxico es el oset del comienzo del bloque. Los bloques pueden enlazarse, para permitir almacenar listas invertidas muy grandes. 72 73 27 Google y las consultas por Internet Un documento es una página web. Problemas de las búsquedas en Internet: 1. Internet es una colección heterogénea no controlable, de enormes proporciones. Hay que eliminar enlaces muertos, páginas duplicadas, o páginas que tengan spam. 2. Hay que indexar contenido no indexable (imágenes, etc.). 3. El proceso de crawling puede aumentar el tráco de los servidores de las páginas web 4. No es posible indexar todas las páginas web existentes, por dos razones: a) El espacio de almacenamiento es limitado, b) En cierto punto el crawler deberá visitar páginas ya indexadas para buscar cambios. 5. Hay muchos errores en los documentos y en las consultas 6. Usar la información presente en hipertexto para producir mejores resultados 7. Se debe automatizar la indexación, porque los índices armados y mantenidos por personas son subjetivos, caros para armar, lentos para mejorar, y no cubren todos los temas 8. No se puede medir el recall 9. Usuarios inexpertos Se necesitan tres cosas: 1. Algoritmos de crawling rápidos, 2. Mecanismos que almacenen ecientemente los índices y, opcionalmente, los documentos mismos 3. Algoritmos de resolución de consulta rápidos y que devuelvan resultados precisos. Figura 26: Arquitectura de Google. 7374 27.1 Crawling Crawling: recorrer páginas web recursivamente para agregarlas al índice, obteniendo las páginas más importantes primero, y visitando páginas frecuentemente para estar al tanto de los cambios. Algoritmo 38 Algoritmo de crawling 1 cola de prioridad = {} // la cabeza de esta cola tiene mas prioridad que el resto 2 3 indexar(seed url): 4 si (url se puede indexadar) // verifica robots.txt 5 si (url no fue indexada) // verifica duplicados usando checksums 6 guardar url 7 para cada url dentro de seed url 8 agregar url a la cola de prioridad 9 10 remover url de cola prioridad e indexarla El proceso de crawling se hace con cientos de máquinas distribuidas. Una función de hashing determina qué máquina debe indexar qué URL Storing Google guarda los documentos que indexa en forma comprimida. Google usa datos de proximidad para las búsquedas. Google guarda datos de presentación visual, como las negritas y el subrayado de palabras para modicar el peso de las palabras Searching La web, como conjunto de páginas relacionadas entre sí mediante links, puede ser representada mediante un grafo dirigido, en el que cada nodo es una página web, y cada arista es un link. Para rankear una página se utilizan dos cosas: 1. Estructura de links, 2. Anchor text (lo que aparece en los links). a) Proveen una descripción muy buena de las páginas a las que apuntan b) Proveen una descripción de documentos no indexables (imágenes, programas, etc.) Dada una página web x, puede denirse su importancia, I(x), en alguna de las siguientes formas: 1. Similitud con una consulta q. 2. Contador de citaciones (backlink count), es la cantidad de links en la Web hacia x. Este método asume que todos los links son iguales. 3. Forward link count, es la cantidad de links que emanan de x. Bajo esta métrica, los sitios webs como ser los directorios son muy importantes. 4. Localización. I(x) es una función de la localización de x, no de sus contenidos. Por ejemplo, páginas que terminan en.com son muy importantes, o páginas que contengan el string home. 7475 5. PageRank, es la suma ponderada de los backlinks. donde: P R i (x) = (1 α) + α n i=1 ( ) P R(Ti ) C(T i ) P R i (x) es el PageRank de la página web x para la iteración i (P R 0 (x) = 1 para todo x). P R(x) = 1 El algoritmo es iterativo hasta que los valores converjan. α (0, 1) es el factor de amortiguación, es constante. En general, α = 0,85. T i es una página que posee un link a x, una citación de x. C(x) es la cantidad de links hacia afuera de una página x. x PageRank es una medida objetiva de la importancia de una página web, contando las citaciones de la misma. PageRank puede pensarse como un modelo del comportamiento de un usuario. Asumir que hay un usuario que recibe una página web al azar, y hace clics continuamente, hasta que se aburre y comienza en otra página aleatoria. La probabilidad de que el usuario visite la página x es P R(x). La probabilidad de que el usuario se aburra y comience el proceso de nuevo es α. Algoritmo 39 Resolución de consultas. 1 Parse the query. 2 Convert words into wordids. 3 Seek to the start of the doclist in the short barrel for every word. 4 Scan through the doclists until there is a document that matches all the search terms. 5 Compute the rank of that document for the query. 6 If we are in the short barrels and at the end of any doclist, seek to the start of the doclist in the full ba 7 If we are not at the end of any doclist go to step 4. 8 Sort the documents that have matched by rank and return the top k. 28 Algoritmo de construcción de índice 1 construir_indice (coleccion, bool consultas_exactas, bool con_posiciones, bool con_ngramas, bool con_lexrot): 2 // Archivos 3 archivo de registros "tabla_id_docs.dat" // <documento> o <ruta al documento> 4 arbol b-sharp "lexico.dat" // <i(termino), id termino, offset lista invertida> 5 archivo secuencial "terminos_por_aparicion.dat" // <termino> 6 7 if (con_posiciones): 8 archivo temporal secuencial "posiciones_terms_en_docs.dat" // <id term, id doc, pos> 9 archivo secuencial "lista_posiciones.dat" // <m, pos1, pos2,..., pos m> 10 if (consultas_exactas): 11 archivo secuencial "listas_invertidas.dat" // <cantidad docs, <id doc, offset lista pos>+ > 12 else: 13 archivo secuencial "listas_invertidas.dat" // <cantidad docs, <id doc, freq norm, offset lista pos>+ > if (con_posiciones and not consultas_exactas): 16 archivo temporal "frecuencias_terminos_en_docs.dat" // <id term, id doc, freq, offset lista posiciones> 17 archivo temporal "frecuencias_normalizadas_terminos_en_docs.dat" // <id term, id doc, freq norm, offset li 18 archivo temporal "normas.dat" // <norma> if (con_ngramas): 21 archivo temporal secuencial "lista_n_gramas.dat" // <n-grama, id term> 22 archivo b-sharp "n-gramas.dat" // <i(n grama), freq, offset lista terminos por ngrama" 23 archivo secuencial "lista_terminos_por_ngrama.dat" // <id term 1,..., id term freq> 7576 24 25 if (con_lexrot): 26 archivo b-sharp "lexico_rotado.dat" // <i(rotacion), id term> // Algoritmo 29 para cada doc en coleccion: 30 "id doc" = agregar doc a "tabla_id_docs.dat" 31 para cada term en doc: pos = posicion de term en doc 34 if (term esta en "lexico.dat"): 35 obtener "id term" de "lexico.dat" 36 else: 37 agregar term al final de "terminos_por_aparicion.txt" 38 "id term" = posicion de term en "terminos_por_aparicion.txt" 39 agregar "i(term), id term, NULL" a "lexico.dat" 40 if (con_lexrot): 41 crear rotaciones de term 42 para cada rotacion: 43 agregar "i(rotacion), id term" a "lexico_rotado.dat" if (con_ngramas): 46 descomponer term en n-gramas 47 para cada n-grama: 48 agregar "n-grama, id term" a "lista_n_gramas.dat" if (con_posiciones): 51 agregar "id doc, id term, pos" a "posiciones_terms_en_docs.dat" ordenar "posiciones_terms_en_docs.dat" por "id doc + id term + pos" para cada id doc en "posiciones_terms_en_docs.dat": 56 max freq term = 1 57 para cada id term en "posiciones_terms_en_docs.dat": 58 offset = agregar "(freq term, (pos)+)" a "lista_posiciones.dat" 59 agregar "(id doc, id term, freq term, offset)" a "frecuencias_terminos_en_docs.dat" max freq term = (max freq term > freq term)? max freq term, freq term agregar "max freq term" a "normas.dat" ordenar "frecuencias_terminos_en_docs.dat" por "id doc + id term" para cada id doc en "frecuencias_terminos_en_docs.dat" 68 norma = leer_registro "id doc" de "normas.dat" 69 para cada id term en "frecuencias_terminos_en_docs.dat" 70 freq_norm = freq term / norma 71 agregar "(id term, id doc, freq_norm, offset)" a "frecuencias_normalizadas_terminos_en_docs.dat" if (consultas_exactas): 74 ordenar "frecuencias_normalizadas_terminos_en_docs.dat" por "id term + id doc" 75 else: 76 ordenar "frecuencias_normalizadas_terminos_en_docs.dat" por "id term + (-freq_norm)" para cada term en "terminos_por_aparicion.dat": 79 para cada id term en "frecuencias_normalizadas_terminos_en_docs.dat": // <id term, id doc, freq norm, offs 80 if (consultas_exactas): 81 posld = agregar "(freq, (id doc, offset)+)" a "listas_invertidas.dat" 82 else: 83 posld = agregar "(freq, (id doc, freq_norm, offset)+)" a "listas_invertidas.dat" 84 finally: 85 actualizar "lexico.dat" con "posld" para term if (con_ngramas): 88 ordenar "lista_n_gramas.dat" por "n grama + id term" 89 para cada n grama de "lista_n_gramas.dat": 90 offset = agregar todos los "id term" a "lista_terminos_por_ngrama.dat" 91 agregar "n grama, cantidad id terms, offset" a "n-gramas.dat" 7677 Parte IV Compresión 29 Introducción a la compresión Teoría de la información: estudio de los procesos que se realizan sobre la información. Provee una medida de la información. En un mensaje, hay más información cuando la probabilidad de un mensaje es baja. Por ejemplo, si leemos el string Argentin, la información que recibimos es la misma que si leemos Argentina. Compresión: representación de información utilizando menos bits. Hay dos tipos de algoritmos compresores: Con pérdida / lossy / compactadores: se pierde información, se gana tasa de compresión. Se utiliza para comprimir imágenes, audio o video, en donde la pérdida de calidad no es notoria. Sin pérdida / lossless: estos compresores permiten, a partir del archivo comprimido, recrear el archivo original tal cual era. Compresores estadísticos: se basan exclusivamente en la probabilidad de aparición de los símbolos. Compresores no estadísticos RLE (Run Length Encoding): codican secuencias repetidas. Predictores Por sustitución Compresión estática Compresión dinámica Cantidad de pasadas al archivo Una pasada para obtener estadísticas del archivo, y otra pasada para Una pasada para obtener estadísticas y para comprimir. comprimir. Velocidad de compresión Lento. Rápido. Nivel de compresion Muy bueno. Bueno. Cuadro 5: Compresión estática y dinámica. Entropía: grado de desorden de una fuente. Sea una fuente F, la entropía de F se dene como H(F ) = n P i ( log 2 (P i )) i=0 Códigos prejos: código con la propiedad de prejo: ninguna palabra de código es prejo de cualquier otra palabra de código del conjunto. Ejemplos: 1. A=0, B=10, C=11 tiene la propiedad de prejo. 2. A=0, B=1, C=10, D=11 no tiene la propiedad de prejo, porque 1 es prejo de 10 y de78 30 Marca de n de archivo 1. Comprimir el archivo. Agregar un 1 al nal, y completar con ceros hasta el nal del byte. El descompresor empezará por el nal, leyendo los bits en cero y eliminándolos. Cuando llega al 1 lo elimina, se detiene, y comienza a descomprimir por el principio. 2. Indicar la longitud del archivo comprimido al inicio. Este método no sirve para los compresores dinámicos, puesto que la longitud del archivo no se conoce hasta procesarlo todo. 3. Utilizar un caracter extra como EOF. 31 Compresión por Human Es un compresor estadístico. Se construye un árbol de símbolos, y a cada símbolo se le asigna un código binario que se deduce recorriendo el árbol. La codicación Human es una técnica óptima para construir códigos prejo de longitud variable Human estático Algoritmo 40 Armado de árbol Human. 1 Crear un nodo hoja para cada símbolo. Agregar cada nodo a la cola de prioridad. 2 Mientras haya más de 1 nodo en la cola: 3 Quitar los 2 nodos de menor frecuencia de la cola. 4 Crear un nuevo nodo con los 2 nodos anteriores como hijos. Su frecuencia es igual a la suma de las frecuencias 5 Agregar el nuevo nodo a la cola de prioridad. 6 El nodo restante es la raíz; el árbol está completo. Algoritmo 41 Human estático: compresor 1 Primera pasada al archivo para armar una tabla de frecuencias que contiene como clave el símbolo, y como valor 2 Generación del árbol. 3 Emitir la tabla de frecuencias al archivo comprimido. 4 Segunda pasada al archivo: mientras queden caracteres sin leer del archivo: 5 Leer el caracter siguiente, 6 Emitir su código, que se obtiene del árbol. Algoritmo 42 Human estático: descompresor. 1 Leer la tabla de frecuencias. 2 Generar el árbol a partir de la tabla. 3 Mientras queden códigos sin leer del archivo comprimido: 4 Leer el código siguiente 5 Buscarlo en el árbol 6 Emitir su símbolo correspondiente. 7879 31.2 Human dinámico Algoritmo 43 Human dinámico: compresor. 1 Armar una tabla de frecuencias que incluye todos los caracteres posibles, todos con frecuencia igual a 1. 2 Generar el árbol. 3 Mientras queden caracteres sin procesar: 4 Leer el caracter siguiente. 5 Comprimirlo. 6 Actualizar la tabla de frecuencias. 7 Rearmar el árbol. 7980 Parte V Criptografía 32 Introducción Esteganografía: esconder información dentro de otra información. Criptografía: ciencia que estudia la transformación de un mensaje en un código, de forma tal que a partir de ese código solo algunas personas puedan recuperar el mensaje original. Para ello se utiliza una palabra clave. El código resultante solo puede ser descifrado por las personas que conozcan la palabra clave. Usos de la Criptografía: 1. Encriptación de información crítica para a) almacenarla en computadoras b) enviarla por una red insegura 2. Certicación de identidad Objetivos de la Criptografía: Condencialidad: poder decidir quién puede acceder a cierta información. Integridad: poder asegurar que un mensaje no fue corrompido en la transmisión (por error o con intención), o poder darse cuenta cuando lo fue. Autenticación: poder asegurar que algo es lo que dice ser. Sistemas de autenticación: Basados en algo conocido (ejemplo: una contraseña). Basados en algo poseído (ejemplo: una tarjeta de identidad). Basados en una característica del usuario (ejemplo: huellas dactilares). No repudio: evitar que el emisor o el receptor de un mensaje nieguen, respectivamente, la emisión o recepción del mismo. No repudio = Autenticación Criptosistema: formado por cinco elementos 1. M es el conjunto de todos los posibles mensajes o textos planos (plaintext) que podemos querer encriptar. Cuanta más entropía tenga el mensaje (H(M) 1), más difícil será romper el criptosistema. 2. C es el conjunto de todos los posibles códigos que podemos obtener al encriptar ( cyphertext). 3. K es el conjunto de todas las claves que podemos usar. El tamaño de este conjunto es el keyspace o K. Pueden existir ciertas claves débiles tales que E k (E k (m)) = m Pueden existir ciertas claves semi débiles tales que E k1 (E k2 (m)) = m K = M implica seguridad perfecta, y el reuso de claves destruye esta propiedad (porque son vulnerables a ataques por replay). 4. E es la función de encriptación. Existe una transformación diferente E k para cada valor posible de la clave k. 80 81 5. D es la función de desencriptación. Todo criptosistema debe cumplir: D k (E k (m)) = m Principio de Kerckho: un criptosistema debería ser seguro incluso cuando se conoce todo el algoritmo, excepto la clave. No se debe conar en seguridad basada en obscuridad. Criptoanálisis: romper un criptosistema, obtener el mensaje a partir del código cifrado. 33 Algoritmos de encriptación Figura 27: Taxonomía de algoritmos. Se los divide en dos grupos: Algoritmos de clave privada o simétricos. Se utiliza una sola clave para encriptar y desencriptar. Encriptación: mensaje + clave = código Desencriptación: código + clave = mensaje Desventajas: ¾Cómo transmitir la clave de forma segura? ¾Qué pasa si se roban la clave? Para establecer una comunicación segura entre n personas requiere una clave para cada par de usuarios: en total, se necesitan n(n 1) 2 claves. Son algoritmos rápidos. Se basan en la confusión y la difusión de la redundancia del mensaje. Algoritmos de clave pública o antisimétricos. Se utilizan dos claves para encriptar, una es privada y la otra es pública. Cada persona tiene un par de estas claves. El conocimiento de la clave pública no debería permitir calcular la clave privada. Estos algoritmos suelen basarse en problemas matemáticos cuyo tiempo de resolución sea muy alto. Los métodos criptográcos de este tipo garantizan que un par de claves no se puede generar más de una vez. 81 Mostrar más
Tema 1: Implementación del sistema de archivos 1. Introducción 2. Implementación 3. Estructura del almacenamiento secundario Dpto. Tema Lenguajes 1: Implementación y Sistemas del Informáticos. sistema Más detalles NTFS (Windows NT) Principales características que se deseaba que tuviera. Manejo de disco: $MFT Master File Table
NTFS (Windows NT) Principales características que se deseaba que tuviera Soporte para discos grandes FAT usa entradas de 16 bits para referenciar clusters (puede referencia hasta 2^16 =65536 clusters, Más detalles Contenido. Sistema de archivos. Operaciones sobre archivos. Métodos de acceso a archivos. Directorio. Sistema de archivos por capas.
Contenido Sistema de archivos Operaciones sobre archivos Métodos de acceso a archivos Directorio Sistema de archivos por capas Espacio libre Sistema de archivos Proporciona el mecanismo para el almacenamiento Más detalles Los dispositivos de almacenamiento secundario pueden ser muy distintos (discos rígidos, memorias flash, DVD, magnetic tape)
Introducción El almacenamiento secundario es necesario para: - Almacenar gran cantidad de datos - Almacenar datos persistentes (válidos entre sesiones/reinicios) - Compartir datos (si la protección de Más detalles TEMA 7: EL SISTEMA DE ARCHIVOS
TEMA 7: EL SISTEMA DE ARCHIVOS 1. Objetivos y funciones del sistema de archivos Sistema de archivos: Subsistema del S.O. encargado de la gestión de la memoria secundaria (concretamente del almacenamiento Más detalles Sistema de Ficheros. Sistemas Operativos - ITIG. Álvaro Polo Valdenebro. Abril 2009. apoloval@gsyc.es. GSyC - 2009 Introducción 1
Sistema de Ficheros Sistemas Operativos - ITIG Álvaro Polo Valdenebro apoloval@gsyc.es Abril 2009 GSyC - 2009 Introducción 1 c 2009 GSyC Algunos derechos reservados. Este trabajo se distribuye bajo la Más detalles Convivencia. Gestión del Sistema de Archivos
Convivencia Gestión del Sistema de Archivos Dra. Carolina Carolina Mañoso Mañoso Dpto. Dpto. Imformática Informática y y Automática.UNED Introducción Se necesitan tres condiciones para el almacenamiento Más detalles Gestión de Ficheros y Directorios
Gestión de Ficheros y Directorios Transparencias basadas en el libro de referencia: Sistemas operativos. Una visión aplicada. J. Carretero, F.García, P. de Miguel, F. Pérez. McGraw Hill 2001 Curso 2005-2006 Más detalles Archivos. Teoría de Sistemas Operativos. Archivos. Archivos. Archivos. Archivos. Administración de Archivos
Teoría de Sistemas Operativos Administración de Sistemas de :: punto de vista del usuario Nombre Consiste en una serie de símbolos (letras y números principalmente). Sirven de referencia para el usuario Más detalles Sistemas de ficheros en Servidores de Información multimedia
Sistemas de ficheros en Servidores de Información multimedia 2º Ingeniero Técnico de Telecomunicación Imagen y Sonido Departamento de Ingeniería Telemática Universidad Carlos III de Madrid 2 Indice Concepto Más detalles PARTICIONES Y FORMATOS
PARTICIONES Y FORMATOS 1. Función de un disco duro Un disco duro es un dispositivo que permite el almacenamiento y recuperación de grandes cantidades de información. Los discos duros forman el principal Más detalles Información básica. Qué es un disco duro?
Este capítulo presenta conceptos que usted debe entender para utilizar Drive Image con éxito. Entre ellos se incluyen: Qué es un disco duro? Cómo se almacenan y recuperan los datos? Qué es el formateo Más detalles 6 Sistemas de Archivos
6 Sistemas de Archivos Conceptos generales Archivos Directorios Semánticas de consistencia 1 Persistencia de datos Los sistemas de archivos implementan el almacenamiento persistente - los datos creados Más detalles Unidad 2: Gestión de Memoria
Unidad 2: Gestión de Memoria Tema 3, Gestión de Memoria: 3.1 Definiciones y técnicas básicas. 3.2 Gestión de memoria contigua: Partición, fragmentación, algoritmos de ubicación... 3.3 Paginación: Estructura Más detalles TEMA 4. SISTEMA DE ARCHIVOS
TEMA 4. SISTEMA DE ARCHIVOS 4.1. Características del sistema de archivos de UNIX 4.2. Estructura general de un sistema de archivos de UNIX 4.3. Representación interna de los archivos en UNIX 4.3.1. El Más detalles Unidad 1 Discos Rígidos Sistemas de Archivos y Particiones.
Unidad 1 Discos Rígidos Sistemas de Archivos y Particiones. Una unidad de disco rígido puede tener uno o más discos de aluminio llamados platos, que tienen sus dos lados recubiertos por una capa de cromo Más detalles Sistemas de Archivos Implementación. Módulo 11. Departamento de Informática Facultad de Ingeniería Universidad Nacional de la Patagonia San Juan Bosco
Sistemas de Archivos Implementación Módulo 11 Departamento de Informática Facultad de Ingeniería Universidad Nacional de la Patagonia San Juan Bosco Objetivos Describir los detalles locales de la implementación Más detalles 2. Sistema Operativo Windows
2. Sistema Operativo Windows 2.1 Introducción al S.O. Windows NT y Windows 2000 2.2 Subsistema de Archivos 2.3 Subsistema de Procesos 2.4 Gestión de Memoria Dpto. Lenguajes Tema y 2: Sistemas 2. Sistema Más detalles Almacenamiento y Recuperación de la Información
Almacenamiento y Recuperación de la Información Estructuras basicas de archivos Archivos Secuenciales 2do Semestre 2005 Wenceslao Palma M. www.inf.utfsm.cl/~wpalma/ari Una estructura Más detalles Tema 5. Sistemas de Ficheros
Tema 5 Sistemas de Ficheros Sistemas Operativos Tema 5 Sistemas de Ficheros p. 1 Índice 1. Introducción (Tanenbaum [C6.Introducción]) 2. Ficheros (Tanenbaum [C6.1]) 3. Directorios (Tanenbaum [C6.2]) 4. Más detalles TEMA 6: GESTIÓN DE ENTRADA/SALIDA
1. Introducción TEMA 6: GESTIÓN DE ENTRADA/SALIDA Función principal de un S.O.: controlar todos los dispositivos de E/S de la computadora. El Subsistema de E/S se encarga de Emitir órdenes a los dispositivos Más detalles Gestion de archivos. Problemas al almacenar datos sólo en la memoria:
Gestion de archivos Problemas al almacenar datos sólo en la memoria: 1. El tamaño está limitado por el tamaño de la memoria qué pasa con aplicaciones que necesiten acceder a gran cantidad de información? Más detalles Persistencia de datos
Sistemas de archivos Interfaz de los SAs: I. Archivos y directorios Implementación: II. Estructuras de datos III. Métodos de asignación IV. Gestión del espacio libre V. Cachés de disco VI. Archivos proyectados Más detalles TEORÍA DE SISTEMAS OPERATIVOS Gabriel Astudillo Muñoz ALMACENAMIENTO JERARQUÍA DE MEMORIA PROBLEMA
TEORÍA DE SISTEMAS OPERATIVOS Gabriel Astudillo Muñoz ALMACENAMIENTO JERARQUÍA DE MEMORIA Tiempo de acceso Capacidad PROBLEMA La mayoría de aplicaciones necesitan almacenar y recuperar información. Un Más detalles Capítulo 12: Indexación y asociación
Capítulo 12: Indexación y asociación Conceptos básicos Índices ordenados Archivos de índice de árbol B+ Archivos de índice de árbol B Asociación estática Asociación dinámica Comparación entre indexación Más detalles Administración de memoria: Funciones y operaciones
Administración de memoria: Funciones y operaciones Facultad de Ingeniería, UNAM Instituto de Investigaciones Económicas, UNAM Índice Introducción 1 Introducción 2 3 4 5 El administrador de memoria Es otra Más detalles Introducción a los sistemas de archivos FAT, HPFS y NTFS
Introducción a los sistemas de archivos FAT, HPFS y NTFS RESUMEN En este artículo se explican las diferencias entre FAT, HPFS y NTFS en Windows NT, así como sus ventajas y desventajas. Se divide en las Más detalles Componente del sistema operativo que maneja el acceso a los archivos.
HFS (MAC) Hierachical File System File Manager Componente del sistema operativo que maneja el acceso a los archivos. Finder Parte del sistema operativo que maneja la búsqueda de archivos a ser presentados. Más detalles Organización y acceso a los datos
Organización y acceso a los datos Bases de Datos 2 - Tecnologo de Informatica Outline 1 Almacenamiento en disco Medios de almacenamiento Dispositivos de almacenamiento secundario 2 Estructuras básicas Más detalles Qué es un disco duro?
C O N C E P T O S B Á S I C O S S O B R E D I S C O S D U R O S Este documento describe algunos conceptos básicos sobre cómo particionar discos duros. Algunas secciones contienen consejos para utilizar Más detalles Tema 5. Sistemas de ficheros avanzados
Departamento de Ingeniería y Tecnología de Computadores Universidad de Murcia Índice 1 2 3 Sistemas de ficheros transaccionales Sistemas de ficheros con estructura de registro 4 Rendimiento de las operaciones Más detalles Tema 3. Estructura física y lógica del Disco Duro
1.-FUNCIÓN DE UN DISCO DURO... 2 2. ESTRUCTURA FÍSICA... 2 2.1 Elementos de un disco duro... 2 2.2 Funcionamiento de una unidad de disco duro... 2 2.3. Estructura física: cabezas, cilindros y sectores... Más detalles Universidad de Valladolid
Universidad de Valladolid Departamento de Informática Escuela Técnica Sup. de Ingeniería Informática Camino del Cementerio s/n. Valladolid Tel.:(983) 423669 Fax:(983) 423671 Cuestiones aparecidas en los Más detalles NOCIONES SOBRE DISCOS DUROS
NOCIONES SOBRE DISCOS DUROS Dpto. Electrónica I.E.S. los Viveros MBR, particiones, volumenes, formatos, son conceptos que tendremos que tener claro si pretendemos gestionar adecuadamente nuestros discos Más detalles Ingeniería Informática. Curso 3º. Sistemas Operativos Examen Final. TEORIA. 4 de Septiembre de 2009
Ingeniería Informática. Curso 3º. Sistemas Operativos Examen Final. TEORIA. 4 de Septiembre de 2009 1. [PROCESOS] a) Considerar el siguiente código: void main() { int j=10; pid_t pid; for (int i=0; i Más detalles CAPITULO 6. Sistema Operativo Windows NT/2000/XP. Version 3
CAPITULO 6 Sistema Operativo Windows NT/2000/XP AGENDA Contrastes de Windows 9X Herramientas del sistema Proceso de instalación Instalación de Windows 2000 Instalaciones especiales 2 Sistema de archivos Más detalles Tablas de particiones y Sistemas de ficheros
Tabla de particiones La tabla de particiones está alojada en el MBR (del inglés Master Boot Record) a partir del byte 446 del sector de arranque y ocupa 64 bytes, conteniendo 4 registros de 16 bytes, los Más detalles SISTEMAS DE ARCHIVOS DISTRIBUIDOS
SISTEMAS DE ARCHIVOS DISTRIBUIDOS Tema # VII Sistemas de operación II Abril-Julio 2008 Yudith Cardinale Introducción Requisitos Aspectos de Diseño Servicios de archivos Servicios de directorios Módulo Más detalles Ingeniería Superior de Informática. Curso 3º. Sistemas Operativos. Examen Final. TEORÍA. 31 de Enero de 2005
Ingeniería Superior de Informática. Curso º. Sistemas Operativos. Examen Final. TEORÍA. de Enero de 005 Nombre: DNI:. ( puntos). La TFA es la tabla que, en UNIX, guarda los punteros de posición de cada Más detalles Instalación de un segundo sistema operativo
Instalación de un segundo sistema operativo Haga clic en uno de los vínculos que aparecen a continuación para visualizar una de las siguientes secciones: Resumen Información y términos clave Sistemas operativos Más detalles Estructuras de Almacenamiento RAID RAID. Nivel FísicoF. Índice. Requisitos Almacenamiento. Nivel Lógico Modelo Entidad-Relación y Modelo Relacional
Estructuras de Almacenamiento Nivel FísicoF Nivel Lógico Modelo Entidad-Relación y Modelo Relacional El nivel en el que se deben mover los usuario es el nivel lógico El objetivo de un sistema de bases Más detalles Sistemas de archivos: Estructura en el dispositivo
Sistemas de archivos: Estructura en el dispositivo Facultad de Ingeniería, UNAM Instituto de Investigaciones Económicas, UNAM Índice Definiciones base 1 Definiciones base 2 3 4 5 Sistemas de archivos Gestión Más detalles 18 y 19 Sistemas de Archivos Distribuidos y Tarea 05
18 y 19 Sistemas de Archivos Distribuidos y Tarea 05 Prof. Edgardo Adrián Franco Martínez http://computacion.cs.cinvestav.mx/~efranco efranco.docencia@gmail.com Estructuras de datos (Prof. Edgardo A. Franco) Más detalles Dispositivos de almacenamien to secundario. Almacenamiento de datos
Dispositivos de almacenamien to secundario Almacenamiento de datos Índice Medios de almacenamiento magnético. Medios de almacenamiento óptico. Medios de almacenamiento de estado sólido. Categorías de los Más detalles Sistemas operativos: una visión aplicada. Capítulo 12 Estudio de casos: Windows-NT
Sistemas operativos: una visión aplicada Capítulo 12 Estudio de casos: Windows-NT Contenido Introducción Principios de diseño de Windows NT Arquitectura de Windows NT El núcleo de Windows NT Subsistemas Más detalles Administrador de File System FAT16 y FAT32
Administrador de File System FAT16 y FAT32 Julio Peralta, Lorena Ibaez, Mariano A. Carabajal, Matias D. Rotela, Patricia Gómez Dpto. de Ingeniería e Investigaciones Tecnológicas, Universidad Nacional de Más detalles Almacenamiento y estructura de archivos
Bases de Datos Almacenamiento y estructura de archivos Almacenamiento y Estructura de Archivos Introducción a los medios de almacenamiento Discos Magnéticos RAID Almacenamiento Terciario Acceso de almacenamiento Más detalles Contenidos. Sistemas operativos Tema 3: Estructura del sistema operativo. Componentes típicos de un SO. Gestión de procesos.
Contenidos Sistemas operativos Tema 3: Estructura del sistema operativo Componentes típicos del SO Servicios del SO Llamadas al sistema Programas del sistema El núcleo o kernel Modelos de diseño del SO Más detalles Clase 1: Estructuras, Procesos y Diccionario de Datos
Clase 1: Estructuras, Procesos y Diccionario de Datos Estructura de la memoria System Global Area Buffer Cache Redo Log Buffer Share Pool Dictionary Cache Large Pool Process Global Area Private SQL Area Más detalles Fundamento de Informática Teórica(2003) Prof. Dr. Eric Jeltsch F. ORGANIZACION FISICA DE LOS SISTEMAS DE BASE DE DATOS
ORGANIZACION FISICA DE LOS SISTEMAS DE BASE DE DATOS La organización física de una base de datos es un tópico extenso y se aborda en detalle, principalmente en la asignatura Base de Datos, y digo principalmente Más detalles Tema 4. Gestión de entrada/salida
Tema 4. Gestión de entrada/salida 1. Principios de la gestión de E/S. 1.Problemática de los dispositivos de E/S. 2.Objetivos generales del software de E/S. 3.Principios hardware de E/S. 1. E/S controlada Más detalles Examinaremos las características claves de las memorias y luego analizaremos el subsistema de memoria principal.
GUIA 25: La memoria es un medio físico capaz de almacenar información (programas y datos) de forma temporal o permanente. Sin memoria no puede haber computadoras como las conocemos ahora. Aunque conceptualmente Más detalles TFC Estudio de un sistema de ficheros Windows e implementación de una aplicación docente para su aprendizaje
TFC Estudio de un sistema de ficheros Windows e implementación de una aplicación docente para su aprendizaje is12995 José María del Río Cebrián Abstract La necesidad, tanto de usuarios como de organizaciones, Más detalles Sistemas de Archivos Interfaz. Módulo 10. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur
Sistemas de Archivos Interfaz Módulo 10 Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Module 10: Sistema de Archivos: Interfaz Concepto de archivos Métodos de Acceso Más detalles 7. Manejo de Archivos en C.
7. Manejo de Archivos en C. Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos se almacenan normalmente en un dispositivo de Más detalles Introducción a los Sistemas Operativos
Convivencia Gestión del Sistema de Entrada/Salida Dra. Carolina Carolina Mañoso Mañoso Dpto. Dpto. Imformática Informática y y Automática.UNED Introducción (1/2) El sistema de Entrada/Salida es la parte Más detalles Global File System (GFS)...
Global File System (GFS)... Diferente a los sistemas de ficheros en red que hemos visto, ya que permite que todos los nodos tengan acceso concurrente a los bloques de almacenamiento compartido (a través Más detalles Tema 2. Organizaciones de ficheros y estructuras de acceso
Tema 2. Organizaciones de ficheros y estructuras de acceso Ficheros y Bases de Datos 10 de junio de 2002 1. Introducción Este documento contiene preguntas del tema 2 recogidas por estudiantes de la asignatura Más detalles TEMA 6: «LOS SISTEMAS DE ARCHIVO» Implantación de Sistemas Operativos
TEMA 6: «LOS SISTEMAS DE ARCHIVO» Implantación de Sistemas Operativos INDICE 1. INTRODUCCIÓNCONSIDERACIONES PREVIAS 2. LOS ARCHIVOS 3. LOS DIRECTORIOS 4. IMPLEMENTACIÓN DEL SISTEMA DE ARCHIVOS 5. TIPOS Más detalles SISTEMAS OPERATIVOS. 1Responda brevemente a estas preguntas: Convocatoria extraordinaria, 13 de septiembre de 2006
Calificación SISTEMAS OPERATIVOS Convocatoria extraordinaria, 13 de septiembre de 2006 Nombre SOLUCIONES 1 4 2 5 3 6 Titulación Dispone de tres horas y media para realizar el examen 1Responda brevemente Más detalles TEMA 3. GESTIÓN DE MEMORIA
TEMA 3. GESTIÓN DE MEMORIA 3.1. Introducción 3.2. Memoria virtual 3.2.1. Paginación 3.2.2. Segmentación 3.2.3. Segmentación paginada 3.2.4. Paginación por demanda 3.2.5. Algoritmos de reemplazo de página Más detalles FUNDAMENTOS DE INFORMATICA
FUNDAMENTOS DE INFORMATICA TEMAS QUE SE TRATARÁN: Arquitectura Interna Sistemas Operativos Programación en Visual Basic Bases de Datos Redes e Internet 1 FUNDAMENTOS DE INFORMATICA Tema 1: Arquitectura Más detalles Hardware y Estructuras de Control. Memoria Virtual. Ejecución de un Programa. Ejecución de un Programa
Memoria Virtual Capítulo 8 Hardware y Estructuras de Control Las referencias de memoria se traducen a direcciones físicas dinámicamente en tiempo de ejecución Un proceso puede ser intercambiado hacia dentro Más detalles Reconocímíentes y Agradecimientos 5 Indice 6 Prólogo 11
índice Reconocímíentes y Agradecimientos 5 Indice 6 Prólogo 11 Capítulo 1: Introducción a c/e++ Introducción a C/C++ 13 Introducción 14 Primeros Pasos en C/C++ 15 Mi Primer Programa 15 Bibliotecas 17 Archivos Más detalles DEFINICIÓN DE ARCHIVOS Y TECNOLOGÍA DE ALMACENAMIENTO
INTRODUCCIÓN A LA INFORMÁTICA UNIDAD 4. ARCHIVOS Y ALMACENAMIENTO DE DATOS EN COMPUTADORAS Definición de Archivos y Tecnología de Almacenamiento Estudio del Almacenamiento en Disquetes, CDs y DVDs Estudio Más detalles Sistemas de Archivos. Modulo 10. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur
Sistemas de Archivos Modulo 10 Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Sistema de Archivos REQUERIMIENTOS ESENCIALES 1.- Debe ser posible almacenar gran cantidad Más detalles Tema 11. Soporte del Sistema Operativo 11.1. REQUERIMIENTOS DE LOS SISTEMAS OPERATIVOS. 11.1.1. MULTIPROGRAMACIÓN.
Tema 11 Soporte del Sistema Operativo 11.1. REQUERIMIENTOS DE LOS SISTEMAS OPERATIVOS. El sistema operativo es básicamente un programa que controla los recursos del computador, proporciona servicios a Más detalles Sistemas de almacenamiento
Sistemas de almacenamiento Discos Duros Cables de datos y control Puntes de configuración.: Maestro Esclavo. Límite de capacidad Conector de alimentación de corriente 1 Están formados por un conjunto de Más detalles Estructura de datos Tema 6: Tablas de dispersión (hashing)
Universidad de Valladolid Departamento de informática Campus de Segovia Estructura de datos Tema 6: Tablas de dispersión (hashing) Prof. Montserrat Serrano Montero ÍNDICE Conceptos básicos Funciones hash Más detalles Escuela de Ingeniería Electrónica. Programa de Mantenimiento de PCs. Sistemas Operativos. Ing. José Alberto Díaz García
Sistemas Operativos Ing. José Alberto Díaz García Sistemas Operativos (SO) Son programas que controlan miles de operaciones, provee una interfase entre el usuario y el computador, y corre aplicaciones. Más detalles Funcionamiento de los dispositivos de un sistema microinformático.
Funcionamiento de los dispositivos de un sistema microinformático. En esta sección nos centraremos en los conceptos más generalizados sobre el disco duro: Las particiones Formatos Sector de arranque Se Más detalles Sistemas Operativos Tema 8. Gestión de memoria. 1998-2012 José Miguel Santos Alexis Quesada Francisco Santana Belén Esteban
Sistemas Operativos Tema 8. Gestión de memoria 1998-2012 José Miguel Santos Alexis Quesada Francisco Santana Belén Esteban 1 Contenidos Antecedentes Técnicas básicas: recubrimientos, intercambio Gestión Más detalles Errores del Manejador de Archivo Errores del Compilador
MAR DE BANDA # 2075 COLONIA COUNTRY CLUB GUADALAJARA, JAL, MEX. TEL. (33)35.85.03.03, FAX (33)35.85.04.04 EMAIL: soporte@multilan.com.mx WEB www.multilan.com.mx Errores del Manejador de Archivo Errores Más detalles Unidad 1: Conceptos generales de Sistemas Operativos.
Unidad 1: Conceptos generales de Sistemas Operativos. Tema 3: Estructura del sistema operativo. 3.1 Componentes del sistema. 3.2 Servicios del sistema operativo. 3.3 Llamadas al sistema. 3.4 Programas Más detalles TEMA 6. Implementación de UNIX. Contenido
TEMA 6 Implementación de UNIX Contenido 6.1. Introducción 6.2. El Núcleo (Kernel) de UNIX 6.3. Gestión de Procesos 6.3.1. Estructuras de Control de Procesos 6.3.2. Contexto de un proceso 6.3.3. Estados Más detalles SISTEMA OPERATIVO WINDOWS 9X
SISTEMA OPERATIVO WINDOWS 9X RENOMBRANDO ARCHIVOS El término directorio (directory) y carpeta (folder) se utilizan indiferentemente para describir el lugar donde se almacena información. En Windows 3.1 Más detalles MODULO 4: EL DISCO DURO
MODULO 4: EL DISCO DURO Es un dispositivo mecánico por la forma de acceder a la información (cabeza que se mueve sobre el disco) y electrónico ya que guarda los datos en señales magnéticas. Es de alta Más detalles No se requiere que los discos sean del mismo tamaño ya que el objetivo es solamente adjuntar discos.
RAIDS MODO LINEAL Es un tipo de raid que muestra lógicamente un disco pero se compone de 2 o más discos. Solamente llena el disco 0 y cuando este está lleno sigue con el disco 1 y así sucesivamente. Este Más detalles Sistemas de archivos distribuidos. Alvaro Ospina Sanjuan alvaro.ospina@correo.upb.edu.co
Sistemas de archivos distribuidos Alvaro Ospina Sanjuan alvaro.ospina@correo.upb.edu.co >Abstracción del sistema operativo para representar y organizar los recursos de almacenamiento >Se debe hacer la Más detalles T5.- Gestión de discos. 1.1.- Estructura física del disco duro. TEMA 5 GESTIÓN DE DISCOS. 1.1. - Estructura física del disco duro.
MANTENIMIENTO DE SISTEMAS INFORMÁTICOS TEMA 5 GESTIÓN DE DISCOS. 1.1.- Estructura física del disco duro. 1.2.- Estructura lógica del disco duro. 1.1. - Estructura física del disco duro. 1.1. - Estructura Más detalles Sistemas Operativos. Tema 1. Arquitectura Básica de los Computadores
Sistemas Operativos. Tema 1 Arquitectura Básica de los Computadores http://www.ditec.um.es/so Departamento de Ingeniería y Tecnología de Computadores Universidad de Murcia Sistemas Operativos. Tema 1 Arquitectura Más detalles Tema 4. Gestión Avanzada de Memoria
Departamento de Ingeniería y Tecnología de Computadores Universidad de Murcia Índice 1 El sistema de gestión de memoria 2 Generación de un ejecutable Bibliotecas Formato del ejecutable Mapa de memoria Más detalles aspectos fundamentales
Administración disco aspectos fundamentales Lámina 1 Sistema archivos vs disco Sistema archivos es la abstracción usada por el kernel para representar y organizar los recursos de almacenamiento Recursos Más detalles Diseño y Admón. de Bases de Datos. Ingeniería Informática curso 2010/11
Laboratorio 06. Objetivos: Representación interna de un BD. Tablas, índices e índices full-text. Sesiones: 1 (24 de noviembre de 2010) Ejercicio: 1. Representación interna: 1.1. Copiar al repositorio de Más detalles Unidad 1: Conceptos generales de Sistemas Operativos.
Unidad 1: Conceptos generales de Sistemas Operativos. Tema 2: Estructura de los sistemas de computación. 2.1 Funcionamiento de los sistemas de computación. 2.2 Ejecución de instrucciones e interrupciones Más detalles Análisis e implementación de un sistema virtual de archivos con aplicaciones para uso didáctico desde un punto de vista técnico.
Análisis e implementación de un sistema virtual de archivos con aplicaciones para uso didáctico desde un punto de vista técnico. Bruno Lanzillotta (lanzillo@flashmail.com) Pablo Méndez (pablodamian80@yahoo.com.ar), Más detalles SISTEMAS OPERATIVOS. Fco. Javier Bueno
SISTEMAS OPERATIVOS Fco. Javier Bueno Índice Objetivos Contenidos Qué es un Sistema Operativo? Diferentes Sistemas Operativos Gestión de archivos, carpetas y discos Archivos Directorios o carpetas Los Más detalles Memoria Compartida Distribuida (DSM) Sistema de Archivos
Memoria Compartida Distribuida (DSM) La memoria compartida distribuida es una abstracción que se propone como alternativa a la comunicación por mensajes. Memoria compartida basada en páginas: este esquema Más detalles Estructura de Datos. Unidad I Tipos de Datos
Estructura de Datos Unidad I Tipos de Datos Conceptos Básicos Algoritmo: es una secuencia finita de pasos o instrucciones ordenadas crono-lógicamente que describen un método para resolver un problema específico. Más detalles Solución Examen Febrero 2006
Solución Examen Febrero 2006 Lea detenidamente las siguientes instrucciones. No cumplir los requerimientos puede implicar la pérdida del examen. Formato Indique su nombre completo y número de cédula en Más detalles Segundo parcial de Sistemas Operativos. 24/6/2008. Ejercicios. 5 puntos. Duración 2h.
Segundo parcial de Sistemas Operativos. 24/6/2008. Ejercicios. 5 puntos. Duración 2h. Nombre DNI Especialidad 1. (1.5 p)tenemos dos discos duros (D0 y D1) con la misma geometría (4 cabezas, 8192 cilindros Más detalles PARTICIONES. Estructura física de un disco duro
PARTICIONES Estructura física de un disco duro Todo Disco duro esta compuesto por uno o varios discos magnéticos (también llamados platos magnéticos), una o varias cabezas lectoras/grabadoras, un motor Más detalles Sea el siguiente programa de nombre "c0p1" para copiar archivos (por simplicidad se ha eliminado todo control de errores): Se pide:
Sea el siguiente programa de nombre "c0p1" para copiar archivos (por simplicidad se ha eliminado todo control de errores): 1 /* c0p1 origen destino 2 * Copia "origen" sobre "destino" byte a byte, 3 * haciendo Más detalles AcuServer Servidor de Archivos Remoto de Alto Rendimiento
AcuServer Servidor de Archivos Remoto de Alto Rendimiento RESUMEN EJECUTIVO AcuServer es una tecnología de servidor de datos remoto que ofrece un seguro e inmediato acceso a datos indexados, relativos Más detalles ARCHIVOS. 1. Introducción. 2. Definición de archivo. 3. Archivos de acceso secuencial. 4. Gestión de un archivo secuencial de estructuras
ARCHIVOS 1. Introducción 2. Definición de archivo 3. Archivos de acceso secuencial 3.1. fopen 3.2. fclose 3.3. fcloseall 3.4. putc 3.5. getc 3.6. fscanf 3.7. fprintf 4. Gestión de un archivo secuencial Más detalles Problemas de Sistemas de Archivo
Problemas de Sistemas de Archivo SO2 Abril 2.000 PROBLEMAS RESUELTOS Cuestión 1 Dado un disco de cabeza móvil con 200 cilindros, numerados de 0 a 199 se considera que: Actualmente sirve una solicitud en Más detalles En esta unidad añadiremos información sobre EXT3 y trabajaremos con aspectos visibles que nos proporcionan estos sistemas de archivos.
ESTRUCTURA DEL SISTEMA DE ARCHIVOS 1. Introducción. En la unidad anterior se esbozó mediante la explicación de los formatos del disco duro, distintos tipos de sistemas de archivos: FAT16, FAT32, NTFS y Más detalles Gestión de Entrada/Salida
Gestión de Entrada/Salida Transparencias basadas en el libro de referencia: Sistemas operativos. Una visión aplicada. J. Carretero, F.García, P. de Miguel, F. Pérez. McGraw Hill 2001 Curso 2005-2006 Contenido Más detalles Sistemas de archivos. Índice. 1. Plasmando la estructura en el dispositivo
Sistemas de archivos Gunnar Wolf IIEc-UNAM Esteban Ruiz CIFASIS-UNR Federico Bergero CIFASIS-UNR Erwin Meza UNICAUCA Índice 1. Plasmando la estructura en el dispositivo 1 1.1. Conceptos para la organización................... Más detalles 2017 © DocPlayer.es Política de privacidad | Condiciones del servicio | Feedback

References: Resolución 
 resolución 
 resolución 
 resolución 
 Resolución 
 Resolución 
 resolución 
 resolución 
 Resolución 
 Resolución 
 resolución 
 resolución 
 Resolución 
 resolución