X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/1472ed2031e61e170df1ef579c53adc131ed756f..ee98a67093a8f8d008ae7781590c993d341ce642:/doc/informe.lyx diff --git a/doc/informe.lyx b/doc/informe.lyx index 5505ca7..f25411c 100644 --- a/doc/informe.lyx +++ b/doc/informe.lyx @@ -49,6 +49,17 @@ Estructura com \layout Section Tipos +\layout Standard + +Se detallan a continuación los tipos de datos definidos y utilizados en + las distintas implementaciones que conforman nuestro sistema, siendo el + más importante de ellos, la estructura +\family typewriter +EMUFS +\family default + que actúa como interfaz común para el manejo de cualquier tipo de archivo + (no importa que tipo de organización física posea un archivo, esta estructura + prooverá una interfaz (funciones) para su manejo). \layout Subsection EMUFS @@ -63,121 +74,116 @@ EMUFS \emph default es la estuctura principal que encapsula todas las funciones para el manejo de un archivo de datos. + Posee punteros a funciones que dependiendo de la organización fisica por + la cual se opte dentro del sistema, serán asignados de acorde. + \layout Standard -Esta estructura consta de: -\layout Enumerate +Su declaración puede ser observada en el archivo +\series bold +emufs.h +\series default +y la misma cuenta con los siguiente campos: +\layout Itemize \family typewriter EMUFS_Tipo \family default que es un tipo enumerado que indica cual es la organización. -\layout Enumerate +\layout Itemize \family typewriter EMUFS_BLOCK_SIZE \family default - indica el tamaño del bloque para los tipos de archivo con bloques (ver - capítulos -\begin_inset LatexCommand \ref{cha:tipo1} - -\end_inset - - y -\begin_inset LatexCommand \ref{cha:tipo3} - -\end_inset - -). -\layout Enumerate + indica el tamaño del bloque para los tipos 1 y 3. +\layout Itemize \family typewriter EMUFS_REG_SIZE \family default - indica el tamaño del registro, para el tipo de archivo con tamaño de registro - parametrizado (ver capítulo -\begin_inset LatexCommand \ref{cha:tipo3} - -\end_inset - -). -\layout Enumerate + indica el tamaño del registro, para el tipo 3 que posee tamaño constante. +\layout Itemize \family typewriter -void* *leer_bloque() +void **leer_bloque() \family default puntero a la función para leer un bloque. -\layout Enumerate +\layout Itemize \family typewriter void *leer_bloque_raw() \family default puntero a la función para leer un bloque, el anterior y el siguiente. -\layout Enumerate +\layout Itemize \family typewriter -void* *leer_registro() +void **leer_registro() \family default puntero a la función para leer un registro. -\layout Enumerate +\layout Itemize \family typewriter -void* *leer_registro_raw() +void **leer_registro_raw() \family default puntero a la función para leer un registro con su encabezado. -\layout Enumerate +\layout Itemize \family typewriter EMUFS_REG_ID *grabar_registro() \family default puntero a la función para grabar un registro. -\layout Enumerate +\layout Itemize \family typewriter EMUFS_REG_ID *modificar_registro() \family default puntero a la función para modificar un registro. -\layout Enumerate +\layout Itemize \family typewriter int *borrar_registro() \family default puntero a la función para borrar un registro. -\layout Enumerate +\layout Itemize \family typewriter EMUFS_Estadisticas *leer_estadisticas() \family default puntero a la función para cargar una estructura con las estadísticas. -\layout Enumerate +\layout Itemize \family typewriter void *compactar() \family default puntero a la función para compactar un archivo. -\layout Enumerate +\layout Itemize \family typewriter -char* nombre +char *nombre \family default almacena el nombre del archivo sin extensión. \layout Standard Esta estructura define los valores de sus punteros según el tipo de organización - que se desee manejar. + que se desee manejar y esto se realiza a través del API emufs, implementado + en +\series bold +emufs.c +\series default +, que se describirá posteriormente. \layout Standard Por ejemplo si se desea crear un archivo de nombre @@ -231,15 +237,226 @@ emufs_tipo3_leer_bloque() \layout Subsection EMUFS_Tipo +\layout Standard + + +\family typewriter +EMUFS_Tipo +\family default + es un tipo de dato enum, el cual será utilizado en la cabecera de todo + archivo de datos ( +\series bold +.dat +\series default +), para indicar los distintos tipos de organización física. + Su declaración puede verse en el archivo +\series bold +emufs.h. +\layout Standard + +A saberse los valores y significado correspondiente que puede tomar este + tipo de dato son: +\layout Enumerate + +Archivos con registros de longitud variable y bloques parametrizables. +\layout Enumerate + +Archivos con registros de longitud variable sin bloques. +\layout Enumerate + +Archivos con registros de longitud fija y bloques parametrizables. \layout Subsection EMUFS_Estadisticas +\layout Standard + + +\family typewriter +EMUFS_Estadisticas +\family default + es una estructura que almacenará los datos pertinentes a las estadísticas + de un archivo dado, y será utilizada para visualizar dichas observaciones + a través de la GUI. +\layout Standard + +Su declaración puede ser observada en el archivo +\series bold +emufs.h +\series default +y la misma cuenta con los siguiente campos: +\layout Itemize + + +\family typewriter +unsigned long +\family default + tam_archivo: 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. +\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. +\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) +\layout Itemize + + +\family typewriter +unsigned long +\family default + total_fs: 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). +\layout Itemize + + +\family typewriter +unsigned long +\family default + min_fs: idem pero mínimo. +\layout Itemize + + +\family typewriter +unsigned long +\family default + cant_bloques: cantidad de bloques en el archivo de datos (. +\series bold +dat +\series default +) +\layout Itemize + + +\family typewriter +unsigned long +\family default + cant_registros: cantidad de registros en el archivo de datos ( +\series bold +.dat +\series default +) +\layout Standard + +En base a la estructura descripta anteriormente y mediante la utilización + de la función +\family typewriter +emufs_leer_estadisticas() +\family default + disponible en la estructura común +\family typewriter +EMUFS +\family default + handler de cualquier tipo de archivo, podremos obtener una serie de estadística +s que pasamos a detallar (más alla de los datos básicos como cant registros, + 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 +\series default +) +\layout Itemize + +Relación entre el espacio ocupado por información de control y el tamaño + del archivo de datos ( +\series bold +.dat +\series default +) +\layout Itemize + +Cantidad promedio de espacio libre (en bloque o gap promedio) +\layout Itemize + +Desviaciones extremas de espacio libre (máximo/mínimo espacio libre en bloque + o mayor/menor gap) \layout Subsection -EMUFS_BLOCK_ID +Tipos Comunes \layout Standard -etc +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 @@ -1562,6 +1779,163 @@ A continuaci \layout Section Funciones principales +\layout Standard + +Las funciones principales son las necesarias para completar la estructura + EMUFS (ver página +\begin_inset LatexCommand \pageref{sub:EMUFS} + +\end_inset + +). +\layout Subsection + +Lectura de registros +\layout Standard + +Para leer un registro se hace uso del archivo de índice (ver página +\begin_inset LatexCommand \pageref{sec:idx} + +\end_inset + +), obteniéndose el número de bloque en donde está almacenado el registro + a buscar. + Una vez obtenido, se carga en memoria el bloque entero y se busca secuencialmen +te en él (leyendo la cabecera de cada registro y salteando los datos) hasta + encontrar el registro pedido. + Una vez encontrado se lo copia y devuelve. +\layout Standard + +Si se tratara de un registro +\emph on +multibloque +\emph default + (ver sección +\begin_inset LatexCommand \ref{sub:tipo1_reg_multi} + +\end_inset + +), se procede forma similar, sólo que se cargan en memoria uno a uno los + bloques que componen el registro y se van copiando (y uniendo) los +\emph on +fragmentos +\emph default + hasta completarlo. +\layout Standard + +Ver: +\family typewriter +emufs_tipo1_leer_registro() +\layout Subsection + +Altas de registros +\layout Standard + +Para realizar el alta de un registro, lo primero que se obtiene es un identifica +dor, buscando primero en el archivo de identificadores recuperables (pág. + +\begin_inset LatexCommand \ref{sec:did} + +\end_inset + +) y de no haber ninguno, buscando el mayor identificador presente en el + archivo de índice (pág. + +\begin_inset LatexCommand \ref{sec:idx} + +\end_inset + +) y sumándole uno. + El paso siguiente es buscar un bloque con espacio libre suficiente como + para almacenar el registro (y su cabecera) en el archivo de control de + espacio libre (pág. + +\begin_inset LatexCommand \ref{sec:fsc} + +\end_inset + +) y cargarlo completo en memoria. + De no encontrarse, se crea un bloque nuevo al final de archivo. + En el bloque cargado en memoria, se agrega el registro nuevo (con su cabecera) + al comienzo del espacio libre (calculado a partir del tamaño del bloque + y el espacio libre en bloque) y se lo graba en disco. + Finalmente se agrega (o actualiza) el identificador al archivo índice y + el espacio libre en el bloque. +\layout Standard + +Si el registro ocupara más de un bloque (ver sección +\begin_inset LatexCommand \ref{sub:tipo1_reg_multi} + +\end_inset + +), se buscan N bloques consecutivos (todos los que necesite el registro) + absolutamente libres +\begin_inset Foot +collapsed true + +\layout Standard + +Incluso el último bloque debe estar absolutamente libre para cumplir con + las condiciones presentadas en la sección +\begin_inset LatexCommand \ref{sub:tipo1_reg_multi} + +\end_inset + +. +\end_inset + + y graba bloque a bloque cada +\emph on +fragmento +\emph default + del registro (con sus cabeceras intermedias), al último +\emph on +fragmento +\emph default + se lo trata de forma análoga a un registro +\emph on +simple +\emph default +. + Por cada bloque utilizado se actualiza el archivo de control de espacio + libre. +\layout Standard + +Ver: +\family typewriter +emufs_tipo1_agregar_registro() +\layout Subsection + +Bajas de registros +\layout Standard + +Ver: +\family typewriter +emufs_tipo1_borrar_registro() +\layout Subsection + +Modificación de registros +\layout Standard + +Ver: +\family typewriter +emufs_tipo1_modificar_registro() +\layout Subsection + +Obtención de estadísticas +\layout Standard + +Ver: +\family typewriter +emufs_tipo1_leer_estadisticas() +\layout Subsection + +Compactación del archivo de datos +\layout Standard + +Ver: +\family typewriter + emufs_tipo1_compactar() \layout Section Detalles de implementación (funciones internas, ver si lo ponemos o no) @@ -2504,9 +2878,9 @@ Damos por terminada as para el caso del tipo 2, es realmente bastante sencillo. \layout Standard -Ver: +Ver: \family typewriter -void emufs_tipo2_compactar() + emufs_tipo2_compactar() \layout Section Consideraciones y Políticas de Diseño