]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - doc/informe.lyx
Minor change pero sino me olvido.
[z.facultad/75.06/emufs.git] / doc / informe.lyx
1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
2 \lyxformat 221
3 \textclass book
4 \language spanish
5 \inputencoding auto
6 \fontscheme palatino
7 \graphics default
8 \paperfontsize default
9 \spacing single 
10 \papersize a4paper
11 \paperpackage widemarginsa4
12 \use_geometry 0
13 \use_amsmath 0
14 \use_natbib 0
15 \use_numerical_citations 0
16 \paperorientation portrait
17 \secnumdepth 3
18 \tocdepth 3
19 \paragraph_separation indent
20 \defskip medskip
21 \quotes_language english
22 \quotes_times 2
23 \papercolumns 1
24 \papersides 1
25 \paperpagestyle default
26
27 \layout Title
28
29 E
30 \begin_inset Formula $\mu$
31 \end_inset 
32
33 FS
34 \layout Author
35
36 Nicolás Dimov
37 \newline 
38 Alan Kennedy
39 \newline 
40 Leandro Lucarella
41 \newline 
42 Ricardo Markiewicz
43 \layout Chapter
44
45 Introducción
46 \layout Chapter
47
48 Estructura común
49 \layout Section
50
51 Tipos
52 \layout Subsection
53
54 EMUFS
55 \layout Standard
56
57
58 \family typewriter 
59 EMUFS
60 \family default 
61 \emph on 
62  
63 \emph default 
64 es la estuctura principal que encapsula todas las funciones para el manejo
65  de un archivo de datos.
66 \layout Standard
67
68 Esta estructura consta de:
69 \layout Enumerate
70
71
72 \family typewriter 
73 EMUFS_Tipo
74 \family default 
75  que es un tipo enumerado que indica cual es la organización.
76 \layout Enumerate
77
78
79 \family typewriter 
80 EMUFS_BLOCK_SIZE
81 \family default 
82  indica el tamaño del bloque para los tipos 1 y 3.
83 \layout Enumerate
84
85
86 \family typewriter 
87 EMUFS_REG_SIZE
88 \family default 
89  indica el tamaño del registro, para el tipo 3 que posee tamaño constante.
90 \layout Enumerate
91
92
93 \family typewriter 
94 void **leer_bloque() 
95 \family default 
96 puntero a la función para leer un bloque.
97 \layout Enumerate
98
99
100 \family typewriter 
101 void *leer_bloque_raw()
102 \family default 
103  puntero a la función para leer un bloque, el anterior y el siguiente.
104 \layout Enumerate
105
106
107 \family typewriter 
108 void **leer_registro()
109 \family default 
110  puntero a la función para leer un registro.
111 \layout Enumerate
112
113
114 \family typewriter 
115 void **leer_registro_raw()
116 \family default 
117  puntero a la función para leer un registro con su encabezado.
118 \layout Enumerate
119
120
121 \family typewriter 
122 EMUFS_REG_ID *grabar_registro()
123 \family default 
124  puntero a la función para grabar un registro.
125 \layout Enumerate
126
127
128 \family typewriter 
129 EMUFS_REG_ID *modificar_registro() 
130 \family default 
131 puntero a la función para modificar un registro.
132 \layout Enumerate
133
134
135 \family typewriter 
136 int *borrar_registro()
137 \family default 
138  puntero a la función para borrar un registro.
139 \layout Enumerate
140
141
142 \family typewriter 
143 EMUFS_Estadisticas *leer_estadisticas()
144 \family default 
145  puntero a la función para cargar una estructura con las estadísticas.
146 \layout Enumerate
147
148
149 \family typewriter 
150 void *compactar()
151 \family default 
152  puntero a la función para compactar un archivo.
153 \layout Enumerate
154
155
156 \family typewriter 
157 char *nombre
158 \family default 
159  almacena el nombre del archivo sin extensión.
160 \layout Standard
161
162 Esta estructura define los valores de sus punteros según el tipo de organización
163  que se desee manejar.
164 \layout Standard
165
166 Por ejemplo si se desea crear un archivo de nombre 
167 \begin_inset Quotes eld
168 \end_inset 
169
170 facturas
171 \begin_inset Quotes erd
172 \end_inset 
173
174  organizado de la forma 3, se invoca a la función 
175 \family typewriter 
176 EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo,EMUFS_BLOCK_SIZE
177  tam_bloque, EMUFS_REG_SIZE tam_reg), 
178 \family default 
179 donde
180 \family typewriter 
181  filename 
182 \family default 
183 es el nombre que tendrán los archivos de datos e índice, 
184 \family typewriter 
185 tipo
186 \family default 
187  es el tipo de organización - bloques parametrizados y registros constantes
188  en este caso-, 
189 \family typewriter 
190 tam_bloque
191 \family default 
192  es el tamaño del bloque, y 
193 \family typewriter 
194 tam_reg
195 \family default 
196  es el tamaño del registro.
197 \layout Standard
198
199 Para las diferentes organizaciones puede ser que alguno de estos 2 últimos
200  valores no tengan sentido almacenarlas y tomaran un valor por defecto igual
201  a cero.
202 \layout Standard
203
204 Según el tipo de organización, se inicializan los punteros a las funciones.
205  Para el ejemplo 
206 \family typewriter 
207 leer_bloque
208 \family default 
209  se igualará a 
210 \family typewriter 
211 emufs_tipo3_leer_bloque()
212 \family default 
213 , y lo mismo sucede con los demás.
214 \layout Subsection
215
216 EMUFS_Tipo
217 \layout Subsection
218
219 EMUFS_Estadisticas
220 \layout Subsection
221
222 EMUFS_BLOCK_ID
223 \layout Standard
224
225 etc
226 \layout Section
227
228
229 \begin_inset LatexCommand \label{sec:cabecera_gral}
230
231 \end_inset 
232
233 Organización física general de un archivo E
234 \begin_inset Formula $\mu$
235 \end_inset 
236
237 FS
238 \layout Standard
239
240 Todo archivo E
241 \begin_inset Formula $\mu$
242 \end_inset 
243
244 FS está compuesto por 4 archivos a nivel de sistema operativo: archivo de
245  datos (con 3 formatos posibles, ver páginas 
246 \begin_inset LatexCommand \pageref{cha:tipo1}
247
248 \end_inset 
249
250
251 \begin_inset LatexCommand \pageref{cha:tipo2}
252
253 \end_inset 
254
255  y 
256 \begin_inset LatexCommand \pageref{cha:tipo3}
257
258 \end_inset 
259
260 ), archivo de índice (ver página 
261 \begin_inset LatexCommand \pageref{sec:idx}
262
263 \end_inset 
264
265 ), archivo de control de espacio libre (ver página 
266 \begin_inset LatexCommand \pageref{sec:fsc}
267
268 \end_inset 
269
270 ) y archivo de índices recuperables (ver página 
271 \begin_inset LatexCommand \pageref{sec:did}
272
273 \end_inset 
274
275 ).
276 \layout Standard
277
278 El archivo de datos está compuesto por:
279 \layout Itemize
280
281 Una 
282 \emph on 
283 cabecera general
284 \emph default 
285  compuesta por un 
286 \family typewriter 
287 int
288 \family default 
289  (4 bytes en plataformas Linux de 32 bits) que representa el tipo de archivo.
290 \layout Itemize
291
292 Datos dependientes del tipo de archivo.
293 \layout Standard
294
295 La 
296 \emph on 
297 cabecera general
298 \emph default 
299  es utilizada para poder detectar el formato de un archivo al abrirlo.
300  Los datos dependientes del tipo de archivo serán explicados en sus secciones
301  correspondientes.
302 \layout LyX-Code
303
304 archivo
305 \layout LyX-Code
306
307 +-----------+--------------------------------------------//-+
308 \layout LyX-Code
309
310 |    tipo   | Datos dependientes del tipo de archivo ...
311  
312 \backslash 
313
314 \backslash 
315  |
316 \layout LyX-Code
317
318 +-----------+--------------------------------------------//-+
319 \layout LyX-Code
320
321 /- 4 bytes -/
322 \layout Chapter
323
324 Archivos Auxiliares
325 \layout Standard
326
327 Acompañando al archivo de datos (
328 \series bold 
329 .dat
330 \series default 
331 ) el cual es responsable de la contención de los registros, tendremos tres
332  archivos auxiliares (
333 \series bold 
334 .idx
335 \series default 
336
337 \series bold 
338 .fsc
339 \series default 
340  y 
341 \series bold 
342 .did
343 \series default 
344 ) cuya funcionalidad y propósito pasamos a describir a continuación, sin
345  antes remarcar que los tres archivos poseen una sola implementación para
346  las distintas formas de organización física que hemos implementado (tres
347  para ser mas exactos).
348 \layout Standard
349
350 Entre las ventajas de poseer la misma implementación se encuentra el tener
351  un API común entre los tres tipos para el manejo de la localización de
352  sus registros, administración de espacio libre e Id's liberados, sin necesidad
353  de realizar n-implementaciones para un mismo objetivo final.
354 \layout Standard
355
356 Además, la obtención de ciertos datos estadísticos como espacio libre, o
357  cantidad de registros, se realiza a través de la misma interfaz, y también
358  se ha facilitado en cierto grado la re-organización física de un archivo
359  (pasar de un tipo a otro), dado el uso de estos tres archivos auxiliares
360  en común para funciones tan predominantes como índexación, administración
361  de espacio libre y recuperación de Id's.
362 \layout Section
363
364
365 \begin_inset LatexCommand \label{sec:idx}
366
367 \end_inset 
368
369 Archivo índice
370 \layout Standard
371
372 El archivo índice (.idx), permite la localización de los registros en el
373  .DAT de forma directa, mediante la obtención de su offset respecto del inicio
374  del .dat, o nro bloque (segun el tipo de organización física) en donde se
375  encuentra un registro dado, indicado por su 
376 \emph on 
377 id_reg.
378 \layout Standard
379
380 Los registros de este archivo se encuentran representados una estructura
381  que indica un número de registro y el bloque u offset en donde se encuentra
382  el mísmo.
383 \layout Standard
384
385 Es necesario que este archivo esté ordenado por 
386 \emph on 
387 id_reg
388 \emph default 
389 , ya que esto permitirá el acceso directo al mismo, para la rápida obtención
390  del nro de bloque u offset y posterior búsqueda de un registro en el archivo
391  de datos.
392 \layout Subsection
393
394 Organización física
395 \layout Standard
396
397 Los registros de este archivo se encuentran representados a nivel codigo
398  por el siguiente tipo de dato interno (
399 \family typewriter 
400 EMUFS_IDX
401 \family default 
402 ):
403 \layout LyX-Code
404
405 typedef unsigned long EMUFS_REG_ID;
406 \layout LyX-Code
407
408 typedef unsigned long EMUFS_OFFSET;
409 \layout LyX-Code
410
411 typedef struct emufs_idx_t { 
412 \layout LyX-Code
413
414   EMUFS_REG_ID id_reg;
415 \layout LyX-Code
416
417   EMUFS_OFFSET location;
418 \layout LyX-Code
419
420 } EMUFS_IDX;
421 \layout Standard
422
423
424 \series bold 
425 \emph on 
426 Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
427  Tipo 1 y 3:
428 \newline 
429
430 \series default 
431 \emph default 
432
433 \newline 
434
435 \begin_inset  Tabular
436 <lyxtabular version="3" rows="2" columns="3">
437 <features>
438 <column alignment="center" valignment="top" leftline="true" width="0">
439 <column alignment="center" valignment="top" leftline="true" width="0">
440 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
441 <row topline="true" bottomline="true">
442 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
443 \begin_inset Text
444
445 \layout Standard
446
447 id_reg
448 \end_inset 
449 </cell>
450 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
451 \begin_inset Text
452
453 \layout Standard
454
455 nro_bloque
456 \end_inset 
457 </cell>
458 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
459 \begin_inset Text
460
461 \layout Standard
462
463 \end_inset 
464 </cell>
465 </row>
466 <row topline="true" bottomline="true">
467 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
468 \begin_inset Text
469
470 \layout Standard
471
472 5
473 \end_inset 
474 </cell>
475 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
476 \begin_inset Text
477
478 \layout Standard
479
480 54
481 \end_inset 
482 </cell>
483 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
484 \begin_inset Text
485
486 \layout Standard
487
488 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
489 \end_inset 
490 </cell>
491 </row>
492 </lyxtabular>
493
494 \end_inset 
495
496
497 \layout Standard
498
499 \SpecialChar ~
500
501 \newline 
502
503 \series bold 
504 \emph on 
505 Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
506  Tipo 2:
507 \series default 
508 \emph default 
509  
510 \newline 
511  
512 \newline 
513
514 \begin_inset  Tabular
515 <lyxtabular version="3" rows="2" columns="3">
516 <features>
517 <column alignment="center" valignment="top" leftline="true" width="0">
518 <column alignment="center" valignment="top" leftline="true" width="0">
519 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
520 <row topline="true" bottomline="true">
521 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
522 \begin_inset Text
523
524 \layout Standard
525
526 id_reg
527 \end_inset 
528 </cell>
529 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
530 \begin_inset Text
531
532 \layout Standard
533
534 nro_bloque
535 \end_inset 
536 </cell>
537 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
538 \begin_inset Text
539
540 \layout Standard
541
542 \end_inset 
543 </cell>
544 </row>
545 <row topline="true" bottomline="true">
546 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
547 \begin_inset Text
548
549 \layout Standard
550
551 5
552 \end_inset 
553 </cell>
554 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
555 \begin_inset Text
556
557 \layout Standard
558
559 54
560 \end_inset 
561 </cell>
562 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
563 \begin_inset Text
564
565 \layout Standard
566
567 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
568 \end_inset 
569 </cell>
570 </row>
571 </lyxtabular>
572
573 \end_inset 
574
575
576 \layout Standard
577
578
579 \series bold 
580 \emph on 
581 \SpecialChar ~
582
583 \newline 
584 Nota: 
585 \series default 
586 \emph default 
587 Como se puede observar, para distintas organizaciones el significado de
588  los registros en este archivo es diferente y se utilizará de distinta manera
589  en consecuencia.
590 \layout Subsection
591
592 Comportamiento
593 \layout Standard
594
595 Las declaraciones e implementación se pueden encontrar en 
596 \series bold 
597 \emph on 
598 idx.h
599 \series default 
600 \emph default 
601  y 
602 \series bold 
603 \emph on 
604 idx.c
605 \series default 
606 \emph default 
607  respectivamente:
608 \layout List
609 \labelwidthstring 00.00.0000
610
611
612 \series bold 
613 \emph on 
614 Búsqueda:
615 \series default 
616 \emph default 
617  Los registros del archivo indice (
618 \series bold 
619 .idx
620 \series default 
621 ), poseen una correspondencia 1 a 1, con los Id's de los registros en el
622  archivo de datos (
623 \series bold 
624 .dat
625 \series default 
626 ).
627  Con esto, queremos decir que el N-ésimo registro del archivo índice, será
628  aquél que posea la información para localizar al registro cuyo 
629 \family typewriter 
630 id_reg
631 \family default 
632  es N, dentro del archivo de datos (
633 \series bold 
634 .dat
635 \series default 
636 ).
637  
638 \newline 
639
640 \newline 
641 NOTA: Cabe aclarar que por si bien el indice se encuentra ordenado por 
642 \family typewriter 
643 id_reg
644 \family default 
645 , los registros en el archivo de datos, por lo general no lo estarán.
646  (ordenados por id).
647  
648 \newline 
649 Ver: 
650 \family typewriter 
651 emufs_idx_buscar_registro()
652 \layout List
653 \labelwidthstring 00.00.0000
654
655
656 \series bold 
657 Alta:
658 \series default 
659  Ante la alta de un registro en el archivo de datos, se insetará un nuevo
660  registro en el archivo índice, con el id_reg del registro en cuestion,
661  y el offset u bloque donde se lo haya grabado en disco.
662 \newline 
663 Ver: 
664 \family typewriter 
665 emufs_idx_agregar()
666 \layout List
667 \labelwidthstring 00.00.0000
668
669
670 \series bold 
671 Baja:
672 \series default 
673  Ante el borrado de un registro del archivo de datos, se accederá el registro
674  correspondiente en el índice, y se actualizara su LOCATION, estableciendolo
675  en el valor -1 UL, el cual indica que ese registro ha sido eliminado y
676  por ende no se lo podrá localizar en el futuro.
677  Como se verá mas adelante, según el tipo de organización física, el registro
678  puede ser borrado concretamente del .
679 \series bold 
680 dat
681 \series default 
682  o nó.
683  
684 \newline 
685 Ver: 
686 \family typewriter 
687 emufs_idx_borrar()
688 \layout List
689 \labelwidthstring 00.00.0000
690
691
692 \series bold 
693 Modificación:
694 \series default 
695  Ante la modificación en la posición física de un registro dentro del archivo
696  de datos (por ejemplo luego del proceso de recompactación, se realizará
697  la modificación respectiva del campo 
698 \family typewriter 
699 location
700 \family default 
701 .
702 \newline 
703 Ver: 
704 \family typewriter 
705 emufs_idx_actualizar()
706 \layout Section
707
708
709 \begin_inset LatexCommand \label{sec:fsc}
710
711 \end_inset 
712
713 Archivo de control de espacio libre
714 \layout Standard
715
716 El archivo de espacio libre (
717 \series bold 
718 .fsc
719 \series default 
720 ) (espacio por bloque o gaps en archivo, según el tipo de organización física),
721  tiene como función la administración del espacio libre, generado por previas
722  eliminaciones de registros en el archivo de datos.
723  El mismo, nos indicará donde hay lugar para insertar un nuevo registro.
724 \layout Standard
725
726 Para el caso de una organización por bloque, nos dirá en que bloque o si
727  se debe generar un nuevo bloque.
728  En el caso de la organización sin bloques, nos indicará en que gap o si
729  al final del archivo.
730 \layout Standard
731
732 Los registros de este archivo se encuentran representados una estructura
733  que indica un número de bloque u offset y el espacio libre disponible en
734  el mismo (o apartir del mismo en el caso del offset).
735 \newline 
736
737 \layout Standard
738
739
740 \series bold 
741 Nota
742 \series default 
743 : Por requerimiento del algoritmo de compactación el tipo de organización
744  física con reg long var, sin bloques, los gaps se graban en forma ordenada
745  en el (.fsc).
746  (El orden se corresponde con lo que hay en el .dat).
747 \layout Subsection
748
749 Organización Física
750 \layout Standard
751
752 Los registros de este archivo se encuentran representados a nivel codigo
753  por el siguiente tipo de dato interno (
754 \family typewriter 
755 EMUFS_FSC
756 \family default 
757 ):
758 \layout LyX-Code
759
760 typedef struct emufs_fsc_t { 
761 \layout LyX-Code
762
763   unsigned long int marker;
764 \layout LyX-Code
765
766   unsigned long int freespace;
767 \layout LyX-Code
768
769 } EMUFS_FSC;
770 \layout Standard
771
772
773 \series bold 
774 \emph on 
775 Ejemplo de registro en archivo de espacio libre en bloque (.fsc), para un
776  archivo de organizacion Tipo 1 y 3:
777 \newline 
778
779 \series default 
780 \emph default 
781
782 \newline 
783
784 \begin_inset  Tabular
785 <lyxtabular version="3" rows="2" columns="3">
786 <features>
787 <column alignment="center" valignment="top" leftline="true" width="0">
788 <column alignment="center" valignment="top" leftline="true" width="0">
789 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
790 <row topline="true" bottomline="true">
791 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
792 \begin_inset Text
793
794 \layout Standard
795
796 nro_bloque
797 \end_inset 
798 </cell>
799 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
800 \begin_inset Text
801
802 \layout Standard
803
804 freespace
805 \end_inset 
806 </cell>
807 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
808 \begin_inset Text
809
810 \layout Standard
811
812 \end_inset 
813 </cell>
814 </row>
815 <row topline="true" bottomline="true">
816 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
817 \begin_inset Text
818
819 \layout Standard
820
821 12
822 \end_inset 
823 </cell>
824 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
825 \begin_inset Text
826
827 \layout Standard
828
829 120
830 \end_inset 
831 </cell>
832 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
833 \begin_inset Text
834
835 \layout Standard
836
837 Indica que en el bloque 12, hay 120 bytes libres al final del mismo.
838 \end_inset 
839 </cell>
840 </row>
841 </lyxtabular>
842
843 \end_inset 
844
845
846 \layout Standard
847
848 \SpecialChar ~
849
850 \newline 
851
852 \series bold 
853 \emph on 
854 Ejemplo de registro en archivo de gaps o espacios libres en archivo (.fsc),
855  para un archivo de organizacion Tipo 2:
856 \series default 
857 \emph default 
858  
859 \newline 
860  
861 \newline 
862
863 \begin_inset  Tabular
864 <lyxtabular version="3" rows="2" columns="3">
865 <features>
866 <column alignment="center" valignment="top" leftline="true" width="0">
867 <column alignment="center" valignment="top" leftline="true" width="0">
868 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
869 <row topline="true" bottomline="true">
870 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
871 \begin_inset Text
872
873 \layout Standard
874
875 offset
876 \end_inset 
877 </cell>
878 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
879 \begin_inset Text
880
881 \layout Standard
882
883 freespace
884 \end_inset 
885 </cell>
886 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
887 \begin_inset Text
888
889 \layout Standard
890
891 \end_inset 
892 </cell>
893 </row>
894 <row topline="true" bottomline="true">
895 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
896 \begin_inset Text
897
898 \layout Standard
899
900 12
901 \end_inset 
902 </cell>
903 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
904 \begin_inset Text
905
906 \layout Standard
907
908 120
909 \end_inset 
910 </cell>
911 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
912 \begin_inset Text
913
914 \layout Standard
915
916 Indica que a partir del byte 12 del archivo de datos, hay 120 bytes libres.
917 \end_inset 
918 </cell>
919 </row>
920 </lyxtabular>
921
922 \end_inset 
923
924
925 \layout Standard
926
927
928 \series bold 
929 \emph on 
930 \SpecialChar ~
931
932 \newline 
933 Nota: 
934 \series default 
935 \emph default 
936 Como se puede observar, para distintas organizaciones el significado de
937  los registros en este archivo es diferente y se utilizará de distinta manera
938  en consecuencia.
939 \layout Subsection
940
941 Comportamiento
942 \layout Standard
943
944 Las declaraciones e implementación se pueden encontrar en 
945 \series bold 
946 \emph on 
947 fsc.h
948 \series default 
949 \emph default 
950  y 
951 \series bold 
952 \emph on 
953 fsc.c
954 \series default 
955 \emph default 
956  respectivamente:
957 \layout List
958 \labelwidthstring 00.00.0000
959
960
961 \series bold 
962 Búsqueda:
963 \series default 
964  Ante la operación de alta de un registro en el archivo de datos, se realizará
965  la búsqueda de espacio libre donde este podrá ser insertado.
966  En el caso de organizaciones con bloques, se buscará en que 
967 \family typewriter 
968 nro_bloque
969 \family default 
970  se posee espacio suficiente para albergar el nuevo registro.
971  En el caso de organizacion sin bloque, se buscará un gap o espacio libre
972  en el archivo, obteniéndose en consecuencia, el 
973 \family typewriter 
974 offset
975 \family default 
976  hasta el mismo.
977 \newline 
978 Ver: 
979 \family typewriter 
980 emufs_fsc_buscar_lugar()
981 \layout List
982 \labelwidthstring 00.00.0000
983
984
985 \series bold 
986 Alta/Mod:
987 \series default 
988  Luego de una operación de baja o alta de un registro en el archivo de datos
989  (
990 \series bold 
991 .dat
992 \series default 
993 ), incrementará o decrementará respectivamente el espacio libre en el archivo
994  de datos, y esto deberá ser registrado, agregando un nuevo registro en
995  el archivo de espacios libres (
996 \series bold 
997 .fsc
998 \series default 
999 ) o bien modificandoló.
1000 \newline 
1001
1002 \newline 
1003 En el caso de organizaciónes con bloques, se actualizará el valor del espacio
1004  libre 
1005 \family typewriter 
1006 freespace
1007 \family default 
1008  en el bloque (ya sea incrementandoló o decrementandoló) o bien se insertará
1009  un nuevo registro en caso de que se esté creando un nuevo bloque en el
1010  archivo de datos (en este caso no será debido a un alta o baja de registro
1011  como se mencionó al principio).
1012 \newline 
1013
1014 \newline 
1015 Para el caso de organización sin bloques, en el caso de baja de un registro
1016  de datos (
1017 \series bold 
1018 .dat
1019 \series default 
1020 ) se insertará un nuevo registro en el 
1021 \series bold 
1022 .fsc
1023 \series default 
1024  dando cuenta de la aparición de un nuevo gap en el archivo de datos (
1025 \series bold 
1026 .dat
1027 \series default 
1028 ), y en caso de estar este lindante con otro gap, se realizará el merge
1029  pertinente.
1030  (esto esta explicado más en profundidad en los casos particulares de organizaci
1031 ón fisica, registros variables sin bloques).
1032  Para el caso de una alta en el archivo de datos (
1033 \series bold 
1034 .dat
1035 \series default 
1036 ), el valor del gap donde se haya insertado se actualizará.
1037  
1038 \newline 
1039 Ver: 
1040 \family typewriter 
1041 emufs_fsc_agregar(), emufs_fsc_agregar_gap(), emufs_fsc_actualizar(), emufs_fsc_
1042 actualizar_gap().
1043 \layout List
1044 \labelwidthstring 00.00.0000
1045
1046
1047 \series bold 
1048 Baja
1049 \series default 
1050 : Unicamente para el caso de una organización que presente gaps en el archivo,
1051  se podrá dar a lugar la eliminación de un registro del archivo de espacios
1052  libres (
1053 \series bold 
1054 .fsc)
1055 \series default 
1056 .
1057  Esta situación tendrá efecto cuando se inserte un registro que entre perfecto
1058  en un gap disponible, y por ende el gap desaparecerá.
1059 \newline 
1060 Ver: 
1061 \family typewriter 
1062 emufs_fsc_borrar_gap()
1063 \layout Section
1064
1065
1066 \begin_inset LatexCommand \label{sec:did}
1067
1068 \end_inset 
1069
1070 Archivo de id's recuperables
1071 \layout Standard
1072
1073 El archivo de Id's liberado (
1074 \series bold 
1075 .did
1076 \series default 
1077 ) llevará cuenta de aquellos Id's de registros (
1078 \family typewriter 
1079 id_reg
1080 \family default 
1081 ) que ya no se encuentran siendo utilizados y fueron liberados por registros
1082  eliminados previamente.
1083  A través del mismo, se podrá realizar la reutilización de Id's ante la
1084  alta de nuevos registros.
1085 \layout Standard
1086
1087 A nivel físico, este archivo poseerá una secuencia de datos del tipo EMUFS_REG_I
1088 D, y el comportamiento del sistema de recuperación de Id's será el de una
1089  pila.
1090  Es decir, ante el requerimiento de un 
1091 \family typewriter 
1092 reg_id
1093 \family default 
1094  libre por una función del sistema como por ejemplo la alta de un nuevo
1095  registro, el API del archivo (
1096 \series bold 
1097 .did
1098 \series default 
1099 ), obtendrá el último dato del mismo (el 
1100 \emph on 
1101 Id
1102 \emph default 
1103  que fue liberado mas recientemente), y truncará el archivo eliminando el
1104  
1105 \emph on 
1106 Id
1107 \emph default 
1108  recuperado de la tabla.
1109  (LIFO, Last in First Out).
1110 \layout Subsection
1111
1112 Organización Física
1113 \layout Standard
1114
1115 Este archivo tiene registros de un solo campo, 
1116 \family typewriter 
1117 EMUFS_REG_ID
1118 \family default 
1119  el cual simboliza al id que fue liberado en un proceso de baja de registros.
1120 \layout Subsection
1121
1122 Comportamiento
1123 \layout Standard
1124
1125 Las declaraciones e implementación se pueden encontrar en 
1126 \series bold 
1127 \emph on 
1128 did.h
1129 \series default 
1130 \emph default 
1131  y 
1132 \series bold 
1133 \emph on 
1134 did.c
1135 \series default 
1136 \emph default 
1137  respectivamente
1138 \layout List
1139 \labelwidthstring 00.00.0000
1140
1141
1142 \series bold 
1143 Alta: 
1144 \series default 
1145 Ante la eliminación de un registro del archivo de datos (
1146 \series bold 
1147 .dat
1148 \series default 
1149 ) se procederá al agregado del correspondiente 
1150 \family typewriter 
1151 id_reg
1152 \family default 
1153  que fue liberado por dicha operación, al archivo 
1154 \series bold 
1155 .did
1156 \series default 
1157 .
1158 \family typewriter 
1159
1160 \newline 
1161
1162 \family default 
1163 Ver: 
1164 \family typewriter 
1165 emufs_did_agregar()
1166 \layout List
1167 \labelwidthstring 00.00.0000
1168
1169 Baja Cuando el sistema desee grabar un nuevo registro en el archivo de datos,
1170  este pedirá un 
1171 \family typewriter 
1172 id_reg
1173 \family default 
1174  disponible para el mismo.
1175  El sistema de administración de Id's libres, obtendrá el último 
1176 \emph on 
1177 id
1178 \emph default 
1179  que se guardó en el archivo (o se eliminó del archivo de datos), y truncará
1180  el archivo eliminandolo.
1181 \family typewriter 
1182
1183 \newline 
1184
1185 \family default 
1186 Ver: 
1187 \family typewriter 
1188 emufs_did_get_last()
1189 \layout Chapter
1190
1191
1192 \begin_inset LatexCommand \label{cha:tipo1}
1193
1194 \end_inset 
1195
1196 Archivo con bloques parametrizados y registros de longitud variable
1197 \layout Standard
1198
1199 Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
1200  intermedio entre el 
1201 \begin_inset LatexCommand \ref{cha:tipo2}
1202
1203 \end_inset 
1204
1205  y el 
1206 \begin_inset LatexCommand \ref{cha:tipo3}
1207
1208 \end_inset 
1209
1210  (cuenta tanto con bloques como con registros variables), hereda los inconvenien
1211 tes (y ventajas) de ambos, más los propios.
1212  Al implementar este tipo de archivo se puso enfásis en la eficiencia mientras
1213  esta no comprometa la mantenibilidad del código, es por esto que en algunas
1214  circunstancias no se hace un uso óptimo del espacio.
1215 \layout Standard
1216
1217 La implementación de este tipo de archivo puede ser encontrada en 
1218 \family typewriter 
1219 emufs/tipo1.c
1220 \family default 
1221  mientras que su interfaz pública está disponible en 
1222 \family typewriter 
1223 emufs/tipo1.h
1224 \family default 
1225 .
1226 \layout Section
1227
1228 Organización física
1229 \layout Standard
1230
1231 El archivo está compuesto por la 
1232 \emph on 
1233 cabecera general
1234 \emph default 
1235  (ver página 
1236 \begin_inset LatexCommand \pageref{sec:cabecera_gral}
1237
1238 \end_inset 
1239
1240 ).
1241  El valor que toma en este tipo de archivo es 0 (o el valor simbólico 
1242 \family typewriter 
1243 T1
1244 \family default 
1245  del tipo 
1246 \family typewriter 
1247 EMUFS_Tipo
1248 \family default 
1249 ).
1250  Luego le sigue una cabecera propia del archivo (un 
1251 \family typewriter 
1252 EMUFS_BLOCK_SIZE
1253 \family default 
1254 , 4 bytes) que almacena el tamaño del bloque que usa el archivo.
1255  De esta menera, al abrir un archivo de este tipo no se necesita tener ninguna
1256  información sobre él.
1257  A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
1258  en la cabecera antes mencionada.
1259 \layout LyX-Code
1260
1261 archivo
1262 \layout LyX-Code
1263
1264 +-----------+-----------+------------------------//-+
1265 \layout LyX-Code
1266
1267 |    tipo   | tam bloque| Cero o más bloques ...
1268  
1269 \backslash 
1270
1271 \backslash 
1272  |
1273 \layout LyX-Code
1274
1275 +-----------+-----------+------------------------//-+
1276 \layout LyX-Code
1277
1278 /- 4 bytes -/- 4 bytes -/
1279 \layout Subsection
1280
1281 Organización física de un bloque
1282 \layout Standard
1283
1284 Cada bloque no guarda información en sí, sólo se comporta como un contenedor
1285  de registros.
1286  Esto no significa que un bloque no tenga utilidad, el bloque es utilizado
1287  para proveer un acceso semi-aleatorio a los registros.
1288  Para esto se utiliza el archivo de índice (ver página 
1289 \begin_inset LatexCommand \ref{sec:idx}
1290
1291 \end_inset 
1292
1293 ), que almacena pares (identificador de registro, número de bloque).
1294  Para que sea suficiente este único índice para hallar un registro (siendo
1295  que puede haber más de un registro por bloque), es necesario 
1296 \emph on 
1297 alinear los registros a izquierda
1298 \emph default 
1299 .
1300 \layout LyX-Code
1301
1302 bloque N-1 | bloque N                                    | bloque N+1
1303 \layout LyX-Code
1304
1305 /----------+------------+------------+-------------------+-----------/
1306 \layout LyX-Code
1307
1308
1309 \backslash 
1310           | registro 1 | registro 2 | espacio libre ...
1311  |           
1312 \backslash 
1313  /----------+------------+------------+-------------------+-----------/
1314 \layout Standard
1315
1316 De forma tal que una vez obtenido el número de bloque se pueda recorrer
1317  secuencialmente hasta encontrar el registro deseado.
1318  A fin de llevar el conteo de espacio libre se utiliza el archivo de control
1319  de espacio libre (ver página 
1320 \begin_inset LatexCommand \ref{sec:fsc}
1321
1322 \end_inset 
1323
1324 ), de forma tal que no sea necesario recorrer secuencialmente en busca de
1325  espacio libre al hacer una inserción.
1326 \layout Standard
1327
1328 Puede darse un caso excepcional en el que un registro sea más grande que
1329  un bloque, en este caso el registro se almacenará en N bloques consecutivos
1330  (siendo N la cantidad de bloques que necesita el registro), ocupando completos
1331  los todos los bloques a excepción del último, en el que posteriormente
1332  se pueden agregar más registros.
1333 \layout Section
1334
1335 Comportamiento (funciones de la interfáz)
1336 \layout Section
1337
1338 Detalles de implementación (funciones internas, ver si lo ponemos o no)
1339 \layout Chapter
1340
1341
1342 \begin_inset LatexCommand \label{cha:tipo2}
1343
1344 \end_inset 
1345
1346 Archivo sin bloques y registros de longitud variable
1347 \layout Standard
1348
1349 Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
1350  de longitud variable sin realizar su agrupación en bloques, y como veremos
1351  en la siguiente sección, tambien permitirá la administración de gaps que
1352  queden en el archivo luego de operaciones de baja de registros.
1353 \layout Section
1354
1355 Organización física
1356 \layout Standard
1357
1358 Este tipo de archivo realizará el almacenamiento de registros de longitud
1359  variable en disco, su borrado y modificación sin la utilización de bloques
1360  de ningún tipo.
1361  Su implementación se encuentra en los archivos fuente (
1362 \series bold 
1363 tipo2.c
1364 \series default 
1365  y 
1366 \series bold 
1367 tipo2.h
1368 \series default 
1369 ).
1370 \layout Standard
1371
1372 Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
1373  simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
1374  de archivo en cuestión.
1375 \layout Standard
1376
1377 Para poder entender mejor la organización fisica de este tipo de archivo,
1378  tomemos el caso hipotético en el que se encuentran grabados 
1379 \series bold 
1380 dos registros
1381 \series default 
1382  (comenzando desde registro 0) de 
1383 \series bold 
1384 30 bytes
1385 \series default 
1386 , y 
1387 \series bold 
1388 25 bytes
1389 \series default 
1390 , respectivamente.
1391  Supongamos también que entre el registro 0 y 1 se encontraba un 
1392 \series bold 
1393 registro de 10 bytes
1394 \series default 
1395  que fue 
1396 \series bold 
1397 borrado
1398 \series default 
1399 , generando un 
1400 \series bold 
1401 gap
1402 \series default 
1403  
1404 \series bold 
1405 o freespace
1406 \series default 
1407 .
1408  Si miramos al archivo de datos (.dat) en el disco nos encontraremos con
1409  lo siguiente: 
1410 \begin_inset Float figure
1411 placement H
1412 wide false
1413 collapsed true
1414
1415 \layout Caption
1416
1417 Organización física de los registros en disco
1418 \layout Standard
1419
1420
1421 \begin_inset Graphics
1422         filename graphics/Example1.png
1423         width 100text%
1424
1425 \end_inset 
1426
1427
1428 \end_inset 
1429
1430
1431 \layout Standard
1432
1433 Como se puede observar, a nivel físico cada registro grabado esta compuesto
1434  por un Header cuyo tamaño total es de 8 bytes (
1435 \series bold 
1436 EMUFS_REG_ID
1437 \series default 
1438  + 
1439 \series bold 
1440 EMUFS_REG_SIZE
1441 \series default 
1442 ), y posteriormente el registro (bloque de datos) en sí.
1443  Luego se encuentra el espacio libre de 18 bytes dejado por el registro
1444  de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
1445  el segundo registro mencionado.dsds
1446 \layout Subsection
1447
1448 Comportamiento Particular de los Archivos Auxiliares
1449 \layout Standard
1450
1451 Como fue explicado al inicio de la documentación, la implementación de cualquier
1452 a de las tres organizaciones físicas de archivos presenta la necesidad de
1453  poseer tres archivos auxiliares que actuarán como índice de direcciones
1454  de registro (.
1455 \series bold 
1456 idx
1457 \series default 
1458 ), administrador de espacio libre (
1459 \series bold 
1460 .fsc
1461 \series default 
1462 ) y administrador de Id's liberados (
1463 \series bold 
1464 .did
1465 \series default 
1466 ) respectivamente.
1467 \layout Standard
1468
1469 No obstante, cada tipo de organización presentara sus particularidades respecto
1470  de estos tres archivos, las cuales describiremos a continuación en caso
1471  de haberla.
1472 \layout Subsubsection
1473
1474 Archivo índice o de posiciones relativas (.idx)
1475 \layout Standard
1476
1477 El archivo indice (
1478 \series bold 
1479 .idx
1480 \series default 
1481 ), permite la localizacin de los registros en el .DAT de forma directa, mediante
1482  la obtención de su offset o posición relativa respecto del inicio del 
1483 \series bold 
1484 .dat
1485 \series default 
1486  en donde se encuentra un registro dado, indicado por su ID.
1487 \layout Standard
1488
1489 Así pues, si tomamos el ejemplo descripto al inicio de este capítudlo, tendremos
1490  las siguientes entradas en el archivo indice 
1491 \series bold 
1492 .idx
1493 \series default 
1494  :
1495 \newline 
1496
1497 \layout Standard
1498
1499
1500 \begin_inset  Tabular
1501 <lyxtabular version="3" rows="3" columns="3">
1502 <features>
1503 <column alignment="center" valignment="top" leftline="true" width="0">
1504 <column alignment="center" valignment="top" leftline="true" width="0">
1505 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1506 <row topline="true" bottomline="true">
1507 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1508 \begin_inset Text
1509
1510 \layout Standard
1511
1512
1513 \emph on 
1514 ID_REGISTRO
1515 \end_inset 
1516 </cell>
1517 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1518 \begin_inset Text
1519
1520 \layout Standard
1521
1522
1523 \emph on 
1524 OFFSET
1525 \end_inset 
1526 </cell>
1527 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1528 \begin_inset Text
1529
1530 \layout Standard
1531
1532 \end_inset 
1533 </cell>
1534 </row>
1535 <row topline="true">
1536 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1537 \begin_inset Text
1538
1539 \layout Standard
1540
1541
1542 \series bold 
1543 0
1544 \end_inset 
1545 </cell>
1546 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1547 \begin_inset Text
1548
1549 \layout Standard
1550
1551
1552 \series bold 
1553 4
1554 \end_inset 
1555 </cell>
1556 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1557 \begin_inset Text
1558
1559 \layout Standard
1560
1561 El primer registro (reg0) comienza en el byte 4
1562 \end_inset 
1563 </cell>
1564 </row>
1565 <row topline="true" bottomline="true">
1566 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1567 \begin_inset Text
1568
1569 \layout Standard
1570
1571 1
1572 \end_inset 
1573 </cell>
1574 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1575 \begin_inset Text
1576
1577 \layout Standard
1578
1579
1580 \series bold 
1581 60
1582 \end_inset 
1583 </cell>
1584 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1585 \begin_inset Text
1586
1587 \layout Standard
1588
1589 El segundo registro (reg1) comienza en el byte 60
1590 \end_inset 
1591 </cell>
1592 </row>
1593 </lyxtabular>
1594
1595 \end_inset 
1596
1597
1598 \layout Standard
1599
1600
1601 \series bold 
1602 \emph on 
1603 \SpecialChar ~
1604
1605 \newline 
1606 Observación:
1607 \series default 
1608 \emph default 
1609  LOCATION indica donde comienza el header del registro buscado, y por consiguien
1610 te luego del header tendremos el registro en sí (los datos).
1611 \layout Subsubsection
1612
1613 Achivo de Gaps / Espacios Libres (.fsc)
1614 \layout Standard
1615
1616 El archivo de espacios libres o gaps (.fsc), tiene como función la administracion
1617  del espacio libre o gaps (agujeros), generados por previas eliminaciones
1618  de registros en el archivo de datos.
1619  El mismo, nos indicará donde hay lugar para insertar un nuevo registro
1620  (se podrán insertar en algún gap acorde, o bien al final del archivo).
1621  Este archivo será utilizado tambien para el proceso de compactación de
1622  un archivo, explicado luego.
1623 \layout Standard
1624
1625 Así pues, si tomamos el ejemplo descripto al inicio del documento, tendremos
1626  las siguientes entradas en el archivo índice 
1627 \series bold 
1628 .fsc
1629 \series default 
1630  : 
1631 \newline 
1632
1633 \newline 
1634
1635 \begin_inset  Tabular
1636 <lyxtabular version="3" rows="2" columns="3">
1637 <features>
1638 <column alignment="center" valignment="top" leftline="true" width="0">
1639 <column alignment="center" valignment="top" leftline="true" width="0">
1640 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1641 <row topline="true" bottomline="true">
1642 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1643 \begin_inset Text
1644
1645 \layout Standard
1646
1647
1648 \emph on 
1649 OFFSET
1650 \end_inset 
1651 </cell>
1652 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1653 \begin_inset Text
1654
1655 \layout Standard
1656
1657
1658 \emph on 
1659 FREESPACE
1660 \end_inset 
1661 </cell>
1662 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1663 \begin_inset Text
1664
1665 \layout Standard
1666
1667 \end_inset 
1668 </cell>
1669 </row>
1670 <row topline="true" bottomline="true">
1671 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1672 \begin_inset Text
1673
1674 \layout Standard
1675
1676
1677 \series bold 
1678 42
1679 \end_inset 
1680 </cell>
1681 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1682 \begin_inset Text
1683
1684 \layout Standard
1685
1686
1687 \series bold 
1688 18
1689 \end_inset 
1690 </cell>
1691 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1692 \begin_inset Text
1693
1694 \layout Standard
1695
1696 18 bytes libres a partir del byte 42 del .dat
1697 \end_inset 
1698 </cell>
1699 </row>
1700 </lyxtabular>
1701
1702 \end_inset 
1703
1704
1705 \layout Standard
1706
1707
1708 \series bold 
1709 \emph on 
1710 \SpecialChar ~
1711
1712 \newline 
1713 Nota:
1714 \series default 
1715 \emph default 
1716  Por requerimiento del algoritmo de compactación, los gaps se graban en
1717  forma ordenada en el (.fsc).
1718  (El orden se corresponde con lo que hay en el .dat)
1719 \layout Subsubsection*
1720
1721 GAP Merging
1722 \layout Standard
1723
1724 Si bien la utilización concreta de los GAPS será explicada posteriormente
1725  en la ALTA y BAJA de registros, debemos remarcar la funcionalidad de MERGING
1726  que posee nuestro sistema FSC.
1727 \layout Standard
1728
1729 Ante la eliminación de un registro del archivo de datos, se generara por
1730  consiguiente un gap o espacio libre en alguna posición del archivo.
1731  Ese gap deberá ser registrado en el archivo de gaps (.fsc).
1732  Ahora bien, nuestro sistema de gaps, contemplará como es debido, la posibilidad
1733  de que se haya eliminado un registro que posee un GAP por delante, un GAP
1734  por detrás, o bien un GAP por delante y por detrás del mismo.
1735 \layout Standard
1736
1737 Nuestro sistema actuará en consecuencia, realizando un merge de los espacios
1738  libres, y unificándolos en una UNICA entrada en el archivo .fsc, que contendrá
1739  como dato de freespace, la suma correspondiente de los espacios libres
1740  antes mencionados.
1741 \layout Subsubsection
1742
1743 Archivo de ID's liberados (.did)
1744 \layout Standard
1745
1746 El archivo de ID's liberados no presenta ningún aspecto particular en este
1747  tipo de organización.
1748  Remitirse al capítulo correspondiente a los archivos auxiliares para consultar
1749  su estructura y funcionamiento.
1750 \layout Section
1751
1752 Comportamiento (funciones de la interfaz)
1753 \layout Standard
1754
1755 Dentro de 
1756 \series bold 
1757 \emph on 
1758 tipo2.h
1759 \series default 
1760 \emph default 
1761  y 
1762 \series bold 
1763 \emph on 
1764 tipo2.c
1765 \series default 
1766 \emph default 
1767  se encuentran las cabeceras y la implementación de las funciones principales
1768  respectivamente, las cuales dan funcionalidad a esta organización.
1769  
1770 \layout Standard
1771
1772 A continuación se comentará el funcionamiento algunas de las mas importantes.
1773 \layout Subsection
1774
1775 Lectura de registros
1776 \layout Standard
1777
1778 Como se vió al comienzo, los registros en este tipo de archivo no se encuentran
1779  agrupados en bloques de ninguna índole y estan dispersos a lo largo del
1780  archivo, con la particularidad de que pueden existir gaps o espacio libre,
1781  entre dos registros dados.
1782 \layout Standard
1783
1784 Por ende la lectura de registros en este tipo de organización es muy simple
1785  y dada la inexistencia de bloques, el procedimiento será el siguiente:
1786 \layout Enumerate
1787
1788 Se determina el offset en bytes, donde comienza el registro deseado, a través
1789  de su ID, buscando la misma en el archivo índice (
1790 \series bold 
1791 .idx
1792 \series default 
1793 )
1794 \layout Enumerate
1795
1796 Ya determinada la posición física del registro dentro del archivo de datos
1797  (
1798 \series bold 
1799 .dat
1800 \series default 
1801 ), nos posicionamos en la misma, y leemos el header del registro (
1802 \series bold 
1803 IDReg
1804 \series default 
1805  + 
1806 \series bold 
1807 RegSize
1808 \series default 
1809 ).
1810  Contando así con el tamaño del registro, procedemos a leer el mismo (los
1811  datos), dando por finalizada la lectura.
1812 \layout Standard
1813
1814 Ver: 
1815 \family typewriter 
1816 emufs_tipo2_leer_registro()
1817 \layout Subsection
1818
1819 Altas de registros
1820 \layout Standard
1821
1822 En el proceso de alta de registros entrarán en juego dos archivos descriptos
1823  en la 
1824 \emph on 
1825 sección de archivos auxiliares
1826 \emph default 
1827 , siendo estos el archivo índice (
1828 \series bold 
1829 .idx
1830 \series default 
1831 ), y el archivo de gaps / espacios libres (
1832 \series bold 
1833 .fsc
1834 \series default 
1835 ).
1836 \layout Standard
1837
1838 Así pues, a la hora de realizar una inserción de un registro en el archivo
1839  de datos, el procedimiento será el siguiente:
1840 \layout Enumerate
1841
1842 Calculamos el espacio que necesitaremos para el registro: sizeof(
1843 \series bold 
1844 EMUFS_REG_ID
1845 \series default 
1846 ) + sizeof(
1847 \series bold 
1848 EMUFS_REG_SIZE
1849 \series default 
1850 ) + sizeof(registro).
1851 \layout Enumerate
1852
1853 Determinamos donde debemos insertar el registro, ya sea un gap donde entre,
1854  o bien al final del archivo.
1855 \layout Enumerate
1856
1857 Insertamos el registro e información de control (
1858 \series bold 
1859 header
1860 \series default 
1861 +
1862 \series bold 
1863 data
1864 \series default 
1865 ), en la posición indicada en el paso 2.
1866 \layout Enumerate
1867
1868 En caso de haber utilizado un GAP, actualizamos el espacio libre restante
1869  en el mismo y en caso de que se haya utilizado al totalidad del GAP, se
1870  lo elimina del archivo (
1871 \series bold 
1872 .fsc
1873 \series default 
1874 ).
1875 \layout Enumerate
1876
1877 Actualizamos la entrada correspondiente al registro ingresado (determinada
1878  por su RegID), en el archivo índice (
1879 \series bold 
1880 .idx
1881 \series default 
1882 ), indicando su offset donde podrá ser accedido luego.
1883 \layout Standard
1884
1885 Ver: 
1886 \family typewriter 
1887 emufs_tipo2_agregar_registro()
1888 \layout Subsection
1889
1890 Bajas de registros
1891 \layout Standard
1892
1893 En el proceso de baja de registros entrarán en juego los tres archivos descripto
1894 s en la 
1895 \emph on 
1896 sección de archivos auxiliares
1897 \emph default 
1898 , siendo estos el archivo índice (
1899 \series bold 
1900 .idx
1901 \series default 
1902 ), el archivo de gaps / espacios libres (
1903 \series bold 
1904 .fsc
1905 \series default 
1906 ) y el archivo de ID's liberados (
1907 \series bold 
1908 .did
1909 \series default 
1910 ).
1911 \layout Standard
1912
1913 Dado que en la implementación de este tipo de organización física contamos
1914  con los gaps o espacios libres entre registros, no se eliminará fisicamente
1915  el registro del archivo de datos (
1916 \series bold 
1917 .dat
1918 \series default 
1919 ), pues entonces carecería de sentido el archivo anteriormente mencionado
1920  (
1921 \series bold 
1922 .fsc
1923 \series default 
1924 ).
1925  En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
1926  y se marca fisicamente en el archivo de datos la eliminación mediante un
1927  fill de los bytes correspondientes con un caracter nulo.
1928  (hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
1929 \layout Standard
1930
1931 El proceso de baja o eliminación de un registro constará luego de los siguientes
1932  pasos:
1933 \layout Enumerate
1934
1935 Se obtiene el offset o posición relativa en donde se encuentra grabado el
1936  registro dentro del archivo de datos.
1937 \layout Enumerate
1938
1939 Se obtiene el tamaño del registro y se realiza un dummyfill del sector del
1940  archivo correspondiente al registro que se está dando de baja.
1941  (Se rellena la zona correspondiente a su header+data).
1942 \layout Enumerate
1943
1944 Se agrega el GAP generado al archivo de gaps o espacios libres, y en caso
1945  de haberse generado un GAP lindante con otro GAP, se realizará un merge
1946  de los mismos y se los registrará bajo una única entrada en el archivo
1947  de espacios libres (.fsc).
1948 \layout Enumerate
1949
1950 Se agrega el ID que fue liberado, al archivo de ID's liberados (
1951 \series bold 
1952 .did
1953 \series default 
1954 ), al final del mismo (
1955 \emph on 
1956 pila
1957 \emph default 
1958 ).
1959 \layout Enumerate
1960
1961 Se marca en el archivo índice (
1962 \series bold 
1963 .idx
1964 \series default 
1965 ) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
1966  al registro recién eliminado (se le cambia el valor al n-esimo registro,
1967  donde N = IDReg del reg eliminado).
1968 \layout Standard
1969
1970 Ver: 
1971 \family typewriter 
1972 emufs_tipo2_borrar_registro()
1973 \layout Subsection
1974
1975 Modificación de registros
1976 \layout Standard
1977
1978 Dada la naturaleza del archivo de ID's liberados, y el manejo de espacio
1979  libre del que consta esta organización de archivo, el proceso de modificación
1980  de un registro se limita a los siguientes pasos:
1981 \layout Enumerate
1982
1983 Se realiza la lectura del registro, mediante el respectivo procedimiento
1984  ya desarollado anteriormente.
1985 \layout Enumerate
1986
1987 Una vez que se cuenta con los nuevos datos modificados, se procede a dar
1988  de baja el registro que ha sido modificado, e inmediatamente después se
1989  realiza una inserción con los nuevos datos.
1990 \layout Standard
1991
1992
1993 \series bold 
1994 \emph on 
1995 NOTA:
1996 \series default 
1997 \emph default 
1998  Como fue indicado, dada la naturaleza de PILA del subsistema de administración
1999  de ID liberados, es asegurado que la nueva inserción del registro modificado
2000  se realizará con el mismo RegID.
2001 \layout Standard
2002
2003 Ver: 
2004 \family typewriter 
2005 emufs_tipo2_modificar_registro()
2006 \layout Subsection
2007
2008 Obtención de estadísticas
2009 \layout Standard
2010
2011 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
2012  cantidad de bloques, cantidad de registros, espacio libre total, espacio
2013  libre promedio, espacio libre máximo y mínimo, etc.
2014 \layout Standard
2015
2016 Esta información es el resultado de ciertos cálculos realizados tanto en
2017  el archivo de datos como en los archivos índice.
2018 \layout Standard
2019
2020 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
2021  del archivo de datos, espacio libre total, cantidad de registros, cantidad
2022  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
2023  libres, etc.
2024 \layout Standard
2025
2026 Ver: 
2027 \family typewriter 
2028 emufs_tipo2_leer_estadisticas()
2029 \layout Subsection
2030
2031 Compactación del archivo de datos
2032 \layout Standard
2033
2034 Asi como los otros dos tipos de datos, el que nos compete también cuenta
2035  con la posibilidad de realizar la compactación de datos cuando el usuario
2036  lo desee, justificando todos los registros a izquierda, eliminando así
2037  los gaps existentes y decrementando el tamaño del archivo en disco (truncandolo
2038 ).
2039 \layout Standard
2040
2041 Para poder comprender como hemos implementado el proceso de recompactación
2042  en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
2043  cuales iremos describiendo el proceso.
2044  Notemos antes, que el proceso de compactación esta directamente ligado
2045  con el archivo de gaps o espacios libres (
2046 \series bold 
2047 .fsc
2048 \series default 
2049 ).
2050 \layout Standard
2051
2052 Comenzemos con el siguiente cuadro situacional: 
2053 \begin_inset Float figure
2054 placement H
2055 wide false
2056 collapsed true
2057
2058 \layout Caption
2059
2060 Archivo con gaps entre registros previo a compactación
2061 \layout Standard
2062
2063
2064 \begin_inset Graphics
2065         filename graphics/Compact1.png
2066         width 100text%
2067         keepAspectRatio
2068
2069 \end_inset 
2070
2071
2072 \end_inset 
2073
2074
2075 \layout Standard
2076
2077 Partiendo de esta base, el algoritmo de compactación tomará en su inicio
2078  al primer gap existente dentro del archivo de datos, en este caso llamado
2079  
2080 \series bold 
2081 Gap0
2082 \series default 
2083 .
2084  Luego, establecerá que el 
2085 \series bold 
2086 Source
2087 \series default 
2088  a partir de donde se quieren mover datos, sera:
2089 \layout LyX-Code
2090
2091 StartGap0 + SizeGap0 = EndGap0 = Source
2092 \layout Standard
2093
2094 Lo cual no es nada más y nada menos que lo obvio, la fuente a partir de
2095  donde se mueven los datos, sera el fin del primer gap, donde comienzan
2096  datos.
2097  Como destino (
2098 \series bold 
2099 Destination
2100 \series default 
2101 ) del movimiento, se establece inicialmente, el inicio del gap, o sea 
2102 \series bold 
2103 StartGap0 = Destination
2104 \series default 
2105 .
2106 \layout Standard
2107
2108 Luego, el algoritmo entrara en un bucle while (mientras haya bucles por
2109  levantar), el cual trabajara hasta el final de la compactación de la siguiente
2110  manera:
2111 \layout Standard
2112
2113
2114 \series bold 
2115 Mientras haya Gaps
2116 \series default 
2117  {
2118 \layout Enumerate
2119
2120 Se levanta el proximo gap al levantado en una instancia previa.
2121  En este ejemplo, durante el primer loop del while, se levantará 
2122 \series bold 
2123 Gap1
2124 \layout Enumerate
2125
2126 Luego, se calcula cuantos bytes hay que mover hacia el Destination de la
2127  siguiente manera:
2128 \layout Enumerate
2129
2130
2131 \series bold 
2132 Mustmove_bytes
2133 \series default 
2134  = 
2135 \series bold 
2136 StartGap1
2137 \series default 
2138  - 
2139 \series bold 
2140 Source
2141 \series default 
2142  = 
2143 \series bold 
2144 StartGap1
2145 \series default 
2146  - 
2147 \series bold 
2148 EndGap0 (
2149 \series default 
2150 Lo cual nuevamente es lógico pues querremos mover lo que se encuentra entre
2151  el final del primer gap levantado y el inicio del siguiente).
2152 \layout Enumerate
2153
2154 Se realiza el movimiento de los datos, utilizando las direcciones 
2155 \series bold 
2156 Source
2157 \series default 
2158  y 
2159 \series bold 
2160 Destination
2161 \series default 
2162 , así como la variable 
2163 \series bold 
2164 Mustmove_bytes
2165 \series default 
2166  que nos indica cuantos bytes transferir.
2167 \series bold 
2168
2169 \newline 
2170 IMPORTANTE: 
2171 \emph on 
2172 La transferencia se hace de a chunks de 25 bytes + un resto segun el valor
2173  de Mustmove_bytes.
2174 \layout Enumerate
2175
2176 Se establece como gap de referencia, al ultimo gap leido (En este caso se
2177  realiza: 
2178 \series bold 
2179 StartGap0
2180 \series default 
2181  = 
2182 \series bold 
2183 StartGap1
2184 \series default 
2185
2186 \series bold 
2187 Gap0Size = Gap1Size
2188 \series default 
2189 ) y termina el código de repetición del bucle, dando lugar a la carga del
2190  siguiente gap en el inicio del mismo.
2191 \layout Standard
2192
2193
2194 \series bold 
2195 }
2196 \layout Standard
2197
2198 Luego del primer bucle, el archivo se vera de la siguiente forma: 
2199 \begin_inset Float figure
2200 placement H
2201 wide false
2202 collapsed true
2203
2204 \layout Caption
2205
2206 Archivo con gaps en disco luego del primer bucle de compactación
2207 \layout Standard
2208
2209
2210 \begin_inset Graphics
2211         filename graphics/Compact2.png
2212         width 100text%
2213
2214 \end_inset 
2215
2216
2217 \end_inset 
2218
2219
2220 \layout Standard
2221
2222 Notemos que al final de la porción de datos de los bytes movidos (donde
2223  quedo apuntando 
2224 \series bold 
2225 Destination
2226 \series default 
2227 ), hay basura que será pisada por el próximo movimiento.
2228 \layout Standard
2229
2230 En el próximo loop, el bucle levantará un nuevo gap, y utilizando el gap
2231  anterior (En esta caso el Gap anterior será 
2232 \series bold 
2233 Gap1
2234 \series default 
2235 ) como referencia, realizará los mismos cálculos, desde donde transferir
2236  y cuantos bytes mover.
2237  (El destino es solo establecido inicialmente por código, y para el resto
2238  del algoritmo es el lugar donde quedo el puntero destination luego de la
2239  última escritura).
2240 \layout Standard
2241
2242 Una vez que se salga del bucle while, se realizará un último movimiento
2243  preprogramado, donde la fuente (
2244 \series bold 
2245 Source
2246 \series default 
2247 ) será el final del ultimo gap, y la cantidad de bytes a mover será lo que
2248  se encuentre luego del mismo hasta el fin de archivo.
2249 \layout LyX-Code
2250
2251 Source = StartLastGap + SizeLastGap = EndLastGap
2252 \layout LyX-Code
2253
2254 Mustmove_bytes = Datsize - Source
2255 \layout Standard
2256
2257 Damos por terminada así, la explicación del algoritmo de compresión el cual
2258  para el caso del tipo 2, es realmente bastante sencillo.
2259 \layout Standard
2260
2261 Ver: 
2262 \family typewriter 
2263 void emufs_tipo2_compactar()
2264 \layout Section
2265
2266 Consideraciones y Políticas de Diseño
2267 \layout Standard
2268
2269 Se han tomado ciertas consideraciones para algunos casos particulares que
2270  se pueden presentar durante el uso/ejecución de la aplicación, así como
2271  tambien politicas respecto del diseño e implementación del sistema:
2272 \layout Itemize
2273
2274 En la organización física tipo 2 para los registros que se graban en disco
2275  hemos decidido utilizar como encabezado de cada uno de ellos, los datos
2276  [ID_REG][REG_SIZE], los cuales fueron detallados previamente.
2277  Si bien se podría haber descartado el grabado del ID del registro en el
2278  archivo de datos y puede parecer redundante, dado que poseemos el archivo
2279  índice con el offset directo, el mismo se lo graba por distintos motivos:
2280 \newline 
2281
2282 \newline 
2283 A) En caso de la corrupción del archivo índice (.idx), podremos gracias a
2284  que poseemos en el archivo de datos, el ID de cada registro, recrear dicho
2285  índice, ayudándonos del archivo de espacios libres (
2286 \series bold 
2287 .fsc
2288 \series default 
2289 ), para poder saltear los espacios libres y e ir recorriendo secuencialmente
2290  los registros, reconstruyendo así el índice en cuestión.
2291  (esta función de reconstrucción no pudo ser implementada para esta entrega,
2292  pero es una posibilidad real).
2293 \newline 
2294
2295 \newline 
2296 B) Luego de un proceso de recompactación, los espacios libres que pudieron
2297  haber existido en el archivo de datos (
2298 \series bold 
2299 .dat
2300 \series default 
2301 ), son eliminados y los registros han cambiado de posición.
2302  Por ello, recorriendo secuencialmente por única vez el archivo de datos,
2303  se procede a la actualización / reconstrucción del índice de direcciones
2304  u offsets (.
2305 \series bold 
2306 idx
2307 \series default 
2308 )
2309 \layout Itemize
2310
2311 Si se desea insertar un registro y no se puede hayar un gap o espacio libre
2312  donde quepa, se los inserta al final del archivo.
2313 \layout Itemize
2314
2315 Ante una operación de baja de un registro, el mismo no es físicamente borrado
2316  del archivo de datos (
2317 \series bold 
2318 .dat
2319 \series default 
2320 ), simplemente los bytes que ocupa son llenados con hexa (00).
2321  Paralelamente, se procede a actualiza el archivo índice, insertando como
2322  valor de OFFSET para el registro eliminado, el valor ¨-1¨, indicando así
2323  la inexistencia del registro para el futuro, y por otro lado se genera
2324  la entrada de espacio libre en el archivo de gaps (
2325 \series bold 
2326 .fsc
2327 \series default 
2328 ).
2329 \layout Itemize
2330
2331 La reutilización de ID's liberados por previas operaciones de baja de registros,
2332  se ve implementada por el archivo de ID liberados (.did), y su comportamiento
2333  es el de una pila por lo que el último ID liberado, sera el próximo a ser
2334  reutilizado (LIFO).
2335 \layout Itemize
2336
2337 Como fue explicado en la implementación del archivo índice, existe una correspon
2338 dencia 1 a 1 entre los registros allí presentes (en el .idx) y los ID's de
2339  los registros, por lo cual el registro N-ésimo del archivo índice, será
2340  el correspondiente al registro de datos cuyo ID es igual a N.
2341 \layout Itemize
2342
2343 El proceso de compactación de archivos, realiza los movimientos de información
2344  requeridos para dicho propósito de a chunks de 25 bytes por vez.
2345  Este valor es fijo, pero se lo podría hacer parametrizable mediante la
2346  GUI en próximas entregas.
2347 \layout Chapter
2348
2349
2350 \begin_inset LatexCommand \label{cha:tipo3}
2351
2352 \end_inset 
2353
2354 Archivo con bloques parametrizados y registros de longitud constante
2355 \layout Standard
2356
2357 Las distintas organizaciones de archivos buscan aprovechar al máximo el
2358  espacio del archivo.
2359 \layout Standard
2360
2361 En este caso veremos que sucede luego de agregar y borrar una gran cantidad
2362  de registros del archivo, lo que provoca como consecuencia directa la fragmenta
2363 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
2364  produce un desperdicio de espacio.
2365 \layout Section
2366
2367 Organización Física
2368 \layout Standard
2369
2370 Esta organización guarda los registros pertenecientes al archivo en bloques
2371  de tamaño parametrizado, de modo que intentará guardar la mayor cantidad
2372  de registros que quepan en un bloque.
2373  
2374 \layout Standard
2375
2376 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
2377  del archivo.
2378 \layout Subsection
2379
2380 Comportamiento Particular de los Archivos Auxiliares
2381 \layout Subsubsection
2382
2383 Archivo de Bloques y Registros (.idx)
2384 \layout Comment
2385
2386 buscar algun caso extraordinario.
2387 \layout Subsubsection
2388
2389 Archivo de Bloques y Espacio Libre (.fsc)
2390 \layout Subsubsection
2391
2392 Archivo de Id`s Borrados (.did)
2393 \layout Standard
2394
2395 El comportamiento de este archivo, es común para todas las organizaciones
2396  y se ha explicado en 3.3.2.
2397 \layout Section
2398
2399 Funciones Principales
2400 \layout Subsection
2401
2402 EMUFS Tipo 3
2403 \layout Standard
2404
2405 Dento de 
2406 \emph on 
2407 tipo3.h
2408 \emph default 
2409  y 
2410 \emph on 
2411 tipo3.c
2412 \emph default 
2413  se encuentran las cabeceras y la implementación de las funciones principales
2414  respectivamente, las cuales dan funcionalidad a esta organización.
2415 \layout Standard
2416
2417 A continuación se comentará la descripción de algunas acciones importantes.
2418 \layout Subsubsection
2419
2420 Leer Registro
2421 \layout Standard
2422
2423 La lectura de un registro se realiza con la ayuda del archivo .
2424 \emph on 
2425 idx
2426 \emph default 
2427  el cual contiene la información de la posición del registro dentro del
2428  archivo de datos.
2429  Una vez leida esta información, se recupera el bloque (en su totalidad)
2430  del archivo y se busca secuencialmente el registro con el 
2431 \emph on 
2432 ID
2433 \emph default 
2434  especificado.
2435 \layout Standard
2436
2437 Ver: 
2438 \family typewriter 
2439 emufs_tipo3_leer_registro()
2440 \layout Subsubsection
2441
2442 Grabar Registro
2443 \layout Standard
2444
2445 Graba un registro en un bloque donde haya espacio suficiente, y si no crea
2446  un nuevo bloque y lo agrega al final del archivo.
2447 \layout Standard
2448
2449 Luego de grabar un registro, actualiza los archivos de índice .idx y .fsc
2450  para mantener la coherencia.
2451 \layout Standard
2452
2453 Ver: 
2454 \family typewriter 
2455 emufs_tipo3_grabar_registro()
2456 \layout Subsubsection
2457
2458 Borrar Registro
2459 \layout Standard
2460
2461 Borra un registro del archivo de datos, para esto levanta el bloque al que
2462  pertenece el archivo y ajusta los demás registros justificandolos hacia
2463  la izquierda.
2464 \layout Standard
2465
2466 Cabe destacar que para dar de baja un registro no hace falta borrarlo del
2467  archivo de datos, solo es necesario borrar las entradas en los archivos
2468  de índice, pero cuando se realiza el ajuste el algoritmo toma porciones
2469  del bloque del tamaño de un registro mas su encabezado - comenzando desde
2470  el siguiente al que fue borrado - y copia (sobreescribe) sobre el anterior.
2471  De esta manera, la información correspondiente al registro borrado no estará
2472  presente en el archivo de datos.
2473  Esto es una consecuencia del ajuste al borrar un registro, pudiendo no
2474  ser así, si no se realizara el mismo.
2475 \layout Subsubsection
2476
2477 Leer Estadísticas
2478 \layout Standard
2479
2480 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
2481  cantidad de bloques, cantidad de registros, espacio libre total, espacio
2482  libre promedio, espacio libre máximo y mínimo, etc.
2483 \layout Standard
2484
2485 Esta información es el resultado de ciertos cálculos realizados tanto en
2486  el archivo de datos como en los archivos índice.
2487 \layout Standard
2488
2489 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
2490  del archivo de datos, espacio libre total, cantidad de registros, cantidad
2491  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
2492  libres, etc.
2493 \layout Standard
2494
2495 Ver: 
2496 \family typewriter 
2497 emufs_tipo3_leer_estadisticas()
2498 \layout Subsubsection
2499
2500 Compactar el Archivo
2501 \layout Standard
2502
2503 Esta función intenta reorganizar el archivo de manera que el espacio libre
2504  sea lo menor posible, recordando siempre que un registro no puede ser almacenad
2505 o en mas de un bloque excepto que el tamaño del registro sea mayor que el
2506  del bloque.
2507 \layout Standard
2508
2509 Para realizar esto, se aprovecha la funcionalidad de 
2510 \emph on 
2511 emufs_tipo3_grabar_registro() 
2512 \emph default 
2513 ya que esta tiene la capacidad de determinar una posición mas eficiente
2514  en el archivo para un registro.
2515  Por esto lo que se hace es levantar uno por uno los registros y volverlos
2516  a grabar, de ese modo todos los 
2517 \emph on 
2518 gaps 
2519 \emph default 
2520 que pudieron haberse formado por la eliminación de registros serán cubiertos
2521  por otros.
2522 \layout Standard
2523
2524 Al estar utilizando recuperación de 
2525 \emph on 
2526 id`s
2527 \emph default 
2528  borrados, esto me asegura que el registro borrado-guardado conservará el
2529  id al grabarse.
2530 \layout Standard
2531
2532 Al finalizar este proceso se verifica si existen bloques vacios para truncar
2533  el archivo.
2534  Lo mismo se debe hacer con el archivo de espacios libres .
2535 \emph on 
2536 fsc 
2537 \emph default 
2538 el cual disminuye su tamaño también.
2539 \layout Standard
2540
2541 Ver: 
2542 \family typewriter 
2543 void emufs_tipo3_compactar()
2544 \layout Section
2545
2546 Consideraciones y Políticas de Diseño
2547 \layout Comment
2548
2549 Esto para mi va en organización física.
2550 \layout Standard
2551
2552 Se han tomado ciertas consideraciones para algunos casos particulares que
2553  se pueden presentar durante el uso/ejecución de la aplicación.
2554 \layout Enumerate
2555
2556 Cada registro tiene un encabezado que indica el 
2557 \emph on 
2558 id 
2559 \emph default 
2560 del mismo.
2561 \layout Enumerate
2562
2563 Si el tamaño del registro es mayor que el tamaño del bloque el registro
2564  se particionará en la cantidad de bloques que sea necesario, pero siempre
2565  se guardará desde el comienzo de un bloque, esto quiere decir que nunca
2566  se podrá encontrar un comienzo de registro en algún lugar de un bloque
2567  que no sea el comienzo del mismo.
2568 \layout Enumerate
2569
2570 Si el registro se divide en mas de un bloque, se le coloca el id como encabezado
2571  igualmente, pero en el archivo .
2572 \emph on 
2573 idx
2574 \emph default 
2575  solo se guarda el primer bloque.
2576  En el 
2577 \emph on 
2578 .fsc
2579 \emph default 
2580  se actualizan todos los bloques con el espacio libre que realmente tienen.
2581 \layout Chapter
2582
2583 Conclusiones
2584 \layout Standard
2585
2586 Las comparaciones, pruebas, etc...
2587 \the_end