X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/f244b48662e3335a022d66d2e03dc6e0c87db7a2..e7632c2b5ce6b6395268e3e4cca0c1b23022fabf:/doc/informe.lyx?ds=inline diff --git a/doc/informe.lyx b/doc/informe.lyx index 81edbd2..5b08ea9 100644 --- a/doc/informe.lyx +++ b/doc/informe.lyx @@ -43,6 +43,15 @@ Ricardo Markiewicz \layout Chapter Introducción +\layout Standard + +Esta es la documentación correspondiente a las API`s para el manejo de tres + organizaciones de archivo diferentes. + A continuación se describe cada una de ellas y su modo de funcionamiento + y sus características principales. + De la correcta elección de la organización, dependerá la eficiencia de + la aplicación que la utilice. + \layout Chapter Estructura común @@ -62,6 +71,73 @@ EMUFS prooverá una interfaz (funciones) para su manejo). \layout Subsection +Tipos Comunes +\layout Standard + +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 hallados en el archivo + +\series bold +emufs.h +\series default +: +\layout Itemize + + +\family typewriter +EMUFS_REG_ID +\family default +: usado para representar un +\emph on +Id +\emph default + de un registro. +\layout Itemize + + +\family typewriter +EMUFS_REG_SIZE +\family default +: usado para representar el tamaño en bytes de un registro. +\layout Itemize + + +\family typewriter +EMUFS_BLOCK_ID +\family default +: usado para representar un número de bloque. +\layout Itemize + + +\family typewriter +EMUFS_BLOCK_SIZE +\family default +: usado para representar el tamaño en bytes de un bloque. +\layout Itemize + + +\family typewriter +EMUFS_FREE +\family default +: usado para representar espacio libre en bytes. +\layout Itemize + + +\family typewriter +EMUFS_OFFSET +\family default +: usado para representar un offset. +\layout Standard + +Todos son del tipo +\family typewriter +unsigned long +\family default +. +\layout Subsection + EMUFS \layout Standard @@ -194,10 +270,12 @@ facturas \begin_inset Quotes erd \end_inset - organizado de la forma 3, se invoca a la función + organizado de la forma 3, se invoca a la función: +\layout Standard + + \family typewriter -EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo,EMUFS_BLOCK_SIZE - tam_bloque, EMUFS_REG_SIZE tam_reg), +emufs_crear(filename,tipo,tam_bloque,tam_reg), \family default donde \family typewriter @@ -256,15 +334,27 @@ emufs.h. A saberse los valores y significado correspondiente que puede tomar este tipo de dato son: -\layout Enumerate +\layout Itemize -Archivos con registros de longitud variable y bloques parametrizables. -\layout Enumerate -Archivos con registros de longitud variable sin bloques. -\layout Enumerate +\series bold +T1 +\series default + : Archivos con registros de longitud variable y bloques parametrizables. +\layout Itemize + + +\series bold +T2 +\series default + : Archivos con registros de longitud variable sin bloques. +\layout Itemize + -Archivos con registros de longitud fija y bloques parametrizables. +\series bold +T3 +\series default + : Archivos con registros de longitud fija y bloques parametrizables. \layout Subsection EMUFS_Estadisticas @@ -290,60 +380,91 @@ y la misma cuenta con los siguiente campos: \family typewriter unsigned long \family default - tam_archivo: indica el tamaño del archivo de datos (.dat) en bytes. + +\family typewriter +tam_archivo +\family default +: indica el tamaño del archivo de datos (.dat) en bytes. \layout Itemize \family typewriter unsigned long \family default - tam_archivos_aux: indica el tamaño de los archivos auxiliares sumados en - bytes. + +\family typewriter +tam_archivos_aux +\family default +: indica el tamaño de los archivos auxiliares sumados en bytes. \layout Itemize \family typewriter unsigned long \family default - tam_info_control_dat: indica la cantidad de bytes en información de control - utilizados para el archivo. + +\family typewriter +tam_info_control_dat +\family default +: indica la cantidad de bytes en información de control utilizados para + el archivo. \layout Itemize \family typewriter unsigned long \family default - media_fs: promedio de espacio libre en el archivo de datos (por bloque - o gap promedio segun la org) + +\family typewriter +media_fs +\family default +: promedio de espacio libre en el archivo de datos (por bloque o gap promedio + segun la org) \layout Itemize \family typewriter unsigned long \family default - total_fs: total de espacio libre en el archivo de datos. + +\family typewriter +total_fs +\family default +: total de espacio libre en el archivo de datos. \layout Itemize \family typewriter unsigned long \family default - max_fs: máximo espacio libre en el archivo de datos (en un bloque o máximo - gap segun la org). + +\family typewriter +max_fs +\family default +: máximo espacio libre en el archivo de datos (en un bloque o máximo gap + segun la org). \layout Itemize \family typewriter unsigned long \family default - min_fs: idem pero mínimo. + +\family typewriter +min_fs +\family default +: idem pero mínimo. \layout Itemize \family typewriter unsigned long \family default - cant_bloques: cantidad de bloques en el archivo de datos (. + +\family typewriter +cant_bloques +\family default +: cantidad de bloques en el archivo de datos (. \series bold dat \series default @@ -354,7 +475,11 @@ dat \family typewriter unsigned long \family default - cant_registros: cantidad de registros en el archivo de datos ( + +\family typewriter +cant_registros +\family default +: cantidad de registros en el archivo de datos ( \series bold .dat \series default @@ -362,7 +487,7 @@ unsigned long \layout Standard En base a la estructura descripta anteriormente y mediante la utilización - de la función + de la función de lectura de estadísticas l \family typewriter emufs_leer_estadisticas() \family default @@ -395,66 +520,6 @@ Cantidad promedio de espacio libre (en bloque o gap promedio) Desviaciones extremas de espacio libre (máximo/mínimo espacio libre en bloque o mayor/menor gap) -\layout Subsection - -Tipos Comunes -\layout Standard - -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 - -\series bold -emufs.h -\series default -: -\layout Itemize - -typedef -\family typewriter -unsigned long EMUFS_REG_ID -\family default -: usado para representar un -\emph on -Id -\emph default - de un registro. -\layout Itemize - -typdef -\family typewriter -unsigned long 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 -\family default -: usado para representar un número de bloque. -\layout Itemize - -typdef -\family typewriter -unsigned long 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 -\family default -: usado para representar espacio libre en bytes. -\layout Itemize - -typedef -\family typewriter -unsigned long EMUFS_OFFSET -\family default -: usado para representar un offset. \layout Section @@ -551,6 +616,144 @@ archivo \layout LyX-Code /- 4 bytes -/ +\layout Section + +Uso de la estructura EMUFS +\layout Standard + +Como fue mencionado anteriormente en la descripción de la estructura EMUFS, + la misma proporciona al usuario una interfaz a través de la cual puede + realizar el manejo de archivos en forma genérica, abstrayéndose del tipo + de organización física en particular que dicho archivo posea. + Se la declara en +\series bold +emufs.h +\series default + y las funciones que inicializan la estructura se encuentran en +\series bold +emufs.c +\layout Standard + +Es decir que a traves de esta estructura, podemos manejar cualquier tipo + de archivo, mediante una misma interfaz en común. + La estructura +\family typewriter +EMUFS +\family default +posee además de ciertos datos que describen la organización física de un + archivo dado como por ejemplo +\series bold +\emph on +tamaño de registro +\series default +\emph default +, +\series bold +\emph on +tamaño de bloque +\series default +\emph default + y +\series bold +\emph on +nombre del archivo +\series default +\emph default +, una serie de punteros a funciones para el manejo del archivo del cual + es handler: +\layout Standard + +Entre dichos funciones se encuentran: +\family typewriter +leer_registro() +\family default +, +\family typewriter +leer_bloque(), borrar_registro() +\family default +, +\family typewriter +agregar_registro() +\family default +, +\family typewriter +modificar_registro, leer_estadisticas() +\family default +, +\family typewriter +compactar(). +\layout Standard + +Para entender mejor el uso de esta estructura para el manejo de los archivos, + mostraremos un ejemplo concreto. + Supongamos que tenemos el siguiente código: +\layout LyX-Code + +EMUFS *efs = emufs_crear(¨articulos.dat¨,T3,200,50); +\layout Standard + +Esto hará que se cree el archivo de datos +\series bold +articulos.dat +\series default +, con la organización física tipo 3 con registros de longitud fija de 50 + bytes y bloques de 200 bytes (si el archivo ya existiaera, puede ser abierto + con la función +\family typewriter +emufs_abrir() +\family default +, pasando como parámetro sólo el nombre de archivo, la función autodetecta + el tipo de archivo y sus datos adicionales). + Al mismo tiempo, los se asginarán valores a los punteros a funciones que + posee dicha estructura, la cual de ahora en más estará en condiciones de + manejar un archivo del tipo 3. + Gráficamente lo que sucede es: +\layout Standard + + +\begin_inset Float figure +placement H +wide false +collapsed false + +\layout Caption + +Inicialización de estructura EMUFS para un caso Archivo Tipo 3 +\layout Standard +\align center + +\begin_inset Graphics + filename graphics/Emufsinit.png + scale 80 + +\end_inset + + +\end_inset + + +\layout Standard + +Así pues, cuando se utilize la estructura para por ejemplo leer un registro, + sucedera lo siguiente: +\layout LyX-Code + +efs->leer_registro(params) -- llama a --> emufs_tipo3_leer_registro(params) +\layout Standard + +Como se puede observar, la estructura +\family typewriter +EMUFS +\family default + permitirá el manejo de cualquier tipo de archivo, a través del mismo código, + dandole gran flexibilidad a nuestro sistema, que podrá expandirse a más + tipos de archivos de ser necesario. +\layout Standard + +Finalmente hay otra función estática que sirve para destruir la estructura, + liberando su memoria: +\family typewriter +emufs_destruir() \layout Chapter Archivos Auxiliares @@ -634,12 +837,6 @@ EMUFS_IDX ): \layout LyX-Code -typedef unsigned long EMUFS_REG_ID; -\layout LyX-Code - -typedef unsigned long EMUFS_OFFSET; -\layout LyX-Code - typedef struct emufs_idx_t { \layout LyX-Code @@ -903,9 +1100,13 @@ emufs_idx_agregar() Baja: \series default Ante el borrado de un registro del archivo de datos, se accederá el registro - correspondiente en el índice, y se actualizara su LOCATION, estableciendolo - en el valor -1 UL, el cual indica que ese registro ha sido eliminado y - por ende no se lo podrá localizar en el futuro. + correspondiente en el índice, y se actualizara su LOCATION, estableciendolo + en el valor especial +\family typewriter +EMUFS_NOT_FOUND +\family default +, el cual indica que ese registro ha sido eliminado y por ende no se lo + podrá localizar en el futuro. Como se verá mas adelante, según el tipo de organización física, el registro puede ser borrado concretamente del . \series bold @@ -990,10 +1191,10 @@ EMUFS_FSC typedef struct emufs_fsc_t { \layout LyX-Code - unsigned long int marker; + EMUFS_BLOCK_ID marker; \layout LyX-Code - unsigned long int freespace; + EMUFS_FREE freespace; \layout LyX-Code } EMUFS_FSC; @@ -1911,6 +2112,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 +2150,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,20 +2165,124 @@ 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() -\layout Section - -Detalles de implementación (funciones internas, ver si lo ponemos o no) \layout Chapter