\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
\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
\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 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
+
+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
\layout Standard
-\series bold
-\emph on
-Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
- Tipo 1 y 3:
-\newline
+\begin_inset Float table
+placement H
+wide false
+collapsed true
-\series default
-\emph default
+\layout Caption
+
+Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
+ Tipo 1 y 3
+\layout Standard
-\newline
\begin_inset Tabular
<lyxtabular version="3" rows="2" columns="3">
\end_inset
-\layout Standard
+\end_inset
-\SpecialChar ~
+
+\begin_inset Float table
+placement H
+wide false
+collapsed true
-\newline
+\layout Caption
-\series bold
-\emph on
Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
- Tipo 2:
-\series default
-\emph default
-
-\newline
-
-\newline
+ Tipo 2
+\layout Standard
+
\begin_inset Tabular
<lyxtabular version="3" rows="2" columns="3">
\end_inset
+\end_inset
+
+
\layout Standard
\series bold
\emph on
-\SpecialChar ~
-
-\newline
Nota:
\series default
\emph default
.dat
\series default
).
-
\newline
-\newline
-NOTA: Cabe aclarar que por si bien el indice se encuentra ordenado por
+\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 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).
-\newline
-
\layout Standard
\series bold
\emph on
-Ejemplo de registro en archivo de espacio libre en bloque (.fsc), para un
- archivo de organizacion Tipo 1 y 3:
-\newline
-\series default
-\emph default
+\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
-\newline
\begin_inset Tabular
<lyxtabular version="3" rows="2" columns="3">
\end_inset
-\layout Standard
+\end_inset
-\SpecialChar ~
+
+\begin_inset Float table
+placement H
+wide false
+collapsed true
-\newline
+\layout Caption
-\series bold
+Ejemplo de registro en archivo de
\emph on
-Ejemplo de registro en archivo de gaps o espacios libres en archivo (.fsc),
- para un archivo de organizacion Tipo 2:
-\series default
+gaps
\emph default
-
-\newline
-
-\newline
+ para un archivo sin bloques
+\layout Standard
+
\begin_inset Tabular
<lyxtabular version="3" rows="2" columns="3">
\end_inset
+\end_inset
+
+
\layout Standard
\series bold
\emph on
-\SpecialChar ~
-
-\newline
Nota:
\series default
\emph default
en consecuencia.
\layout Subsection
-Comportamiento
+Funciones principales
\layout Standard
Las declaraciones e implementación se pueden encontrar en
el cual simboliza al id que fue liberado en un proceso de baja de registros.
\layout Subsection
-Comportamiento
+Funciones principales
\layout Standard
Las declaraciones e implementación se pueden encontrar en
\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
+\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
+\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
-\family default
-Ver:
-\family typewriter
-emufs_did_get_last()
-\layout Chapter
++-------------------+-------------------+-------------------+-
+\backslash
+\backslash
+-+
+\layout Section
-\begin_inset LatexCommand \label{cha:tipo1}
+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
-Archivo con bloques parametrizados y registros de longitud variable
+).
+\layout Subsection
+
+Lectura de registros
\layout Standard
-Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
- intermedio entre el
-\begin_inset LatexCommand \ref{cha:tipo2}
+Para leer un registro se hace uso del archivo de índice (ver página
+\begin_inset LatexCommand \pageref{sec:idx}
\end_inset
- y el
-\begin_inset LatexCommand \ref{cha:tipo3}
+), 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
- (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.
+), 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
-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
+Ver:
\family typewriter
-emufs/tipo1.h
-\family default
-.
-\layout Section
+emufs_tipo1_leer_registro()
+\layout Subsection
-Organización física
+Altas de registros
\layout Standard
-El archivo está compuesto por la
-\emph on
-cabecera general
-\emph default
- (ver página
-\begin_inset LatexCommand \pageref{sec:cabecera_gral}
+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
-).
- 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
+) y de no haber ninguno, buscando el mayor identificador presente en el
+ archivo de índice (pág.
+
+\begin_inset LatexCommand \ref{sec:idx}
-+-----------+-----------+------------------------//-+
-\layout LyX-Code
+\end_inset
-| tipo | tam bloque| Cero o más bloques ...
+) 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.
-\backslash
+\begin_inset LatexCommand \ref{sec:fsc}
-\backslash
- |
-\layout LyX-Code
+\end_inset
-+-----------+-----------+------------------------//-+
-\layout LyX-Code
+) 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
-/- 4 bytes -/- 4 bytes -/
-\layout Subsection
+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
-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}
+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
-), 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
+.
+\end_inset
+
+ y graba bloque a bloque cada
\emph on
-alinear los registros a izquierda
+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
.
-\layout LyX-Code
+ Por cada bloque utilizado se actualiza el archivo de control de espacio
+ libre.
+\layout Standard
-bloque N-1 | bloque N | bloque N+1
-\layout LyX-Code
+Ver:
+\family typewriter
+emufs_tipo1_agregar_registro()
+\layout Subsection
-/----------+------------+------------+-------------------+-----------/
-\layout LyX-Code
+Bajas de registros
+\layout Standard
+Ver:
+\family typewriter
+emufs_tipo1_borrar_registro()
+\layout Subsection
-\backslash
- | registro 1 | registro 2 | espacio libre ...
- |
-\backslash
- /----------+------------+------------+-------------------+-----------/
+Modificación de registros
\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}
-
-\end_inset
+Ver:
+\family typewriter
+emufs_tipo1_modificar_registro()
+\layout Subsection
-), de forma tal que no sea necesario recorrer secuencialmente en busca de
- espacio libre al hacer una inserción.
+Obtención de estadísticas
\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
+Ver:
+\family typewriter
+emufs_tipo1_leer_estadisticas()
+\layout Subsection
+
+Compactación del archivo de datos
+\layout Standard
-Comportamiento (funciones de la interfáz)
+Ver:
+\family typewriter
+ emufs_tipo1_compactar()
\layout Section
Detalles de implementación (funciones internas, ver si lo ponemos o no)
\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
-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
- :
-\newline
+:
+\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
\end_inset
+\end_inset
+
+
\layout Standard
\series bold
\emph on
-\SpecialChar ~
-
-\newline
Observación:
\series default
\emph default
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).
- 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
\series bold
.fsc
\series default
- :
-\newline
+:
+\begin_inset Float table
+placement H
+wide false
+collapsed true
+
+\layout Caption
+
+Organización física del archivo de
+\emph on
+gaps
+\emph default
+o control de espacio libre.
+\layout Standard
-\newline
\begin_inset Tabular
<lyxtabular version="3" rows="2" columns="3">
\end_inset
+\end_inset
+
+
\layout Standard
\series bold
\emph on
-\SpecialChar ~
-
-\newline
Nota:
\series default
\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
su estructura y funcionamiento.
\layout Section
-Comportamiento (funciones de la interfaz)
+Funciones Principales
\layout Standard
Dentro de
para el caso del tipo 2, es realmente bastante sencillo.
\layout Standard
-Ver:
+Ver:
\family typewriter
-void emufs_tipo2_compactar()
+ emufs_tipo2_compactar()
\layout Section
Consideraciones y Políticas de Diseño
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
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
-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
-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 Subsection
-
-EMUFS Tipo 3
\layout Standard
Dento de
\layout Standard
A continuación se comentará la descripción de algunas acciones importantes.
-\layout Subsubsection
+\layout Subsection
Leer Registro
\layout Standard
Ver:
\family typewriter
emufs_tipo3_leer_registro()
-\layout Subsubsection
+\layout Subsection
Grabar Registro
\layout Standard
Ver:
\family typewriter
emufs_tipo3_grabar_registro()
-\layout Subsubsection
+\layout Subsection
Borrar Registro
\layout Standard
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
Ver:
\family typewriter
emufs_tipo3_leer_estadisticas()
-\layout Subsubsection
+\layout Subsection
Compactar el Archivo
\layout Standard
\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