]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - doc/informe.lyx
un par de cositas
[z.facultad/75.06/emufs.git] / doc / informe.lyx
index 5505ca77b3949ae00e4478c5359dce85376d424e..a87459cf4e8cc1d54ffdb7458b72c07712033800 100644 (file)
@@ -43,12 +43,99 @@ Ricardo Markiewicz
 \layout Chapter
 
 Introducción
 \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
 \layout Section
 
 Tipos
 \layout Chapter
 
 Estructura común
 \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
+
+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 Subsection
 
 EMUFS
@@ -63,121 +150,116 @@ EMUFS
 \emph default 
 es la estuctura principal que encapsula todas las funciones para el manejo
  de un archivo de datos.
 \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
 
 \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.
 
 
 \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 
 
 
 \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 
 
 
 \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 
 
 
 \family typewriter 
-void*leer_bloque() 
+void **leer_bloque() 
 \family default 
 puntero a la función para leer un 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.
 
 
 \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 
 
 
 \family typewriter 
-void*leer_registro()
+void **leer_registro()
 \family default 
  puntero a la función para leer un registro.
 \family default 
  puntero a la función para leer un registro.
-\layout Enumerate
+\layout Itemize
 
 
 \family typewriter 
 
 
 \family typewriter 
-void*leer_registro_raw()
+void **leer_registro_raw()
 \family default 
  puntero a la función para leer un registro con su encabezado.
 \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.
 
 
 \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.
 
 
 \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.
 
 
 \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.
 
 
 \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.
 
 
 \family typewriter 
 void *compactar()
 \family default 
  puntero a la función para compactar un archivo.
-\layout Enumerate
+\layout Itemize
 
 
 \family typewriter 
 
 
 \family typewriter 
-charnombre
+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
 \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 
 \layout Standard
 
 Por ejemplo si se desea crear un archivo de nombre 
@@ -188,10 +270,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 
@@ -231,15 +315,211 @@ emufs_tipo3_leer_bloque()
 \layout Subsection
 
 EMUFS_Tipo
 \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 Itemize
+
+
+\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
+
+
+\series bold 
+T3
+\series default 
+ : Archivos con registros de longitud fija y bloques parametrizables.
 \layout Subsection
 
 EMUFS_Estadisticas
 \layout Subsection
 
 EMUFS_Estadisticas
-\layout Subsection
+\layout Standard
 
 
-EMUFS_BLOCK_ID
+
+\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
 
 \layout Standard
 
-etc
+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 
+\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 
+\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 
+\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 
+\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 
+\family typewriter 
+total_fs
+\family default 
+: total de espacio libre en el archivo de datos.
+\layout Itemize
+
+
+\family typewriter 
+unsigned long
+\family default 
+\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 
+\family typewriter 
+min_fs
+\family default 
+: idem pero mínimo.
+\layout Itemize
+
+
+\family typewriter 
+unsigned long
+\family default 
+\family typewriter 
+cant_bloques
+\family default 
+: cantidad de bloques en el archivo de datos (.
+\series bold 
+dat
+\series default 
+)
+\layout Itemize
+
+
+\family typewriter 
+unsigned long
+\family default 
+\family typewriter 
+cant_registros
+\family default 
+: 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 de lectura de estadísticas l
+\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
+
+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 Section
 
 
 \layout Section
 
 
@@ -321,21 +601,147 @@ cabecera general
 archivo
 \layout LyX-Code
 
 archivo
 \layout LyX-Code
 
-+-----------+--------------------------------------------//-+
-\layout LyX-Code
++-----------+--------------------------------------------//-+
+\layout LyX-Code
+
+|    tipo   | Datos dependientes del tipo de archivo ...
+\backslash 
+
+\backslash 
+ |
+\layout LyX-Code
+
++-----------+--------------------------------------------//-+
+\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 
+
 
 
-|    tipo   | Datos dependientes del tipo de archivo ...
-\backslash 
+\layout Standard
 
 
-\backslash 
- |
+Así pues, cuando se utilize la estructura para por ejemplo leer un registro,
+ sucedera lo siguiente:
 \layout LyX-Code
 
 \layout LyX-Code
 
