1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
14 \use_numerical_citations 0
15 \paperorientation portrait
18 \paragraph_separation indent
20 \quotes_language english
24 \paperpagestyle default
31 Organización de Archivos con Bloques Parametrizados y Registros de Tamaño
38 Las distintas organizaciones de archivos buscan aprovechar al máximo el
42 En este caso veremos que sucede luego de agregar y borrar una gran cantidad
43 de registros del archivo, lo que provoca como consecuencia directa la fragmenta
44 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
45 produce un desperdicio de espacio.
51 Esta organización guarda los registros pertenecientes al archivo en bloques
52 de tamaño parametrizado, de modo que intentará guardar la mayor cantidad
53 de registros que quepan en un bloque.
57 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
64 Archivo de Bloques y Registros (.IDX)
67 Con la ayuda de un archivo de bloques y registros (de extensión .idx), podremos
68 ubicar cualquier registro existente dentro del archivo.
72 El archivo de índice contiene una estructura que contiene el id de un registro
73 y el número de bloque al que pertenece.
74 Este archivo esta ordenado por id, de modo que incrementa su tamaño cada
75 vez que se grabe en el archivo de datos un nuevo registro, excepto que
76 un registro haya sido borrado con anterioridad lo cual produce que al guardar
77 un nuevo registro se actualice y no crezca.
80 Si un registro es borrado del archivo de datos, debe actualizarse el índice,
81 esto se logra colocando un flag que indique que el id no pertenece a ningún
82 bloque, hemos adoptado poner -1 en el campo location de la estructura EMUFS_IDX.
85 Es necesario que este archivo esté ordenado por id de registro, ya que esto
86 permitirá el acceso directo para la búsqueda de un registro en el archivo
90 Archivo de Bloques y Espacio Libre (.FSC)
93 El archivo de de espacios libres permite decidir a la hora de guardar un
94 registro, donde será guardado.
98 La estructura de este archivo está formada por un número que indica el bloque
99 y otro que indica el espacio libre en él.
102 De esta manera al querer guardar un registro este archivo informará donde
103 cabe el mismo, previa invocación al la función EMUFS_BLOCK_ID emufs_fsc_buscar_
104 lugar(EMUFS *, EMUFS_FREE, EMUFS_FREE*) perteneciente a fsc.h, la cual devuelve
105 el número de bloque donde entra el registro o -1 si no hay un bloque con
106 lugar suficiente, y toma como parámetros una estructura EMUFS, y dos EMUFS_FREE
107 donde el segndo parámetro es el tamaño buscado, y el tercero devuelve el
111 De la misma manera, al borrar un registro este archivo debe ser actualizado
112 colocando el nuevo espacio libre en el bloque.
113 \layout Subsubsection
115 Archivo de Id`s Borrados (.DID)
118 Este archivo funciona como una pila de id`s borrados, es decir, cuando se
119 borra un registro el id se almacena en este archivo y será recuperado cuando
120 se desee grabar un registro nuevo, de esta manera se aprovechan todos los
121 id`s sin necesidad de crear uno nuevo cada vez que se borra y graba un
125 Funciones Principales
139 se encuentran las cabeceras y la implementación de las funciones principales
140 respectivamente, las cuales dan funcionalidad a esta organización.
143 A continuación se comentará el funcionamiento algunas de las mas importantes.
144 \layout Subsubsection
146 void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE*
150 Devuelve un puntero con la memoria reservada que contiene al registro solicitado
151 por el segundo parámetro (
159 el tamaño del registro leido, que en este caso no es necesario pues es constante
160 y es conocicdo de antemano.
163 Para realizar esta acción, busca en el archivo
167 el bloque al cual pertenece el registro.
168 \layout Subsubsection
170 void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, int*
174 Devuelve un puntero con la memoria reservada que contiene el bloque solicitado
175 por el segundo parámetro (
183 Como la numeración de los bloques es
187 el acceso al archivo para levantar un bloque es directo, es decir, se posiciona
188 directamente en en número de bloque multiplicado por el tamaño del mismo,
189 salteando antes el encabezado del archivo.
190 \layout Subsubsection
192 EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE
196 Graba un registro en un bloque donde haya espacio suficiente, y si no crea
197 un nuevo bloque y lo agrega al final del archivo.
200 El registro a grabar es apuntado por el segundo parámetro (
204 ) y el tamaño viene indicado en el tercero (
211 Luego de realizar la grabación, actualiza los archivos índice con los valores
213 \layout Subsubsection
215 int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID)
218 Borra el registro indicado por el segundo parámetro (
222 ) del archivo de datos, y actualiza los archivos de índice para mantener
223 la coherencia en las próximas modificaciones.
226 Al borrar un registro, justifica los demás registros del bloque hacia la
228 \layout Subsubsection
230 EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu)
233 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
234 del archivo de datos, espacio libre total, cantidad de registros, cantidad
235 de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
237 \layout Subsubsection
239 void emufs_tipo3_compactar(EMUFS *emu)
242 Esta función intenta reorganizar el archivo de manera que el espacio libre
243 sea lo menor posible, recordando siempre que un registro no puede ser almacenad
244 o en mas de un bloque excepto que el tamaño del registro sea mayor que el
248 Para realizar esto, se aprovecha la funcionalidad de
250 emufs_tipo3_grabar_registro()
252 ya que esta tiene la capacidad de determinar una posición mas eficiente
253 en el archivo para un registro.
254 Por esto lo que se hace es levantar uno por uno los registros y volverlos
255 a grabar, de ese modo todos los
259 que pudieron haberse formado por la eliminación de registros serán cubiertos
272 Consideraciones y Políticas de Diseño
275 Se han tomado ciertas consideraciones para algunos casos particulares que
276 se pueden presentar durante el uso/ejecución de la aplicación.
279 Cada registro tiene un encabezado que indica el
286 Si el tamaño del registro es mayor que el tamaño del bloque el registro
287 se particionará en la cantidad de bloques que sea necesario, pero siempre
288 se guardará desde el comienzo de un bloque, esto quiere decir que nunca
289 se podrá encontrar un comienzo de registro en algún lugar de un bloque
290 que no sea el comienzo del mismo.