X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/f244b48662e3335a022d66d2e03dc6e0c87db7a2..dc1d6d2ce387d0563612e569d4ff6e16dbc332e7:/doc/informe.lyx?ds=sidebyside diff --git a/doc/informe.lyx b/doc/informe.lyx index 81edbd2..1084ef8 100644 --- a/doc/informe.lyx +++ b/doc/informe.lyx @@ -403,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 @@ -411,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 @@ -422,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 @@ -1911,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() @@ -1919,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() @@ -1927,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()