\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
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 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
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
:
\layout Itemize
-typedef
+
\family typewriter
-unsigned long EMUFS_REG_ID
+EMUFS_REG_ID
\family default
: usado para representar un
\emph on
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
\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
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()
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()
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()
\begin_inset Float figure
placement H
wide false
-collapsed true
+collapsed false
\layout Caption