-+-----------+--------------------------------------------//-+
-\layout LyX-Code
+efs->leer_registro(params) -- calls -->  emufs_tipo3_leer_registro(params)
+\layout Standard
 
 
-/- 4 bytes -/
+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
@@ -419,12 +825,6 @@ EMUFS_IDX
 ):
 \layout LyX-Code
 
 ):
 \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
 
 typedef struct emufs_idx_t { 
 \layout LyX-Code
 
@@ -688,9 +1088,13 @@ emufs_idx_agregar()
 Baja:
 \series default 
  Ante el borrado de un registro del archivo de datos, se accederá el registro
 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 
  Como se verá mas adelante, según el tipo de organización física, el registro
  puede ser borrado concretamente del .
 \series bold 
@@ -775,10 +1179,10 @@ EMUFS_FSC
 typedef struct emufs_fsc_t { 
 \layout LyX-Code
 
 typedef struct emufs_fsc_t { 
 \layout LyX-Code
 
-  unsigned long int marker;
+  EMUFS_BLOCK_ID marker;
 \layout LyX-Code
 
 \layout LyX-Code
 
-  unsigned long int freespace;
+  EMUFS_FREE freespace;
 \layout LyX-Code
 
 } EMUFS_FSC;
 \layout LyX-Code
 
 } EMUFS_FSC;
@@ -1186,7 +1590,11 @@ emufs_did_agregar()
 \layout List
 \labelwidthstring 00.00.0000
 
 \layout List
 \labelwidthstring 00.00.0000
 
-Baja Cuando el sistema desee grabar un nuevo registro en el archivo de datos,
+
+\series bold 
+Baja
+\series default 
+ Cuando el sistema desee grabar un nuevo registro en el archivo de datos,
  este pedirá un 
 \family typewriter 
 id_reg
  este pedirá un 
 \family typewriter 
 id_reg
@@ -1562,6 +1970,307 @@ A continuaci
 \layout Section
 
 Funciones principales
 \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
+
+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()
+\layout Subsection
+
+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()
+\layout Subsection
+
+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 Section
 
 Detalles de implementación (funciones internas, ver si lo ponemos o no)
@@ -1639,7 +2348,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
 
@@ -1707,16 +2416,17 @@ El archivo indice (
 \series bold 
 .idx
 \series default 
 \series bold 
 .idx
 \series default 
-), permite la localizacin de los registros en el .DAT de forma directa, mediante
- la obtención de su offset o posición relativa respecto del inicio del 
+), permite la localización de los registros en el .DAT de forma directa,
+ mediante la obtención de su offset o posición relativa respecto del inicio
+ del 
 \series bold 
 .dat
 \series default 
  en donde se encuentra un registro dado, indicado por su ID.
 \layout Standard
 
 \series bold 
 .dat
 \series default 
  en donde se encuentra un registro dado, indicado por su ID.
 \layout Standard
 
-Así pues, si tomamos el ejemplo descripto al inicio de este capítudlo, tendremos
- las siguientes entradas en el archivo indice 
+Así pues, si tomamos el ejemplo descripto al inicio de este capítulo, tendremos
+ las siguientes entradas en el archivo índice 
 \series bold 
 .idx
 \series default 
 \series bold 
 .idx
 \series default 
@@ -1848,12 +2558,12 @@ te luego del header tendremos el registro en s
 Achivo de Gaps / Espacios Libres (.fsc)
 \layout Standard
 
 Achivo de Gaps / Espacios Libres (.fsc)
 \layout Standard
 
-El archivo de espacios libres o gaps (.fsc), tiene como función la administracion
+El archivo de espacios libres o gaps (.fsc), tiene como función la administración
  del espacio libre o gaps (agujeros), generados por previas eliminaciones
  de registros en el archivo de datos.
  El mismo, nos indicará donde hay lugar para insertar un nuevo registro
  (se podrán insertar en algún gap acorde, o bien al final del archivo).
  del espacio libre o gaps (agujeros), generados por previas eliminaciones
  de registros en el archivo de datos.
  El mismo, nos indicará donde hay lugar para insertar un nuevo registro
  (se podrán insertar en algún gap acorde, o bien al final del archivo).
- Este archivo será utilizado tambien para el proceso de compactación de
+ Este archivo será utilizado tambien para el proceso de compactación de
  un archivo, explicado luego.
 \layout Standard
 
  un archivo, explicado luego.
 \layout Standard
 
@@ -1961,7 +2671,11 @@ Nota:
 \emph default 
  Por requerimiento del algoritmo de compactación, los gaps se graban en
  forma ordenada en el (.fsc).
 \emph default 
  Por requerimiento del algoritmo de compactación, los gaps se graban en
  forma ordenada en el (.fsc).
