]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - doc/informe.lyx
* Me preparo para otro tamaño de bloque
[z.facultad/75.06/emufs.git] / doc / informe.lyx
index 81edbd28369c317d7040e7f863a588bcc3bb86b6..ab091fa943ab90d69da1e1485f81b755c8056c6c 100644 (file)
@@ -43,6 +43,53 @@ 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 Standard
+
+EMUFS se presenta como un 
+\emph on 
+emulador
+\emph default 
+ de un 
+\emph on 
+filesystem
+\emph default 
+, capaz de administrar datos almacenados en cualquiera de las tres organizacione
+s de archivo previamente mencionadas, las cuales a saberse son:
+\layout Enumerate
+
+Registros de Longitud Variable, Bloques de tamaño parametrizable
+\layout Enumerate
+
+Registros de Longitud Variable, Sin Bloques
+\layout Enumerate
+
+Registros de Longitud Fija, Bloques de tamaño parametrizables
+\layout Standard
+
+A través de este trabajo, se podrán observar las diferencias entre distintos
+ tipos de organización de archivos, ventajas y desventajas de cada una de
+ ellas, y las situaciones particulares que deberá sortear un filesystem,
+ como la partición de registros en distintos bloques, manejo de espacio
+ libre, compactación de un archivo, etc.
+\layout Standard
+
+A continuación, veremos que el manejo de los archivos en EMUFS se realiza
+ a través de una estructura de control comun para cualquier tipo de archivo,
+ dandole flexibilidad y escalabilidad a nuestro sistema.
+\layout Standard
+
+Hacia el final de esta presentación, se observaran las pruebas realizadas
+ con las distintas organizaciones de archivos, y las conclusiones obtenidos
+ al respecto.
 \layout Chapter
 
 Estructura común
@@ -62,6 +109,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 +308,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 +372,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 +418,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 +513,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 +525,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 +558,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 +654,132 @@ 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.
+ 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 true
+
+\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) -- calls -->  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 Chapter
 
 Archivos Auxiliares
@@ -634,12 +863,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 +1126,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 +1217,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 +2138,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 +2176,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 +2191,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()
@@ -2015,7 +2386,7 @@ o freespace
 \begin_inset Float figure
 placement H
 wide false
-collapsed true
+collapsed false
 
 \layout Caption
 
@@ -3122,6 +3493,29 @@ Luego de grabar un registro, actualiza los archivos de 
  para mantener la coherencia.
 \layout Standard
 
+Cuando nos encontramos con registros multibloque, se calcula cuantos bloques
+ ocupará el registro de la siguiente manera: 
+\family typewriter 
+Cantidad de Bloques = 1 + Tamaño del Registro/(Tamaño del Bloque-Sizeof(EMUFS_RE
+G_ID)
+\layout Standard
+
+Esta ecuación solo falla en el caso que el tamaño del registro y el tamaño
+ del bloque sean iguales, en tal caso, se coloca el valor 1 en 
+\family typewriter 
+Cantidad de Bloques
+\family default 
+ post verificación.
+\layout Standard
+
+Y con esta información se realiza un ciclo 
+\family typewriter 
+for
+\family default 
+ que grabará tantas veces como sea necesario levantando y grabando los bloques
+ que correspondan.
+\layout Standard
+
 Ver: 
 \family typewriter 
 emufs_tipo3_grabar_registro()
@@ -3146,6 +3540,11 @@ Cabe destacar que para dar de baja un registro no hace falta borrarlo del
  ser así, si no se realizara el mismo.
 \layout Standard
 
+En el caso de los registros multibloque, se eliminará la porción del registro
+ contenida en el primer bloque y se actualizarán de manera conveniente los
+ archivos índice, para restaurarlos a un valor verdadero.
+\layout Standard
+
 Ver: 
 \family typewriter 
 emufs_tipo3_borrar_registro()