X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/db5d00d2ac69d592306c429c3b3b607a858b3318..dc1d6d2ce387d0563612e569d4ff6e16dbc332e7:/doc/informe.lyx?ds=inline diff --git a/doc/informe.lyx b/doc/informe.lyx index f25411c..1084ef8 100644 --- a/doc/informe.lyx +++ b/doc/informe.lyx @@ -375,8 +375,6 @@ s que pasamos a detallar (m cant bloques, tam archivo, etc): \layout Itemize - -\emph on Relación entre espacio libre y el tamaño del archivo de datos ( \series bold .dat @@ -405,7 +403,7 @@ Tipos Comunes En la implementación de cada tipo de organización física, así como tambien en las API de los archivos auxiliares comunes a ellas, se da la utilización de tipo definidos para una clara interfaz entre las mismas, los cuales - son brevemente descriptos a continuación y pueden ser hayados en el archivo + son brevemente descriptos a continuación y pueden ser hallados en el archivo \series bold emufs.h @@ -413,9 +411,9 @@ emufs.h : \layout Itemize -typedef + \family typewriter -unsigned long EMUFS_REG_ID +EMUFS_REG_ID \family default : usado para representar un \emph on @@ -424,39 +422,46 @@ Id de un registro. \layout Itemize -typdef + \family typewriter -unsigned long EMUFS_REG_SIZE +EMUFS_REG_SIZE \family default : usado para representar el tamaño en bytes de un registro. \layout Itemize -typedef + \family typewriter -unsigned long EMUFS_BLOCK_ID +EMUFS_BLOCK_ID \family default : usado para representar un número de bloque. \layout Itemize -typdef + \family typewriter -unsigned long EMUFS_BLOCK_SIZE +EMUFS_BLOCK_SIZE \family default : usado para representar el tamaño en bytes de un bloque. \layout Itemize -typedef + \family typewriter -unsigned long EMUFS_FREE +EMUFS_FREE \family default : usado para representar espacio libre en bytes. \layout Itemize -typedef + \family typewriter -unsigned long EMUFS_OFFSET +EMUFS_OFFSET \family default : usado para representar un offset. +\layout Standard + +Todos son del tipo +\family typewriter +unsigned long +\family default +. \layout Section @@ -1403,7 +1408,11 @@ emufs_did_agregar() \layout List \labelwidthstring 00.00.0000 -Baja Cuando el sistema desee grabar un nuevo registro en el archivo de datos, + +\series bold +Baja +\series default + Cuando el sistema desee grabar un nuevo registro en el archivo de datos, este pedirá un \family typewriter id_reg @@ -1909,6 +1918,36 @@ emufs_tipo1_agregar_registro() Bajas de registros \layout Standard +Al eliminar un registro lo primero que se hace es actualizar los archivos + de índice y de indentificadores recuperables, poniendo como número de bloque + el valor especial +\family typewriter +EMUFS_NOT_FOUND +\family default + y agregando el identificador del registro a borrar respectivamente. + También se actualiza el archivo de control de espacio libre por cada bloque + (en caso de ser más de uno, en registros +\emph on +multibloque +\emph default +, se actualizan todos los bloques) y se carga el bloque en memoria para + +\emph on +alinear los datos a izquierda +\emph default + (en caso de ser un registro +\emph on +multibloque +\emph default +, esto se realiza sólo para el último bloque). + Para alinear los datos, se recorre secuencialmente en bloque (leyendo la + cabecera de cada registro y salteando los datos) hasta encontrar el registro + a borrar. + Encontrado el registro, se copian todos los bytes que se encuentran entre + el fin del registro a borrar y el fin del bloque, en el comienzo del bloque + borrado. +\layout Standard + Ver: \family typewriter emufs_tipo1_borrar_registro() @@ -1917,6 +1956,13 @@ emufs_tipo1_borrar_registro() Modificación de registros \layout Standard +Se optó por un algoritmo simple y general, que usa las funciones de alto + nivel mencionadas hasta ahora. + Simplemento borra el registro y vuelve a crearlo. + Al recuperar el último identificador de registro borrado, nos aseguramos + de que se mantenga el identificador del registro. +\layout Standard + Ver: \family typewriter emufs_tipo1_modificar_registro() @@ -1925,14 +1971,121 @@ emufs_tipo1_modificar_registro() Obtención de estadísticas \layout Standard +Es una función bastante simple, con una única complicación que mencionaremos + más adelante. +\layout Standard + +Para obtener las máximas desviaciones, cantidad total de espacio libre, + cantidad de registros y tamaño de los archivos auxiliares se utilizan las + funciones apropiadas de los archivos auxiliares (ver secciones +\begin_inset LatexCommand \ref{sec:idx} + +\end_inset + +, +\begin_inset LatexCommand \ref{sec:fsc} + +\end_inset + + y +\begin_inset LatexCommand \ref{sec:did} + +\end_inset + +). +\layout Standard + +Para obtener la cantidad de bloques se hace el siguiente calculo: +\layout LyX-Code + +cant_bloques = (tamaño_archivo_datos - tamaño_cabecera_archivo_datos) +\layout LyX-Code + + / tamaño_bloque; +\layout Standard + +Hasta aquí no hay mayores inconvenientes. + El problema se presenta para calcular el tamaño de la información de control + utilizada por el archivo de datos; se utiliza el siguiente cálculo: +\layout LyX-Code + +tam_info_control_datos = tamaño_cabecera_archivo_datos +\layout LyX-Code + + + cant_registros * tamaño_cabecera_registro; +\layout Standard + +Aunque a simple vista esto parece acertado, no contempla el caso de los + registros +\emph on +multibloque +\emph default + (pág +\begin_inset LatexCommand \pageref{sub:tipo1_reg_multi} + +\end_inset + +), estos registros almacenan +\family typewriter +tamaño_cabecera_registro * N +\family default +, donde +\family typewriter +N +\family default + es la cantidad de bloques que ocupan. + Salvar este caso sería muy costoso, porque habría que recorrer el archivo + registro a registro, +\emph on +fragmento +\emph default + a +\emph on +fragmento +\emph default + e ir contando todas las cabeceras de registro que aparecen (similar a lo + que se hace en la compactación, ver sección +\begin_inset LatexCommand \ref{sub:tipo1_compact} + +\end_inset + +). + Al tratarse este de un caso excepcional, se optó por mantener la función + simple ya que funciona bien en la mayoría de los casos. +\layout Standard + Ver: \family typewriter emufs_tipo1_leer_estadisticas() \layout Subsection + +\begin_inset LatexCommand \label{sub:tipo1_compact} + +\end_inset + Compactación del archivo de datos \layout Standard +Esta función es una de las más simples, porque se limita a un algoritmo + muy simple que utiliza las funciones de +\emph on +alto nivel +\emph default + antes nombradas para realizar su tarea. + Básicamente recorre el archivo de índices de registros, de comienzo a fin, + leyendo el registro, borrándolo y volviéndolo a insertar. + Si había espacio libre en un bloque anterior al que estaba, será insertado + en él, si no volverá a grabarse en el lugar en que estaba. + De esta forma se aprovechan todos los espacios libres intermedios, concluyendo + con un archivo igual o más pequeño que el original. +\layout Standard + +Esta implementación no es la más eficiente, pero siendo que esta es una + operación costosa y excepcional por naturaleza, se optó por mantener el + algoritmo simple a costo de un poco de eficiencia. +\layout Standard + Ver: \family typewriter emufs_tipo1_compactar() @@ -2081,16 +2234,17 @@ El archivo indice ( \series bold .idx \series default -), permite la localizacin de los registros en el .DAT de forma directa, mediante - la obtención de su offset o posición relativa respecto del inicio del +), permite la localización de los registros en el .DAT de forma directa, + mediante la obtención de su offset o posición relativa respecto del inicio + del \series bold .dat \series default en donde se encuentra un registro dado, indicado por su ID. \layout Standard -Así pues, si tomamos el ejemplo descripto al inicio de este capítudlo, tendremos - las siguientes entradas en el archivo indice +Así pues, si tomamos el ejemplo descripto al inicio de este capítulo, tendremos + las siguientes entradas en el archivo índice \series bold .idx \series default @@ -2222,12 +2376,12 @@ te luego del header tendremos el registro en s Achivo de Gaps / Espacios Libres (.fsc) \layout Standard -El archivo de espacios libres o gaps (.fsc), tiene como función la administracion +El archivo de espacios libres o gaps (.fsc), tiene como función la administración del espacio libre o gaps (agujeros), generados por previas eliminaciones de registros en el archivo de datos. El mismo, nos indicará donde hay lugar para insertar un nuevo registro (se podrán insertar en algún gap acorde, o bien al final del archivo). - Este archivo será utilizado tambien para el proceso de compactación de + Este archivo será utilizado tambien para el proceso de compactación de un archivo, explicado luego. \layout Standard @@ -2335,7 +2489,11 @@ Nota: \emph default Por requerimiento del algoritmo de compactación, los gaps se graban en forma ordenada en el (.fsc). - (El orden se corresponde con lo que hay en el .dat) + (El orden se corresponde con lo que hay en el +\series bold +.dat +\series default +. \layout Subsubsection* GAP Merging @@ -2982,6 +3140,17 @@ En este caso veremos que sucede luego de agregar y borrar una gran cantidad de registros del archivo, lo que provoca como consecuencia directa la fragmenta ción del archivo, es decir, quedan huecos entre un registro y otro, lo que produce un desperdicio de espacio. +\layout Standard + +La implementación de este tipo de archivo puede ser encontrada en +\family typewriter +emufs/tipo3.c +\family default + mientras que su interfaz pública está disponible en +\family typewriter +emufs/tipo3.h +\family default +. \layout Section Organización Física @@ -2995,25 +3164,62 @@ Esta organizaci Así como los graba, también tendrá la posibilidad de leer registros y borrarlos del archivo. +\layout Standard + +El archivo estara compuesto por una cabecera que da información sobre el + tipo de organización, el tamaño de los bloques y el tamaño de los registros. \layout Subsection -Comportamiento Particular de los Archivos Auxiliares -\layout Subsubsection +Organización Física de un Bloque +\layout Standard -Archivo de Bloques y Registros (.idx) -\layout Comment +Cada bloque será capaz de contener la cantidad de registros enteros que + quepan en él. + De esta manera un registro que no entre completamente en el bloque deberá + almacenarce en un bloque diferente. +\layout Standard -buscar algun caso extraordinario. -\layout Subsubsection +Los bloques no contienen ninguna información adicional, solo se conoce su + tamaño y se usa para delimitar +\begin_inset Quotes eld +\end_inset -Archivo de Bloques y Espacio Libre (.fsc) -\layout Subsubsection +virtualmente +\begin_inset Quotes erd +\end_inset -Archivo de Id`s Borrados (.did) + zonas en el archivo. +\layout Subsection + +Organizacion Física de Registros \layout Standard -El comportamiento de este archivo, es común para todas las organizaciones - y se ha explicado en 3.3.2. +Cada registro se almacena en un bloque, y contiene una cabecera que indica + su +\emph on +ID, +\emph default +por este motivo al realizar la busqueda de espacio en un bloque se lo hará + preguntando por el tamaño del registro más +\family typewriter +sizeof(EMUFS_REG_ID). + +\layout Subsection + +Organización Física de Registros Multibloque +\layout Standard + +Al ser los registros de longitud constante, se ha adoptado que un registro + multibloque nunca podra estar almacenado en algún lugar que no sea el comienzo + de un bloque. + De esta manera se puede calcular cuantos bloques ocupará un registro y + se podrá solicitar lugar para almacenarlo con la ayuda de la función +\family typewriter +emufs_fsc_buscar_n_lugares(), +\family default +que es muy importante para evitar el solapamiento de registros. + Esta consideración acarrea como consecuencia directa un alto costo en términos + del espacio desperdiciado. \layout Section Funciones Principales @@ -3166,9 +3372,6 @@ void emufs_tipo3_compactar() \layout Section Consideraciones y Políticas de Diseño -\layout Comment - -Esto para mi va en organización física. \layout Standard Se han tomado ciertas consideraciones para algunos casos particulares que