]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - doc/informe.lyx
Added 2.3: Uso de la estructura EMUFS
[z.facultad/75.06/emufs.git] / doc / informe.lyx
index 81edbd28369c317d7040e7f863a588bcc3bb86b6..646add85163e7a25ffed0e75e48f436d5fe5c97b 100644 (file)
@@ -194,10 +194,12 @@ facturas
 \begin_inset Quotes erd
 \end_inset 
 
 \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 
 \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 
 \family default 
 donde
 \family typewriter 
@@ -256,15 +258,27 @@ emufs.h.
 
 A saberse los valores y significado correspondiente que puede tomar este
  tipo de dato son:
 
 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
+
 
 
-Archivos con registros de longitud fija y bloques parametrizables.
+\series bold 
+T2
+\series default 
+ : Archivos con registros de longitud variable sin bloques.
+\layout Itemize
+
+
+\series bold 
+T3
+\series default 
+ : Archivos con registros de longitud fija y bloques parametrizables.
 \layout Subsection
 
 EMUFS_Estadisticas
 \layout Subsection
 
 EMUFS_Estadisticas
@@ -362,7 +376,7 @@ unsigned long
 \layout Standard
 
 En base a la estructura descripta anteriormente y mediante la utilización
 \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 
 \family typewriter 
 emufs_leer_estadisticas()
 \family default 
@@ -403,7 +417,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
 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
  
 \series bold 
 emufs.h
@@ -411,9 +425,9 @@ emufs.h
 :
 \layout Itemize
 
 :
 \layout Itemize
 
-typedef 
+
 \family typewriter 
 \family typewriter 
-unsigned long EMUFS_REG_ID
+EMUFS_REG_ID
 \family default 
 : usado para representar un 
 \emph on 
 \family default 
 : usado para representar un 
 \emph on 
@@ -422,39 +436,46 @@ Id
  de un registro.
 \layout Itemize
 
  de un registro.
 \layout Itemize
 
-typdef 
+
 \family typewriter 
 \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
 
 \family default 
 : usado para representar el tamaño en bytes de un registro.
 \layout Itemize
 
-typedef 
+
 \family typewriter 
 \family typewriter 
-unsigned long EMUFS_BLOCK_ID
+EMUFS_BLOCK_ID
 \family default 
 : usado para representar un número de bloque.
 \layout Itemize
 
 \family default 
 : usado para representar un número de bloque.
 \layout Itemize
 
-typdef 
+
 \family typewriter 
 \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
 
 \family default 
 : usado para representar el tamaño en bytes de un bloque.
 \layout Itemize
 
-typedef 
+
 \family typewriter 
 \family typewriter 
-unsigned long EMUFS_FREE
+EMUFS_FREE
 \family default 
 : usado para representar espacio libre en bytes.
 \layout Itemize
 
 \family default 
 : usado para representar espacio libre en bytes.
 \layout Itemize
 
-typedef 
+
 \family typewriter 
 \family typewriter 
-unsigned long EMUFS_OFFSET
+EMUFS_OFFSET
 \family default 
 : usado para representar un offset.
 \family default 
 : usado para representar un offset.
+\layout Standard
+
+Todos son del tipo 
+\family typewriter 
+unsigned long
+\family default 
+.
 \layout Section
 
 
 \layout Section
 
 
@@ -551,6 +572,132 @@ archivo
 \layout LyX-Code
 
 /- 4 bytes -/
 \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
 \layout Chapter
 
 Archivos Auxiliares
@@ -1911,6 +2058,36 @@ emufs_tipo1_agregar_registro()
 Bajas de registros
 \layout Standard
 
 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()
 Ver: 
 \family typewriter 
 emufs_tipo1_borrar_registro()
@@ -1919,6 +2096,13 @@ emufs_tipo1_borrar_registro()
 Modificación de registros
 \layout Standard
 
 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()
 Ver: 
 \family typewriter 
 emufs_tipo1_modificar_registro()
@@ -1927,14 +2111,121 @@ emufs_tipo1_modificar_registro()
 Obtención de estadísticas
 \layout Standard
 
 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
 
 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
 
 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()
 Ver:
 \family typewriter 
  emufs_tipo1_compactar()
@@ -2015,7 +2306,7 @@ o freespace
 \begin_inset Float figure
 placement H
 wide false
 \begin_inset Float figure
 placement H
 wide false
-collapsed true
+collapsed false
 
 \layout Caption
 
 
 \layout Caption