X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/c3310277e911e1e8a987f166b3975b7cafe1f3b3..2cf92bb9a77c066074e817f1a0e6ce3933a95a57:/doc/informe.lyx?ds=inline
diff --git a/doc/informe.lyx b/doc/informe.lyx
index adaf456..f25411c 100644
--- a/doc/informe.lyx
+++ b/doc/informe.lyx
@@ -49,6 +49,17 @@ Estructura com
\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
EMUFS
@@ -63,94 +74,101 @@ EMUFS
\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
-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.
-\layout Enumerate
+\layout Itemize
\family typewriter
EMUFS_BLOCK_SIZE
\family default
indica el tamaño del bloque para los tipos 1 y 3.
-\layout Enumerate
+\layout Itemize
\family typewriter
EMUFS_REG_SIZE
\family default
indica el tamaño del registro, para el tipo 3 que posee tamaño constante.
-\layout Enumerate
+\layout Itemize
\family typewriter
void **leer_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.
-\layout Enumerate
+\layout Itemize
\family typewriter
void **leer_registro()
\family default
puntero a la función para leer un registro.
-\layout Enumerate
+\layout Itemize
\family typewriter
void **leer_registro_raw()
\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.
-\layout Enumerate
+\layout Itemize
\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.
-\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.
-\layout Enumerate
+\layout Itemize
\family typewriter
void *compactar()
\family default
puntero a la función para compactar un archivo.
-\layout Enumerate
+\layout Itemize
\family typewriter
@@ -160,7 +178,12 @@ char *nombre
\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
@@ -214,15 +237,226 @@ emufs_tipo3_leer_bloque()
\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 Enumerate
+
+Archivos con registros de longitud variable y bloques parametrizables.
+\layout Enumerate
+
+Archivos con registros de longitud variable sin bloques.
+\layout Enumerate
+
+Archivos con registros de longitud fija y bloques parametrizables.
\layout Subsection
EMUFS_Estadisticas
+\layout Standard
+
+
+\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
+
+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
+ tam_archivo: 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.
+\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.
+\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)
+\layout Itemize
+
+
+\family typewriter
+unsigned long
+\family default
+ total_fs: 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).
+\layout Itemize
+
+
+\family typewriter
+unsigned long
+\family default
+ min_fs: idem pero mínimo.
+\layout Itemize
+
+
+\family typewriter
+unsigned long
+\family default
+ cant_bloques: cantidad de bloques en el archivo de datos (.
+\series bold
+dat
+\series default
+)
+\layout Itemize
+
+
+\family typewriter
+unsigned long
+\family default
+ cant_registros: 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
+\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
+
+
+\emph on
+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 Subsection
-EMUFS_BLOCK_ID
+Tipos Comunes
\layout Standard
-etc
+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
@@ -322,10 +556,43 @@ archivo
\layout Chapter
Archivos Auxiliares
-\layout Comment
+\layout Standard
+
+Acompañando al archivo de datos (
+\series bold
+.dat
+\series default
+) el cual es responsable de la contención de los registros, tendremos tres
+ archivos auxiliares (
+\series bold
+.idx
+\series default
+,
+\series bold
+.fsc
+\series default
+ y
+\series bold
+.did
+\series default
+) cuya funcionalidad y propósito pasamos a describir a continuación, sin
+ antes remarcar que los tres archivos poseen una sola implementación para
+ las distintas formas de organización física que hemos implementado (tres
+ para ser mas exactos).
+\layout Standard
-Por que los 3 tipos usan lo mismo.
- Ventajas y desventajas.
+Entre las ventajas de poseer la misma implementación se encuentra el tener
+ un API común entre los tres tipos para el manejo de la localización de
+ sus registros, administración de espacio libre e Id's liberados, sin necesidad
+ de realizar n-implementaciones para un mismo objetivo final.
+\layout Standard
+
+Además, la obtención de ciertos datos estadísticos como espacio libre, o
+ cantidad de registros, se realiza a través de la misma interfaz, y también
+ se ha facilitado en cierto grado la re-organización física de un archivo
+ (pasar de un tipo a otro), dado el uso de estos tres archivos auxiliares
+ en común para funciones tan predominantes como índexación, administración
+ de espacio libre y recuperación de Id's.
\layout Section
@@ -333,520 +600,1776 @@ Por que los 3 tipos usan lo mismo.
\end_inset
-Archivo de índice
-\layout Standard
-
-Con la ayuda de un archivo de bloques y registros (de extensión .idx), podremos
- ubicar cualquier registro existente dentro del archivo.
+Archivo índice
\layout Standard
-El archivo de índice contiene una estructura que contiene el id de un registro
- y el número de bloque al que pertenece.
- Este archivo esta ordenado por
+El archivo índice (.idx), permite la localización de los registros en el
+ .DAT de forma directa, mediante la obtención de su offset respecto del inicio
+ del .dat, o nro bloque (segun el tipo de organización física) en donde se
+ encuentra un registro dado, indicado por su
\emph on
-id
-\emph default
-, de modo que incrementa su tamaño cada vez que se grabe en el archivo de
- datos un nuevo registro, excepto que un registro haya sido borrado con
- anterioridad lo cual produce que al guardar un nuevo registro se actualice
- y no crezca.
+id_reg.
\layout Standard
-Si un registro es borrado del archivo de datos, debe actualizarse el índice,
- esto se logra colocando un flag que indique que el
-\emph on
-id
-\emph default
- no pertenece a ningún bloque, hemos adoptado poner -1 en el campo location
- de la estructura
-\family typewriter
-EMUFS_IDX
-\family default
-.
+Los registros de este archivo se encuentran representados una estructura
+ que indica un número de registro y el bloque u offset en donde se encuentra
+ el mísmo.
\layout Standard
Es necesario que este archivo esté ordenado por
\emph on
-id
+id_reg
\emph default
- de registro, ya que esto permitirá el acceso directo para la búsqueda de
- un registro en el archivo de datos.
+, ya que esto permitirá el acceso directo al mismo, para la rápida obtención
+ del nro de bloque u offset y posterior búsqueda de un registro en el archivo
+ de datos.
\layout Subsection
Organización física
\layout Standard
-El tipo
+Los registros de este archivo se encuentran representados a nivel codigo
+ por el siguiente tipo de dato interno (
\family typewriter
EMUFS_IDX
\family default
- define la estuctura de los registros de este archivo.
-\layout Standard
+):
+\layout LyX-Code
-Esta estructura está compuesta por:
-\layout Itemize
+typedef unsigned long EMUFS_REG_ID;
+\layout LyX-Code
+typedef unsigned long EMUFS_OFFSET;
+\layout LyX-Code
-\family typewriter
-EMUFS_REG_ID
-\family default
- reg_id indica el
-\emph on
-id
-\emph default
- del registro
-\layout Itemize
+typedef struct emufs_idx_t {
+\layout LyX-Code
+
+ EMUFS_REG_ID id_reg;
+\layout LyX-Code
+ EMUFS_OFFSET location;
+\layout LyX-Code
-\family typewriter
-EMUFS_BLOCK_ID
-\family default
- location número de bloque donde se encuentra el registro.
+} EMUFS_IDX;
\layout Standard
-\family typewriter
-EMUFS_REG_ID
-\family default
- y
-\family typewriter
-EMUFS_BLOCK_ID
-\family default
- son
-\emph on
-unsigned long.
-\layout Comment
+\begin_inset Float table
+placement H
+wide false
+collapsed true
-ponerlo mas lindo...
-\layout Subsection
+\layout Caption
-Comportamiento (funciones generales)
-\layout Section
+Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
+ Tipo 1 y 3
+\layout Standard
-\begin_inset LatexCommand \label{sec:fsc}
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
+\layout Standard
+
+id_reg
\end_inset
+ |
+
+\begin_inset Text
-Archivo de control de espacio libre
\layout Standard
-El archivo de de espacios libres permite decidir a la hora de guardar un
- registro, donde será guardado.
-
-\layout Standard
+nro_bloque
+\end_inset
+ |
+
+\begin_inset Text
-La estructura de este archivo está formada por un número que indica el bloque
- y otro que indica el espacio libre en él.
\layout Standard
-De esta manera al querer guardar un registro este archivo informará donde
- cabe el mismo, previa invocación al la función
-\family typewriter
-EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *, EMUFS_FREE, EMUFS_FREE*)
-\family default
- perteneciente a
-\emph on
-fsc.h,
-\emph default
- la cual devuelve el número de bloque donde entra el registro o -1 si no
- hay un bloque con lugar suficiente, y toma como parámetros una estructura
-
-\family typewriter
-EMUFS
-\family default
-, y dos
-\family typewriter
-EMUFS_FREE
-\family default
- donde el segndo parámetro es el tamaño buscado, y el tercero devuelve el
- tamaño disponible.
+\end_inset
+ |
+
+
+
+\begin_inset Text
+
\layout Standard
-De la misma manera, al borrar un registro este archivo debe ser actualizado
- colocando el nuevo espacio libre en el bloque.
-\layout Subsection
+5
+\end_inset
+ |
+
+\begin_inset Text
-Organización Física
\layout Standard
-La estuctura que define este archivo es la siguiente:
+54
+\end_inset
+ |
+
+\begin_inset Text
+
\layout Standard
+Indica que el registro de id_reg = 5, se encuentra en el bloque 54
+\end_inset
+ |
+
+
-\family typewriter
-EMUFS_FSC
-\family default
- que contiene:
-\layout Itemize
+\end_inset
-\family typewriter
-EMUFS_BLOCK_ID
-\family default
- indica el número de bloque
-\layout Itemize
+\end_inset
+
+
+\begin_inset Float table
+placement H
+wide false
+collapsed true
+\layout Caption
-\family typewriter
-EMUFS_FREE
-\family default
- freespace indica la cantidad de espacio libre que queda en el bloque.
+Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
+ Tipo 2
\layout Standard
-\family typewriter
-EMUFS_FSC
-\family default
- y
-\family typewriter
-EMUFS_FREE
-\family default
- son
-\emph on
-unsiged long int
-\layout Subsection
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
-Comportamiento
-\layout Section
+\layout Standard
+id_reg
+\end_inset
+ |
+
+\begin_inset Text
-\begin_inset LatexCommand \label{sec:did}
+\layout Standard
+nro_bloque
\end_inset
+ |
+
+\begin_inset Text
-Archivo de índices recuperables
\layout Standard
-Este archivo funciona como una pila de i
-\emph on
-d`s
-\emph default
- borrados, es decir, cuando se borra un registro el
-\emph on
-id
-\emph default
- se almacena en este archivo y será recuperado cuando se desee grabar un
- registro nuevo, de esta manera se aprovechan todos los
-\emph on
-id`s
-\emph default
- sin necesidad de crear uno nuevo cada vez que se borra y graba un registro.
-\layout Subsection
+\end_inset
+ |
+
+
+
+\begin_inset Text
-Estructura Física
\layout Standard
-Este archivo tiene registros de un solo campo,
-\family typewriter
-EMUFS_REG_ID
-\family default
- el cual simboliza al id almacenado.
+5
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+54
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+Indica que el registro de id_reg = 5, se encuentra en el bloque 54
+\end_inset
+ |
+
+
+
+\end_inset
+
+
+\end_inset
+
+
+\layout Standard
+
+
+\series bold
+\emph on
+Nota:
+\series default
+\emph default
+Como se puede observar, para distintas organizaciones el significado de
+ los registros en este archivo es diferente y se utilizará de distinta manera
+ en consecuencia.
\layout Subsection
Comportamiento
\layout Standard
Las declaraciones e implementación se pueden encontrar en
+\series bold
\emph on
-did.h
+idx.h
+\series default
\emph default
y
+\series bold
\emph on
-did.c
+idx.c
+\series default
\emph default
- respectivamente
-\layout Itemize
+ respectivamente:
+\layout List
+\labelwidthstring 00.00.0000
\series bold
-Agregar:
-\series default
-agrega un
\emph on
-id
+Búsqueda:
+\series default
\emph default
-al archivo, el cual será el primero recuperado.
+ Los registros del archivo indice (
+\series bold
+.idx
+\series default
+), poseen una correspondencia 1 a 1, con los Id's de los registros en el
+ archivo de datos (
+\series bold
+.dat
+\series default
+).
+ Con esto, queremos decir que el N-ésimo registro del archivo índice, será
+ aquél que posea la información para localizar al registro cuyo
+\family typewriter
+id_reg
+\family default
+ es N, dentro del archivo de datos (
+\series bold
+.dat
+\series default
+).
+\newline
+
+\series bold
+NOTA:
+\series default
+ Cabe aclarar que por si bien el indice se encuentra ordenado por
+\family typewriter
+id_reg
+\family default
+, los registros en el archivo de datos, por lo general no lo estarán.
+ (ordenados por id).
+\newline
+Ver:
\family typewriter
-Ver: emufs_did_agregar()
-\layout Itemize
+emufs_idx_buscar_registro()
+\layout List
+\labelwidthstring 00.00.0000
\series bold
-Obtener el último:
+Alta:
\series default
- Obtiene el último
-\emph on
-id
-\emph default
- que se guardó en el archivo (o se eliminó del archivo de datos), y trunca
- el archivo.
+ Ante la alta de un registro en el archivo de datos, se insetará un nuevo
+ registro en el archivo índice, con el id_reg del registro en cuestion,
+ y el offset u bloque donde se lo haya grabado en disco.
+\newline
+Ver:
+\family typewriter
+emufs_idx_agregar()
+\layout List
+\labelwidthstring 00.00.0000
+
+
+\series bold
+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.
+ Como se verá mas adelante, según el tipo de organización física, el registro
+ puede ser borrado concretamente del .
+\series bold
+dat
+\series default
+ o nó.
+\newline
+Ver:
\family typewriter
-Ver: emufs_did_get_last()
-\layout Chapter
+emufs_idx_borrar()
+\layout List
+\labelwidthstring 00.00.0000
-\begin_inset LatexCommand \label{cha:tipo1}
+\series bold
+Modificación:
+\series default
+ Ante la modificación en la posición física de un registro dentro del archivo
+ de datos (por ejemplo luego del proceso de recompactación, se realizará
+ la modificación respectiva del campo
+\family typewriter
+location
+\family default
+.
+\newline
+Ver:
+\family typewriter
+emufs_idx_actualizar()
+\layout Section
+
+
+\begin_inset LatexCommand \label{sec:fsc}
\end_inset
-Archivo con bloques parametrizados y registros de longitud variable
+Archivo de control de espacio libre
\layout Standard
-Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
- intermedio entre el
-\begin_inset LatexCommand \ref{cha:tipo2}
+El archivo de espacio libre (
+\series bold
+.fsc
+\series default
+) (espacio por bloque o gaps en archivo, según el tipo de organización física),
+ tiene como función la administración del espacio libre, generado por previas
+ eliminaciones de registros en el archivo de datos.
+ El mismo, nos indicará donde hay lugar para insertar un nuevo registro.
+\layout Standard
-\end_inset
+Para el caso de una organización por bloque, nos dirá en que bloque o si
+ se debe generar un nuevo bloque.
+ En el caso de la organización sin bloques, nos indicará en que gap o si
+ al final del archivo.
+\layout Standard
- y el
-\begin_inset LatexCommand \ref{cha:tipo3}
+Los registros de este archivo se encuentran representados una estructura
+ que indica un número de bloque u offset y el espacio libre disponible en
+ el mismo (o apartir del mismo en el caso del offset).
+\layout Standard
-\end_inset
- (cuenta tanto con bloques como con registros variables), hereda los inconvenien
-tes (y ventajas) de ambos, más los propios.
- Al implementar este tipo de archivo se puso enfásis en la eficiencia mientras
- esta no comprometa la mantenibilidad del código, es por esto que en algunas
- circunstancias no se hace un uso óptimo del espacio.
+\series bold
+Nota
+\series default
+: Por requerimiento del algoritmo de compactación el tipo de organización
+ física con reg long var, sin bloques, los gaps se graban en forma ordenada
+ en el (.fsc).
+ (El orden se corresponde con lo que hay en el .dat).
+\layout Subsection
+
+Organización Física
\layout Standard
-La implementación de este tipo de archivo puede ser encontrada en
-\family typewriter
-emufs/tipo1.c
-\family default
- mientras que su interfaz pública está disponible en
+Los registros de este archivo se encuentran representados a nivel codigo
+ por el siguiente tipo de dato interno (
\family typewriter
-emufs/tipo1.h
+EMUFS_FSC
\family default
-.
-\layout Section
+):
+\layout LyX-Code
-Organización física
+typedef struct emufs_fsc_t {
+\layout LyX-Code
+
+ unsigned long int marker;
+\layout LyX-Code
+
+ unsigned long int freespace;
+\layout LyX-Code
+
+} EMUFS_FSC;
\layout Standard
-El archivo está compuesto por la
+
+\series bold
\emph on
-cabecera general
-\emph default
- (ver página
-\begin_inset LatexCommand \pageref{sec:cabecera_gral}
+\begin_inset Float table
+placement H
+wide false
+collapsed true
+
+\layout Caption
+
+Ejemplo de registro en archivo de control de espacio libre para un archivo
+ con bloques
+\layout Standard
+
+
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
+
+\layout Standard
+
+nro_bloque
\end_inset
+ |
+
+\begin_inset Text
-).
- El valor que toma en este tipo de archivo es 0 (o el valor simbólico
-\family typewriter
-T1
-\family default
- del tipo
-\family typewriter
-EMUFS_Tipo
-\family default
-).
- Luego le sigue una cabecera propia del archivo (un
-\family typewriter
-EMUFS_BLOCK_SIZE
-\family default
-, 4 bytes) que almacena el tamaño del bloque que usa el archivo.
- De esta menera, al abrir un archivo de este tipo no se necesita tener ninguna
- información sobre él.
- A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
- en la cabecera antes mencionada.
-\layout LyX-Code
+\layout Standard
-archivo
-\layout LyX-Code
+freespace
+\end_inset
+ |
+
+\begin_inset Text
-+-----------+-----------+------------------------//-+
-\layout LyX-Code
+\layout Standard
-| tipo | tam bloque| Cero o más bloques ...
-
-\backslash
+\end_inset
+ |
+
+
+
+\begin_inset Text
-\backslash
- |
-\layout LyX-Code
+\layout Standard
-+-----------+-----------+------------------------//-+
-\layout LyX-Code
+12
+\end_inset
+ |
+
+\begin_inset Text
-/- 4 bytes -/- 4 bytes -/
-\layout Subsection
+\layout Standard
+
+120
+\end_inset
+ |
+
+\begin_inset Text
-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}
+Indica que en el bloque 12, hay 120 bytes libres al final del mismo.
+\end_inset
+ |
+
+
\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
-.
-\layout LyX-Code
-bloque N-1 | bloque N | bloque N+1
-\layout LyX-Code
+\end_inset
+
+
+\begin_inset Float table
+placement H
+wide false
+collapsed true
+
+\layout Caption
+
+Ejemplo de registro en archivo de
+\emph on
+gaps
+\emph default
+ para un archivo sin bloques
+\layout Standard
+
+
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
+
+\layout Standard
+
+offset
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+freespace
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+\end_inset
+ |
+
+
+
+\begin_inset Text
+
+\layout Standard
+
+12
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+120
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+Indica que a partir del byte 12 del archivo de datos, hay 120 bytes libres.
+\end_inset
+ |
+
+
+
+\end_inset
+
+
+\end_inset
+
+
+\layout Standard
+
+
+\series bold
+\emph on
+Nota:
+\series default
+\emph default
+Como se puede observar, para distintas organizaciones el significado de
+ los registros en este archivo es diferente y se utilizará de distinta manera
+ en consecuencia.
+\layout Subsection
+
+Funciones principales
+\layout Standard
+
+Las declaraciones e implementación se pueden encontrar en
+\series bold
+\emph on
+fsc.h
+\series default
+\emph default
+ y
+\series bold
+\emph on
+fsc.c
+\series default
+\emph default
+ respectivamente:
+\layout List
+\labelwidthstring 00.00.0000
+
+
+\series bold
+Búsqueda:
+\series default
+ Ante la operación de alta de un registro en el archivo de datos, se realizará
+ la búsqueda de espacio libre donde este podrá ser insertado.
+ En el caso de organizaciones con bloques, se buscará en que
+\family typewriter
+nro_bloque
+\family default
+ se posee espacio suficiente para albergar el nuevo registro.
+ En el caso de organizacion sin bloque, se buscará un gap o espacio libre
+ en el archivo, obteniéndose en consecuencia, el
+\family typewriter
+offset
+\family default
+ hasta el mismo.
+\newline
+Ver:
+\family typewriter
+emufs_fsc_buscar_lugar()
+\layout List
+\labelwidthstring 00.00.0000
+
+
+\series bold
+Alta/Mod:
+\series default
+ Luego de una operación de baja o alta de un registro en el archivo de datos
+ (
+\series bold
+.dat
+\series default
+), incrementará o decrementará respectivamente el espacio libre en el archivo
+ de datos, y esto deberá ser registrado, agregando un nuevo registro en
+ el archivo de espacios libres (
+\series bold
+.fsc
+\series default
+) o bien modificandoló.
+\newline
+
+\newline
+En el caso de organizaciónes con bloques, se actualizará el valor del espacio
+ libre
+\family typewriter
+freespace
+\family default
+ en el bloque (ya sea incrementandoló o decrementandoló) o bien se insertará
+ un nuevo registro en caso de que se esté creando un nuevo bloque en el
+ archivo de datos (en este caso no será debido a un alta o baja de registro
+ como se mencionó al principio).
+\newline
+
+\newline
+Para el caso de organización sin bloques, en el caso de baja de un registro
+ de datos (
+\series bold
+.dat
+\series default
+) se insertará un nuevo registro en el
+\series bold
+.fsc
+\series default
+ dando cuenta de la aparición de un nuevo gap en el archivo de datos (
+\series bold
+.dat
+\series default
+), y en caso de estar este lindante con otro gap, se realizará el merge
+ pertinente.
+ (esto esta explicado más en profundidad en los casos particulares de organizaci
+ón fisica, registros variables sin bloques).
+ Para el caso de una alta en el archivo de datos (
+\series bold
+.dat
+\series default
+), el valor del gap donde se haya insertado se actualizará.
+
+\newline
+Ver:
+\family typewriter
+emufs_fsc_agregar(), emufs_fsc_agregar_gap(), emufs_fsc_actualizar(), emufs_fsc_
+actualizar_gap().
+\layout List
+\labelwidthstring 00.00.0000
+
+
+\series bold
+Baja
+\series default
+: Unicamente para el caso de una organización que presente gaps en el archivo,
+ se podrá dar a lugar la eliminación de un registro del archivo de espacios
+ libres (
+\series bold
+.fsc)
+\series default
+.
+ Esta situación tendrá efecto cuando se inserte un registro que entre perfecto
+ en un gap disponible, y por ende el gap desaparecerá.
+\newline
+Ver:
+\family typewriter
+emufs_fsc_borrar_gap()
+\layout Section
+
+
+\begin_inset LatexCommand \label{sec:did}
+
+\end_inset
+
+Archivo de id's recuperables
+\layout Standard
+
+El archivo de Id's liberado (
+\series bold
+.did
+\series default
+) llevará cuenta de aquellos Id's de registros (
+\family typewriter
+id_reg
+\family default
+) que ya no se encuentran siendo utilizados y fueron liberados por registros
+ eliminados previamente.
+ A través del mismo, se podrá realizar la reutilización de Id's ante la
+ alta de nuevos registros.
+\layout Standard
+
+A nivel físico, este archivo poseerá una secuencia de datos del tipo EMUFS_REG_I
+D, y el comportamiento del sistema de recuperación de Id's será el de una
+ pila.
+ Es decir, ante el requerimiento de un
+\family typewriter
+reg_id
+\family default
+ libre por una función del sistema como por ejemplo la alta de un nuevo
+ registro, el API del archivo (
+\series bold
+.did
+\series default
+), obtendrá el último dato del mismo (el
+\emph on
+Id
+\emph default
+ que fue liberado mas recientemente), y truncará el archivo eliminando el
+
+\emph on
+Id
+\emph default
+ recuperado de la tabla.
+ (LIFO, Last in First Out).
+\layout Subsection
+
+Organización Física
+\layout Standard
+
+Este archivo tiene registros de un solo campo,
+\family typewriter
+EMUFS_REG_ID
+\family default
+ el cual simboliza al id que fue liberado en un proceso de baja de registros.
+\layout Subsection
+
+Funciones principales
+\layout Standard
+
+Las declaraciones e implementación se pueden encontrar en
+\series bold
+\emph on
+did.h
+\series default
+\emph default
+ y
+\series bold
+\emph on
+did.c
+\series default
+\emph default
+ respectivamente
+\layout List
+\labelwidthstring 00.00.0000
+
+
+\series bold
+Alta:
+\series default
+Ante la eliminación de un registro del archivo de datos (
+\series bold
+.dat
+\series default
+) se procederá al agregado del correspondiente
+\family typewriter
+id_reg
+\family default
+ que fue liberado por dicha operación, al archivo
+\series bold
+.did
+\series default
+.
+\family typewriter
+
+\newline
+
+\family default
+Ver:
+\family typewriter
+emufs_did_agregar()
+\layout List
+\labelwidthstring 00.00.0000
+
+Baja Cuando el sistema desee grabar un nuevo registro en el archivo de datos,
+ este pedirá un
+\family typewriter
+id_reg
+\family default
+ disponible para el mismo.
+ El sistema de administración de Id's libres, obtendrá el último
+\emph on
+id
+\emph default
+ que se guardó en el archivo (o se eliminó del archivo de datos), y truncará
+ el archivo eliminandolo.
+\family typewriter
+
+\newline
+
+\family default
+Ver:
+\family typewriter
+emufs_did_get_last()
+\layout Chapter
+
+
+\begin_inset LatexCommand \label{cha:tipo1}
+
+\end_inset
+
+Archivo con bloques parametrizados y registros de longitud variable
+\layout Standard
+
+Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
+ intermedio entre el
+\begin_inset LatexCommand \ref{cha:tipo2}
+
+\end_inset
+
+ y el
+\begin_inset LatexCommand \ref{cha:tipo3}
+
+\end_inset
+
+ (cuenta tanto con bloques como con registros variables), hereda los inconvenien
+tes (y ventajas) de ambos, más los propios.
+ Al implementar este tipo de archivo se puso enfásis en la eficiencia mientras
+ esta no comprometa la mantenibilidad del código, es por esto que en algunas
+ circunstancias no se hace un uso óptimo del espacio.
+\layout Standard
+
+La implementación de este tipo de archivo puede ser encontrada en
+\family typewriter
+emufs/tipo1.c
+\family default
+ mientras que su interfaz pública está disponible en
+\family typewriter
+emufs/tipo1.h
+\family default
+.
+\layout Section
+
+Organización física
+\layout Standard
+
+El archivo está compuesto por la
+\emph on
+cabecera general
+\emph default
+ (ver página
+\begin_inset LatexCommand \pageref{sec:cabecera_gral}
+
+\end_inset
+
+).
+ El valor que toma en este tipo de archivo es 0 (o el valor simbólico
+\family typewriter
+T1
+\family default
+ del tipo
+\family typewriter
+EMUFS_Tipo
+\family default
+).
+ Luego le sigue una cabecera propia del archivo (un
+\family typewriter
+EMUFS_BLOCK_SIZE
+\family default
+, 4 bytes) que almacena el tamaño del bloque que usa el archivo.
+ De esta menera, al abrir un archivo de este tipo no se necesita tener ninguna
+ información sobre él.
+ A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
+ en la cabecera antes mencionada.
+\layout LyX-Code
+
+archivo
+\layout LyX-Code
+
++-----------+-----------+------------------------//-+
+\layout LyX-Code
+
+| tipo | tam bloque| Cero o más bloques ...
+
+\backslash
+
+\backslash
+ |
+\layout LyX-Code
+
++-----------+-----------+------------------------//-+
+\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 4 bytes:
+\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 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
+
+Ver:
+\family typewriter
+emufs_tipo1_borrar_registro()
+\layout Subsection
+
+Modificación de registros
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo1_modificar_registro()
+\layout Subsection
+
+Obtención de estadísticas
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo1_leer_estadisticas()
+\layout Subsection
+
+Compactación del archivo de datos
+\layout Standard
+
+Ver:
+\family typewriter
+ emufs_tipo1_compactar()
+\layout Section
+
+Detalles de implementación (funciones internas, ver si lo ponemos o no)
+\layout Chapter
+
+
+\begin_inset LatexCommand \label{cha:tipo2}
+
+\end_inset
+
+Archivo sin bloques y registros de longitud variable
+\layout Standard
+
+Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
+ de longitud variable sin realizar su agrupación en bloques, y como veremos
+ en la siguiente sección, tambien permitirá la administración de gaps que
+ queden en el archivo luego de operaciones de baja de registros.
+\layout Section
+
+Organización física
+\layout Standard
+
+Este tipo de archivo realizará el almacenamiento de registros de longitud
+ variable en disco, su borrado y modificación sin la utilización de bloques
+ de ningún tipo.
+ Su implementación se encuentra en los archivos fuente (
+\series bold
+tipo2.c
+\series default
+ y
+\series bold
+tipo2.h
+\series default
+).
+\layout Standard
+
+Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
+ simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
+ de archivo en cuestión.
+\layout Standard
+
+Para poder entender mejor la organización fisica de este tipo de archivo,
+ tomemos el caso hipotético en el que se encuentran grabados
+\series bold
+dos registros
+\series default
+ (comenzando desde registro 0) de
+\series bold
+30 bytes
+\series default
+, y
+\series bold
+25 bytes
+\series default
+, respectivamente.
+ Supongamos también que entre el registro 0 y 1 se encontraba un
+\series bold
+registro de 10 bytes
+\series default
+ que fue
+\series bold
+borrado
+\series default
+, generando un
+\series bold
+gap
+\series default
+
+\series bold
+o freespace
+\series default
+.
+ Si miramos al archivo de datos (.dat) en el disco nos encontraremos con
+ lo siguiente:
+\begin_inset Float figure
+placement H
+wide false
+collapsed true
+
+\layout Caption
+
+Organización física de los registros en disco
+\layout Standard
+
+
+\begin_inset Graphics
+ filename graphics/Example1.png
+ width 100text%
+
+\end_inset
+
+
+\end_inset
+
+
+\layout Standard
+
+Como se puede observar, a nivel físico cada registro grabado esta compuesto
+ por un Header cuyo tamaño total es de 8 bytes (
+\series bold
+EMUFS_REG_ID
+\series default
+ +
+\series bold
+EMUFS_REG_SIZE
+\series default
+), y posteriormente el registro (bloque de datos) en sí.
+ Luego se encuentra el espacio libre de 18 bytes dejado por el registro
+ de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
+ el segundo registro mencionado.dsds
+\layout Subsection
+
+Comportamiento Particular de los Archivos Auxiliares
+\layout Standard
+
+Como fue explicado al inicio de la documentación, la implementación de cualquier
+a de las tres organizaciones físicas de archivos presenta la necesidad de
+ poseer tres archivos auxiliares que actuarán como índice de direcciones
+ de registro (.
+\series bold
+idx
+\series default
+), administrador de espacio libre (
+\series bold
+.fsc
+\series default
+) y administrador de Id's liberados (
+\series bold
+.did
+\series default
+) respectivamente.
+\layout Standard
+
+No obstante, cada tipo de organización presentara sus particularidades respecto
+ de estos tres archivos, las cuales describiremos a continuación en caso
+ de haberla.
+\layout Subsubsection
+
+Archivo índice o de posiciones relativas (.idx)
+\layout Standard
+
+El archivo indice (
+\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
+\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
+\series bold
+.idx
+\series default
+:
+\begin_inset Float table
+placement H
+wide false
+collapsed true
+
+\layout Caption
+
+Organización física del archivo de índice o posiciones relativas.
+\layout Standard
+
+
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
+
+\layout Standard
+
+
+\emph on
+ID_REGISTRO
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+
+\emph on
+OFFSET
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+\end_inset
+ |
+
+
+
+\begin_inset Text
+
+\layout Standard
-/----------+------------+------------+-------------------+-----------/
-\layout LyX-Code
+\series bold
+0
+\end_inset
+ |
+
+\begin_inset Text
-\backslash
- | registro 1 | registro 2 | espacio libre ...
- |
-\backslash
- /----------+------------+------------+-------------------+-----------/
\layout Standard
-De forma tal que una vez obtenido el número de bloque se pueda recorrer
- secuencialmente 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}
+\series bold
+4
\end_inset
+ |
+
+\begin_inset Text
-), 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 Section
+El primer registro (reg0) comienza en el byte 4
+\end_inset
+ |
+
+
+
+\begin_inset Text
-Comportamiento (funciones de la interfáz)
-\layout Section
+\layout Standard
-Detalles de implementación (funciones internas, ver si lo ponemos o no)
-\layout Chapter
+1
+\end_inset
+ |
+
+\begin_inset Text
+\layout Standard
-\begin_inset LatexCommand \label{cha:tipo2}
+\series bold
+60
\end_inset
+ |
+
+\begin_inset Text
-Archivo sin bloques y registros de longitud variable
\layout Standard
-Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
- de longitud variable sin realizar su agrupación en bloques, y como veremos
- en la siguiente sección, tambien permitirá la administración de gaps que
- queden en el archivo luego de operaciones de baja de registros.
-\layout Section
+El segundo registro (reg1) comienza en el byte 60
+\end_inset
+ |
+
+
+
+\end_inset
+
+
+\end_inset
+
-Organización física
\layout Standard
-Este tipo de archivo realizará el almacenamiento de registros de longitud
- variable en disco, su borrado y modificación sin la utilización de bloques
- de ningún tipo.
- Su implementación se encuentra en los archivos fuente (
-\series bold
-tipo2.c
-\series default
- y
+
\series bold
-tipo2.h
+\emph on
+Observación:
\series default
-).
+\emph default
+ LOCATION indica donde comienza el header del registro buscado, y por consiguien
+te luego del header tendremos el registro en sí (los datos).
+\layout Subsubsection
+
+Achivo de Gaps / Espacios Libres (.fsc)
\layout Standard
-Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
- simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
- de archivo en cuestión.
+El archivo de espacios libres o gaps (.fsc), tiene como función la administracion
+ 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
+ un archivo, explicado luego.
\layout Standard
-Para poder entender mejor la organización fisica de este tipo de archivo,
- tomemos el caso hipotético en el que se encuentran grabados
-\series bold
-dos registros
-\series default
- (comenzando desde registro 0) de
-\series bold
-30 bytes
-\series default
-, y
-\series bold
-25 bytes
-\series default
-, respectivamente.
- Supongamos también que entre el registro 0 y 1 se encontraba un
-\series bold
-registro de 10 bytes
-\series default
- que fue
-\series bold
-borrado
-\series default
-, generando un
-\series bold
-gap
-\series default
-
+Así pues, si tomamos el ejemplo descripto al inicio del documento, tendremos
+ las siguientes entradas en el archivo índice
\series bold
-o freespace
+.fsc
\series default
-.
- Si miramos al archivo de datos (.dat) en el disco nos encontraremos con
- lo siguiente:
-\begin_inset Float figure
+:
+\begin_inset Float table
placement H
wide false
collapsed true
\layout Caption
-NOMBRE, ARREGLAME!!!!
+Organización física del archivo de
+\emph on
+gaps
+\emph default
+o control de espacio libre.
\layout Standard
-\begin_inset Graphics
- filename graphics/Example1.png
- width 100text%
+\begin_inset Tabular
+
+
+
+
+
+
+
+\begin_inset Text
+
+\layout Standard
+
+\emph on
+OFFSET
\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+\emph on
+FREESPACE
\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+\end_inset
+ |
+
+
+
+\begin_inset Text
\layout Standard
-Como se puede observar, a nivel físico cada registro grabado esta compuesto
- por un Header cuyo tamaño total es de 8 bytes (
-\family typewriter
+
\series bold
-EMUFS_REG_ID
-\series default
- +
+42
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+
\series bold
-EMUFS_REG_SIZE
-\family default
+18
+\end_inset
+ |
+
+\begin_inset Text
+
+\layout Standard
+
+18 bytes libres a partir del byte 42 del .dat
+\end_inset
+ |
+
+
+
+\end_inset
+
+
+\end_inset
+
+
+\layout Standard
+
+
+\series bold
+\emph on
+Nota:
\series default
-), y posteriormente el registro (bloque de datos) en sí.
- Luego se encuentra el espacio libre de 18 bytes dejado por el registro
- de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
- el segundo registro mencionado.dsds
+\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)
+\layout Subsubsection*
+
+GAP Merging
+\layout Standard
+
+Si bien la utilización concreta de los GAPS será explicada posteriormente
+ en la ALTA y BAJA de registros, debemos remarcar la funcionalidad de MERGING
+ que posee nuestro sistema FSC.
+\layout Standard
+
+Ante la eliminación de un registro del archivo de datos, se generara por
+ consiguiente un gap o espacio libre en alguna posición del archivo.
+ Ese gap deberá ser registrado en el archivo de gaps (.fsc).
+ Ahora bien, nuestro sistema de gaps, contemplará como es debido, la posibilidad
+ de que se haya eliminado un registro que posee un GAP por delante, un GAP
+ por detrás, o bien un GAP por delante y por detrás del mismo.
+\layout Standard
+
+Nuestro sistema actuará en consecuencia, realizando un merge de los espacios
+ libres, y unificándolos en una UNICA entrada en el archivo .fsc, que contendrá
+ como dato de freespace, la suma correspondiente de los espacios libres
+ antes mencionados.
+\layout Subsubsection
+
+Archivo de ID's liberados (.did)
+\layout Standard
+
+El archivo de ID's liberados no presenta ningún aspecto particular en este
+ tipo de organización.
+ Remitirse al capítulo correspondiente a los archivos auxiliares para consultar
+ su estructura y funcionamiento.
\layout Section
-Comportamiento (funciones de la interfaz)
+Funciones Principales
\layout Standard
Dentro de
@@ -906,6 +2429,11 @@ RegSize
).
Contando así con el tamaño del registro, procedemos a leer el mismo (los
datos), dando por finalizada la lectura.
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo2_leer_registro()
\layout Subsection
Altas de registros
@@ -932,16 +2460,12 @@ As
\layout Enumerate
Calculamos el espacio que necesitaremos para el registro: sizeof(
-\family typewriter
\series bold
EMUFS_REG_ID
-\family default
\series default
) + sizeof(
-\family typewriter
\series bold
EMUFS_REG_SIZE
-\family default
\series default
) + sizeof(registro).
\layout Enumerate
@@ -976,6 +2500,11 @@ Actualizamos la entrada correspondiente al registro ingresado (determinada
.idx
\series default
), indicando su offset donde podrá ser accedido luego.
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo2_agregar_registro()
\layout Subsection
Bajas de registros
@@ -1056,6 +2585,11 @@ Se marca en el archivo
) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
al registro recién eliminado (se le cambia el valor al n-esimo registro,
donde N = IDReg del reg eliminado).
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo2_borrar_registro()
\layout Subsection
Modificación de registros
@@ -1084,9 +2618,34 @@ NOTA:
Como fue indicado, dada la naturaleza de PILA del subsistema de administración
de ID liberados, es asegurado que la nueva inserción del registro modificado
se realizará con el mismo RegID.
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo2_modificar_registro()
\layout Subsection
Obtención de estadísticas
+\layout Standard
+
+Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
+ cantidad de bloques, cantidad de registros, espacio libre total, espacio
+ libre promedio, espacio libre máximo y mínimo, etc.
+\layout Standard
+
+Esta información es el resultado de ciertos cálculos realizados tanto en
+ el archivo de datos como en los archivos índice.
+\layout Standard
+
+Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
+ del archivo de datos, espacio libre total, cantidad de registros, cantidad
+ de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
+ libres, etc.
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo2_leer_estadisticas()
\layout Subsection
Compactación del archivo de datos
@@ -1118,7 +2677,7 @@ collapsed true
\layout Caption
-NOMBRE, ARREGLAMEE!!!
+Archivo con gaps entre registros previo a compactación
\layout Standard
@@ -1264,7 +2823,7 @@ collapsed true
\layout Caption
-NOMBRE, ARREGLAME!!!!
+Archivo con gaps en disco luego del primer bucle de compactación
\layout Standard
@@ -1317,6 +2876,94 @@ Mustmove_bytes = Datsize - Source
Damos por terminada así, la explicación del algoritmo de compresión el cual
para el caso del tipo 2, es realmente bastante sencillo.
+\layout Standard
+
+Ver:
+\family typewriter
+ emufs_tipo2_compactar()
+\layout Section
+
+Consideraciones y Políticas de Diseño
+\layout Standard
+
+Se han tomado ciertas consideraciones para algunos casos particulares que
+ se pueden presentar durante el uso/ejecución de la aplicación, así como
+ tambien politicas respecto del diseño e implementación del sistema:
+\layout Itemize
+
+En la organización física tipo 2 para los registros que se graban en disco
+ hemos decidido utilizar como encabezado de cada uno de ellos, los datos
+ [ID_REG][REG_SIZE], los cuales fueron detallados previamente.
+ Si bien se podría haber descartado el grabado del ID del registro en el
+ archivo de datos y puede parecer redundante, dado que poseemos el archivo
+ índice con el offset directo, el mismo se lo graba por distintos motivos:
+\newline
+
+\newline
+A) En caso de la corrupción del archivo índice (.idx), podremos gracias a
+ que poseemos en el archivo de datos, el ID de cada registro, recrear dicho
+ índice, ayudándonos del archivo de espacios libres (
+\series bold
+.fsc
+\series default
+), para poder saltear los espacios libres y e ir recorriendo secuencialmente
+ los registros, reconstruyendo así el índice en cuestión.
+ (esta función de reconstrucción no pudo ser implementada para esta entrega,
+ pero es una posibilidad real).
+\newline
+
+\newline
+B) Luego de un proceso de recompactación, los espacios libres que pudieron
+ haber existido en el archivo de datos (
+\series bold
+.dat
+\series default
+), son eliminados y los registros han cambiado de posición.
+ Por ello, recorriendo secuencialmente por única vez el archivo de datos,
+ se procede a la actualización / reconstrucción del índice de direcciones
+ u offsets (.
+\series bold
+idx
+\series default
+)
+\layout Itemize
+
+Si se desea insertar un registro y no se puede hayar un gap o espacio libre
+ donde quepa, se los inserta al final del archivo.
+\layout Itemize
+
+Ante una operación de baja de un registro, el mismo no es físicamente borrado
+ del archivo de datos (
+\series bold
+.dat
+\series default
+), simplemente los bytes que ocupa son llenados con hexa (00).
+ Paralelamente, se procede a actualiza el archivo índice, insertando como
+ valor de OFFSET para el registro eliminado, el valor ¨-1¨, indicando así
+ la inexistencia del registro para el futuro, y por otro lado se genera
+ la entrada de espacio libre en el archivo de gaps (
+\series bold
+.fsc
+\series default
+).
+\layout Itemize
+
+La reutilización de ID's liberados por previas operaciones de baja de registros,
+ se ve implementada por el archivo de ID liberados (.did), y su comportamiento
+ es el de una pila por lo que el último ID liberado, sera el próximo a ser
+ reutilizado (LIFO).
+\layout Itemize
+
+Como fue explicado en la implementación del archivo índice, existe una correspon
+dencia 1 a 1 entre los registros allí presentes (en el .idx) y los ID's de
+ los registros, por lo cual el registro N-ésimo del archivo índice, será
+ el correspondiente al registro de datos cuyo ID es igual a N.
+\layout Itemize
+
+El proceso de compactación de archivos, realiza los movimientos de información
+ requeridos para dicho propósito de a chunks de 25 bytes por vez.
+ Este valor es fijo, pero se lo podría hacer parametrizable mediante la
+ GUI en próximas entregas.
\layout Chapter
@@ -1370,9 +3017,6 @@ El comportamiento de este archivo, es com
\layout Section
Funciones Principales
-\layout Subsection
-
-EMUFS Tipo 3
\layout Standard
Dento de
@@ -1388,7 +3032,7 @@ tipo3.c
\layout Standard
A continuación se comentará la descripción de algunas acciones importantes.
-\layout Subsubsection
+\layout Subsection
Leer Registro
\layout Standard
@@ -1410,7 +3054,7 @@ ID
Ver:
\family typewriter
emufs_tipo3_leer_registro()
-\layout Subsubsection
+\layout Subsection
Grabar Registro
\layout Standard
@@ -1426,7 +3070,7 @@ Luego de grabar un registro, actualiza los archivos de
Ver:
\family typewriter
emufs_tipo3_grabar_registro()
-\layout Subsubsection
+\layout Subsection
Borrar Registro
\layout Standard
@@ -1445,7 +3089,12 @@ Cabe destacar que para dar de baja un registro no hace falta borrarlo del
presente en el archivo de datos.
Esto es una consecuencia del ajuste al borrar un registro, pudiendo no
ser así, si no se realizara el mismo.
-\layout Subsubsection
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo3_borrar_registro()
+\layout Subsection
Leer Estadísticas
\layout Standard
@@ -1468,7 +3117,7 @@ Completa una estructura del tipo EMUFS_Estadisticas con las estad
Ver:
\family typewriter
emufs_tipo3_leer_estadisticas()
-\layout Subsubsection
+\layout Subsection
Compactar el Archivo
\layout Standard