- (El orden se corresponde con lo que hay en el .dat)
+ (El orden se corresponde con lo que hay en el 
+\series bold 
+.dat
+\series default 
+.
 \layout Subsubsection*
 
 GAP Merging
 \layout Subsubsection*
 
 GAP Merging
@@ -2504,9 +3218,9 @@ Damos por terminada as
  para el caso del tipo 2, es realmente bastante sencillo.
 \layout Standard
 
  para el caso del tipo 2, es realmente bastante sencillo.
 \layout Standard
 
-Ver: 
+Ver:
 \family typewriter 
 \family typewriter 
-void emufs_tipo2_compactar()
+ emufs_tipo2_compactar()
 \layout Section
 
 Consideraciones y Políticas de Diseño
 \layout Section
 
 Consideraciones y Políticas de Diseño
@@ -2608,6 +3322,17 @@ En este caso veremos que sucede luego de agregar y borrar una gran cantidad
  de registros del archivo, lo que provoca como consecuencia directa la fragmenta
 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
  produce un desperdicio de espacio.
  de registros del archivo, lo que provoca como consecuencia directa la fragmenta
 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
  produce un desperdicio de espacio.
+\layout Standard
+
+La implementación de este tipo de archivo puede ser encontrada en 
+\family typewriter 
+emufs/tipo3.c
+\family default 
+ mientras que su interfaz pública está disponible en 
+\family typewriter 
+emufs/tipo3.h
+\family default 
+.
 \layout Section
 
 Organización Física
 \layout Section
 
 Organización Física
@@ -2621,25 +3346,62 @@ Esta organizaci
 
 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
  del archivo.
 
 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
  del archivo.
+\layout Standard
+
+El archivo estara compuesto por una cabecera que da información sobre el
+ tipo de organización, el tamaño de los bloques y el tamaño de los registros.
 \layout Subsection
 
 \layout Subsection
 
-Comportamiento Particular de los Archivos Auxiliares
-\layout Subsubsection
+Organización Física de un Bloque
+\layout Standard
 
 
-Archivo de Bloques y Registros (.idx)
-\layout Comment
+Cada bloque será capaz de contener la cantidad de registros enteros que
+ quepan en él.
+ De esta manera un registro que no entre completamente en el bloque deberá
+ almacenarce en un bloque diferente.
+\layout Standard
 
 
-buscar algun caso extraordinario.
-\layout Subsubsection
+Los bloques no contienen ninguna información adicional, solo se conoce su
+ tamaño y se usa para delimitar 
+\begin_inset Quotes eld
+\end_inset 
 
 
-Archivo de Bloques y Espacio Libre (.fsc)
-\layout Subsubsection
+virtualmente
+\begin_inset Quotes erd
+\end_inset 
+
+ zonas en el archivo.
+\layout Subsection
+
+Organizacion Física de Registros
+\layout Standard
+
+Cada registro se almacena en un bloque, y contiene una cabecera que indica
+ su 
+\emph on 
+ID, 
+\emph default 
+por este motivo al realizar la busqueda de espacio en un bloque se lo hará
+ preguntando por el tamaño del registro más 
+\family typewriter 
+sizeof(EMUFS_REG_ID).
+\layout Subsection
 
 
-Archivo de Id`s Borrados (.did)
+Organización Física de Registros Multibloque
 \layout Standard
 
 \layout Standard
 
-El comportamiento de este archivo, es común para todas las organizaciones
- y se ha explicado en 3.3.2.
+Al ser los registros de longitud constante, se ha adoptado que un registro
+ multibloque nunca podra estar almacenado en algún lugar que no sea el comienzo
+ de un bloque.
+ De esta manera se puede calcular cuantos bloques ocupará un registro y
+ se podrá solicitar lugar para almacenarlo con la ayuda de la función 
+\family typewriter 
+emufs_fsc_buscar_n_lugares(), 
+\family default 
+que es muy importante para evitar el solapamiento de registros.
+ Esta consideración acarrea como consecuencia directa un alto costo en términos
+ del espacio desperdiciado.
 \layout Section
 
 Funciones Principales
 \layout Section
 
 Funciones Principales
@@ -2693,6 +3455,18 @@ Luego de grabar un registro, actualiza los archivos de 
  para mantener la coherencia.
 \layout Standard
 
  para mantener la coherencia.
 \layout Standard
 
+Cuando nos encontramos con registros multibloque, se calcula cuantos bloques
+ ocupará el registro de la siguiente manera: Cantidad de Bloques = 1 + Tamaño
+ del Registro/(Tamaño del Bloque-Sizeof(EMUFS_REG_ID)
+\layout Standard
+
+y con esta información se realiza un ciclo 
+\family typewriter 
+for
+\family default 
+ que grabará tantas veces como sea necesario.
+\layout Standard
+
 Ver: 
 \family typewriter 
 emufs_tipo3_grabar_registro()
 Ver: 
 \family typewriter 
 emufs_tipo3_grabar_registro()
@@ -2717,6 +3491,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
 
  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()
 Ver: 
 \family typewriter 
 emufs_tipo3_borrar_registro()
@@ -2792,9 +3571,6 @@ void emufs_tipo3_compactar()
 \layout Section
 
 Consideraciones y Políticas de Diseño
 \layout Section
 
 Consideraciones y Políticas de Diseño
-\layout Comment
-
-Esto para mi va en organización física.
 \layout Standard
 
 Se han tomado ciertas consideraciones para algunos casos particulares que
 \layout Standard
 
 Se han tomado ciertas consideraciones para algunos casos particulares que