++-----------+-----------+------------------------//-+
+\layout LyX-Code
+
+/- 4 bytes -/- 4 bytes -/
+\layout Subsection
+
+Organización física de un bloque
+\layout Standard
+
+Cada bloque no guarda información en sí, sólo se comporta como un contenedor
+ de registros.
+ Esto no significa que un bloque no tenga utilidad, el bloque es utilizado
+ para proveer un acceso semi-aleatorio a los registros.
+ Para esto se utiliza el archivo de índice (ver página
+\begin_inset LatexCommand \ref{sec:idx}
+
+\end_inset
+
+), que almacena pares [identificador de registro, número de bloque].
+ Para que sea suficiente este único índice para hallar un registro (siendo
+ que puede haber más de un registro por bloque), es necesario
+\emph on
+alinear los registros a izquierda
+\emph default
+.
+ Esto significa que hay que asegurar que siempre los registros en un bloque
+ se presenten de forma consecutiva, jamás permitiendo que haya un espacio
+ libre entre registros (en un mismo bloque).
+\layout Standard
+
+Podemos ver un ejemplo de esto en forma gráfica:
+\layout LyX-Code
+
+bloque N-1 | bloque N | bloque N+1
+\layout LyX-Code
+
+/----------+------------+------------+---------------+-----------/
+\layout LyX-Code
+
+
+\backslash
+ | registro 1 | registro 2 | espacio libre |
+\backslash
+
+\layout LyX-Code
+
+/----------+------------+------------+---------------+-----------/
+\layout LyX-Code
+
+ /------------- tamaño del bloque ---------/
+\layout Standard
+
+De esta forma, una vez obtenido el número de bloque, se pueda recorrer secuencia
+lmente hasta encontrar el registro deseado.
+ A fin de llevar el conteo de espacio libre se utiliza el archivo de control
+ de espacio libre (ver página
+\begin_inset LatexCommand \ref{sec:fsc}
+
+\end_inset
+
+), de forma tal que no sea necesario recorrer secuencialmente en busca de
+ espacio libre al hacer una inserción.
+\layout Standard
+
+Puede darse un caso excepcional en el que un registro sea más grande que
+ un bloque, en este caso el registro se almacenará en N bloques consecutivos
+ (siendo N la cantidad de bloques que necesita el registro), ocupando completos
+ los todos los bloques a excepción del último, en el que posteriormente
+ se pueden agregar más registros.
+\layout Subsubsection
+
+
+\begin_inset LatexCommand \label{sub:tipo1_reg}
+
+\end_inset
+
+Organización física de un registro.
+\layout Standard
+
+El registro es el que representa al dato realmente que se quiere almacenar.
+ Para representar ese dato se necesita una determinada información de control,
+ tanto para poder identificar el registro en un bloque (en búsquedas secuenciale
+s dentro del bloque) como para saber su longitud (dado que este tipo de
+ archivo utiliza registros de tamaño variable).
+\layout Standard
+
+Siguiendo la metodología general de E
+\begin_inset Formula $\mu$
+\end_inset
+
+FS, se optó por incluir esta información de control como una cabecera al
+ comienzo del registro, siguiendo a esta los datos en sí.
+ La cabecera está compuesta por un identificador (
+\family typewriter
+id
+\family default
+) de registro (EMUFS_REG_ID, 4 bytes) seguido por el tamaño (
+\family typewriter
+tamaño
+\family default
+) del registros (EMUFS_REG_SIZE, 4 bytes).
+ Podemos ver gráficamente como se se compone un registro:
+\layout LyX-Code
+
+registro [id]
+\layout LyX-Code
+
++-----------+-----------+------------------+
+\layout LyX-Code
+
+| id | tamaño | datos ...
+ |
+\layout LyX-Code
+
++-----------+-----------+------------------+
+\layout LyX-Code
+
+/- 4 bytes -/- 4 bytes -/- [tamaño] bytes -/
+\layout Subsubsection
+
+
+\begin_inset LatexCommand \label{sub:tipo1_reg_multi}
+
+\end_inset
+
+Organización física de un registro más grande que un bloque (registro
+\emph on
+multibloque
+\emph default
+).
+\layout Standard
+
+Puede darse el caso excepcional en que un registro sea de mayor longitud
+ que un bloque.
+ Al ser una situación excepcional, no siempre se resuelve de la forma más
+ eficiente ni se mínimiza el espacio ocupado por datos de control (como
+ se dijo anteriormente, se prefirió conservar la simpleza del código, adoptando
+ algoritmos generales aunque no sea de la forma más eficiente o maximizando
+ el uso del espacio para no perjudicar la mantenibilidad).
+\layout Standard
+
+Para menejar un registro
+\emph on
+multibloque
+\emph default
+se optó por limitarlo a la siguiente estructura (suponiendo que el registro
+ ocupa N bloques, con N > 1 y que un
+\emph on
+fragmento
+\emph default
+ es una porción del registro que entra en un bloque):
+\layout Itemize
+
+Los primeros N-1
+\emph on
+fragmentos
+\emph default
+ se almacenan en bloques completos consecutivos.
+\layout Itemize
+
+El último fragmento se almacena al comienzo del bloque inmediatamente posterior
+ al penúltimo.
+\layout Itemize
+
+Cada framento posee las cabeceras mencionadas en la sección
+\begin_inset LatexCommand \ref{sub:tipo1_reg}
+
+\end_inset
+
+, cuyo contenido es el siguiente:
+\begin_deeper
+\layout Itemize
+
+En
+\family typewriter
+id
+\family default
+ se almacena el identificador único obtenido al hacer el alta.
+\layout Itemize
+
+En
+\family typewriter
+tamaño
+\family default
+ se almacena el tamaño del
+\emph on
+fragmento
+\emph default
+ actual más los tamaños de los
+\emph on
+fragmentos
+\emph default
+ posteriores, quedando en el primer
+\emph on
+fragmento
+\emph default
+ el tamaño completo del registro y en el último sólo el tamaño del
+\emph on
+fragmento
+\emph default
+ final.
+\end_deeper
+\layout Standard
+
+Como puede observarse, la información de control en los
+\emph on
+fragmentos
+\emph default
+ intermedios puede ser redundante, pero se conserva para poder realizar
+ algoritmos genéricos (que se basan en que al principio de un bloque, si
+ no está vacío, hay una cabecera de un registro) y para facilitar chequeos
+ de integridad del archivo.
+\layout Standard
+
+A continuación se presenta un ejemplo gráfico de un registro multibloque
+ de 10 bytes (de contenido
+\begin_inset Quotes eld
+\end_inset
+
+1234567890
+\begin_inset Quotes erd
+\end_inset
+
+) almacenado en un archivo con bloques de 12 bytes (4 para datos):
+\layout LyX-Code
+
+| bloque 0 | bloque 1 | bloque 2
+\layout LyX-Code
+
++-------------------+-------------------+-------------------+-//-+
+\layout LyX-Code
+
+| registro 0 - 1/3 | registro 0 - 2/3 | registro 0 - 3/3..|
+\backslash
+
+\backslash
+ |
+\layout LyX-Code
+
+|+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
+\layout LyX-Code
+
+|| id | tam | datos||| id | tam | datos||| id | tam |dato|..|
+\backslash
+
+\backslash
+ |
+\layout LyX-Code
+
+||----+-----+------+||----+-----+------+||----+-----+----+..| // |
+\layout LyX-Code
+
+|| 0 | 10 | 1234 ||| 0 | 6 | 5678 ||| 0 | 2 | 90 |..|
+\backslash
+
+\backslash
+ |
+\layout LyX-Code
+
+|+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
+\layout LyX-Code
+
++-------------------+-------------------+-------------------+-
+\backslash
+
+\backslash
+-+
+\layout LyX-Code
+
+ ^^
+\layout LyX-Code
+
+ 2 bytes libres al final del bloque 2
+\layout Standard
+
+Este es un ejemplo figurativo, ya que se puso como límite mínimo de tamaño
+ de bloque 16 bytes (para que haya al menos la misma cantidad de espacio
+ para datos que para información de control).
+ Este límite mínimo ya roza lo absurdo (es muy ineficiente por la gran cantidad
+ de accesos a disco que necesita).
+ El límite físico es de 9 bytes (8 para información de control, 1 para datos).
+\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: