]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - doc/informe.lyx
1084ef8357f3a9353f67bebcf67aff972ee24de0
[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 Standard
53
54 Se detallan a continuación los tipos de datos definidos y utilizados en
55  las distintas implementaciones que conforman nuestro sistema, siendo el
56  más importante de ellos, la estructura 
57 \family typewriter 
58 EMUFS
59 \family default 
60  que actúa como interfaz común para el manejo de cualquier tipo de archivo
61  (no importa que tipo de organización física posea un archivo, esta estructura
62  prooverá una interfaz (funciones) para su manejo).
63 \layout Subsection
64
65 EMUFS
66 \layout Standard
67
68
69 \family typewriter 
70 EMUFS
71 \family default 
72 \emph on 
73  
74 \emph default 
75 es la estuctura principal que encapsula todas las funciones para el manejo
76  de un archivo de datos.
77  Posee punteros a funciones que dependiendo de la organización fisica por
78  la cual se opte dentro del sistema, serán asignados de acorde.
79  
80 \layout Standard
81
82 Su declaración puede ser observada en el archivo 
83 \series bold 
84 emufs.h 
85 \series default 
86 y la misma cuenta con los siguiente campos:
87 \layout Itemize
88
89
90 \family typewriter 
91 EMUFS_Tipo
92 \family default 
93  que es un tipo enumerado que indica cual es la organización.
94 \layout Itemize
95
96
97 \family typewriter 
98 EMUFS_BLOCK_SIZE
99 \family default 
100  indica el tamaño del bloque para los tipos 1 y 3.
101 \layout Itemize
102
103
104 \family typewriter 
105 EMUFS_REG_SIZE
106 \family default 
107  indica el tamaño del registro, para el tipo 3 que posee tamaño constante.
108 \layout Itemize
109
110
111 \family typewriter 
112 void **leer_bloque() 
113 \family default 
114 puntero a la función para leer un bloque.
115 \layout Itemize
116
117
118 \family typewriter 
119 void *leer_bloque_raw()
120 \family default 
121  puntero a la función para leer un bloque, el anterior y el siguiente.
122 \layout Itemize
123
124
125 \family typewriter 
126 void **leer_registro()
127 \family default 
128  puntero a la función para leer un registro.
129 \layout Itemize
130
131
132 \family typewriter 
133 void **leer_registro_raw()
134 \family default 
135  puntero a la función para leer un registro con su encabezado.
136 \layout Itemize
137
138
139 \family typewriter 
140 EMUFS_REG_ID *grabar_registro()
141 \family default 
142  puntero a la función para grabar un registro.
143 \layout Itemize
144
145
146 \family typewriter 
147 EMUFS_REG_ID *modificar_registro() 
148 \family default 
149 puntero a la función para modificar un registro.
150 \layout Itemize
151
152
153 \family typewriter 
154 int *borrar_registro()
155 \family default 
156  puntero a la función para borrar un registro.
157 \layout Itemize
158
159
160 \family typewriter 
161 EMUFS_Estadisticas *leer_estadisticas()
162 \family default 
163  puntero a la función para cargar una estructura con las estadísticas.
164 \layout Itemize
165
166
167 \family typewriter 
168 void *compactar()
169 \family default 
170  puntero a la función para compactar un archivo.
171 \layout Itemize
172
173
174 \family typewriter 
175 char *nombre
176 \family default 
177  almacena el nombre del archivo sin extensión.
178 \layout Standard
179
180 Esta estructura define los valores de sus punteros según el tipo de organización
181  que se desee manejar y esto se realiza a través del API emufs, implementado
182  en 
183 \series bold 
184 emufs.c
185 \series default 
186 , que se describirá posteriormente.
187 \layout Standard
188
189 Por ejemplo si se desea crear un archivo de nombre 
190 \begin_inset Quotes eld
191 \end_inset 
192
193 facturas
194 \begin_inset Quotes erd
195 \end_inset 
196
197  organizado de la forma 3, se invoca a la función 
198 \family typewriter 
199 EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo,EMUFS_BLOCK_SIZE
200  tam_bloque, EMUFS_REG_SIZE tam_reg), 
201 \family default 
202 donde
203 \family typewriter 
204  filename 
205 \family default 
206 es el nombre que tendrán los archivos de datos e índice, 
207 \family typewriter 
208 tipo
209 \family default 
210  es el tipo de organización - bloques parametrizados y registros constantes
211  en este caso-, 
212 \family typewriter 
213 tam_bloque
214 \family default 
215  es el tamaño del bloque, y 
216 \family typewriter 
217 tam_reg
218 \family default 
219  es el tamaño del registro.
220 \layout Standard
221
222 Para las diferentes organizaciones puede ser que alguno de estos 2 últimos
223  valores no tengan sentido almacenarlas y tomaran un valor por defecto igual
224  a cero.
225 \layout Standard
226
227 Según el tipo de organización, se inicializan los punteros a las funciones.
228  Para el ejemplo 
229 \family typewriter 
230 leer_bloque
231 \family default 
232  se igualará a 
233 \family typewriter 
234 emufs_tipo3_leer_bloque()
235 \family default 
236 , y lo mismo sucede con los demás.
237 \layout Subsection
238
239 EMUFS_Tipo
240 \layout Standard
241
242
243 \family typewriter 
244 EMUFS_Tipo
245 \family default 
246  es un tipo de dato enum, el cual será utilizado en la cabecera de todo
247  archivo de datos (
248 \series bold 
249 .dat
250 \series default 
251 ), para indicar los distintos tipos de organización física.
252  Su declaración puede verse en el archivo 
253 \series bold 
254 emufs.h.
255 \layout Standard
256
257 A saberse los valores y significado correspondiente que puede tomar este
258  tipo de dato son:
259 \layout Enumerate
260
261 Archivos con registros de longitud variable y bloques parametrizables.
262 \layout Enumerate
263
264 Archivos con registros de longitud variable sin bloques.
265 \layout Enumerate
266
267 Archivos con registros de longitud fija y bloques parametrizables.
268 \layout Subsection
269
270 EMUFS_Estadisticas
271 \layout Standard
272
273
274 \family typewriter 
275 EMUFS_Estadisticas
276 \family default 
277  es una estructura que almacenará los datos pertinentes a las estadísticas
278  de un archivo dado, y será utilizada para visualizar dichas observaciones
279  a través de la GUI.
280 \layout Standard
281
282 Su declaración puede ser observada en el archivo 
283 \series bold 
284 emufs.h 
285 \series default 
286 y la misma cuenta con los siguiente campos:
287 \layout Itemize
288
289
290 \family typewriter 
291 unsigned long
292 \family default 
293  tam_archivo: indica el tamaño del archivo de datos (.dat) en bytes.
294 \layout Itemize
295
296
297 \family typewriter 
298 unsigned long
299 \family default 
300  tam_archivos_aux: indica el tamaño de los archivos auxiliares sumados en
301  bytes.
302 \layout Itemize
303
304
305 \family typewriter 
306 unsigned long
307 \family default 
308  tam_info_control_dat: indica la cantidad de bytes en información de control
309  utilizados para el archivo.
310 \layout Itemize
311
312
313 \family typewriter 
314 unsigned long
315 \family default 
316  media_fs: promedio de espacio libre en el archivo de datos (por bloque
317  o gap promedio segun la org)
318 \layout Itemize
319
320
321 \family typewriter 
322 unsigned long
323 \family default 
324  total_fs: total de espacio libre en el archivo de datos.
325 \layout Itemize
326
327
328 \family typewriter 
329 unsigned long
330 \family default 
331  max_fs: máximo espacio libre en el archivo de datos (en un bloque o máximo
332  gap segun la org).
333 \layout Itemize
334
335
336 \family typewriter 
337 unsigned long
338 \family default 
339  min_fs: idem pero mínimo.
340 \layout Itemize
341
342
343 \family typewriter 
344 unsigned long
345 \family default 
346  cant_bloques: cantidad de bloques en el archivo de datos (.
347 \series bold 
348 dat
349 \series default 
350 )
351 \layout Itemize
352
353
354 \family typewriter 
355 unsigned long
356 \family default 
357  cant_registros: cantidad de registros en el archivo de datos (
358 \series bold 
359 .dat
360 \series default 
361 )
362 \layout Standard
363
364 En base a la estructura descripta anteriormente y mediante la utilización
365  de la función 
366 \family typewriter 
367 emufs_leer_estadisticas()
368 \family default 
369  disponible en la estructura común 
370 \family typewriter 
371 EMUFS
372 \family default 
373  handler de cualquier tipo de archivo, podremos obtener una serie de estadística
374 s que pasamos a detallar (más alla de los datos básicos como cant registros,
375  cant bloques, tam archivo, etc):
376 \layout Itemize
377
378 Relación entre espacio libre y el tamaño del archivo de datos (
379 \series bold 
380 .dat
381 \series default 
382 )
383 \layout Itemize
384
385 Relación entre el espacio ocupado por información de control y el tamaño
386  del archivo de datos (
387 \series bold 
388 .dat
389 \series default 
390 )
391 \layout Itemize
392
393 Cantidad promedio de espacio libre (en bloque o gap promedio)
394 \layout Itemize
395
396 Desviaciones extremas de espacio libre (máximo/mínimo espacio libre en bloque
397  o mayor/menor gap)
398 \layout Subsection
399
400 Tipos Comunes
401 \layout Standard
402
403 En la implementación de cada tipo de organización física, así como tambien
404  en las API de los archivos auxiliares comunes a ellas, se da la utilización
405  de tipo definidos para una clara interfaz entre las mismas, los cuales
406  son brevemente descriptos a continuación y pueden ser hallados en el archivo
407  
408 \series bold 
409 emufs.h
410 \series default 
411 :
412 \layout Itemize
413
414
415 \family typewriter 
416 EMUFS_REG_ID
417 \family default 
418 : usado para representar un 
419 \emph on 
420 Id
421 \emph default 
422  de un registro.
423 \layout Itemize
424
425
426 \family typewriter 
427 EMUFS_REG_SIZE
428 \family default 
429 : usado para representar el tamaño en bytes de un registro.
430 \layout Itemize
431
432
433 \family typewriter 
434 EMUFS_BLOCK_ID
435 \family default 
436 : usado para representar un número de bloque.
437 \layout Itemize
438
439
440 \family typewriter 
441 EMUFS_BLOCK_SIZE
442 \family default 
443 : usado para representar el tamaño en bytes de un bloque.
444 \layout Itemize
445
446
447 \family typewriter 
448 EMUFS_FREE
449 \family default 
450 : usado para representar espacio libre en bytes.
451 \layout Itemize
452
453
454 \family typewriter 
455 EMUFS_OFFSET
456 \family default 
457 : usado para representar un offset.
458 \layout Standard
459
460 Todos son del tipo 
461 \family typewriter 
462 unsigned long
463 \family default 
464 .
465 \layout Section
466
467
468 \begin_inset LatexCommand \label{sec:cabecera_gral}
469
470 \end_inset 
471
472 Organización física general de un archivo E
473 \begin_inset Formula $\mu$
474 \end_inset 
475
476 FS
477 \layout Standard
478
479 Todo archivo E
480 \begin_inset Formula $\mu$
481 \end_inset 
482
483 FS está compuesto por 4 archivos a nivel de sistema operativo: archivo de
484  datos (con 3 formatos posibles, ver páginas 
485 \begin_inset LatexCommand \pageref{cha:tipo1}
486
487 \end_inset 
488
489
490 \begin_inset LatexCommand \pageref{cha:tipo2}
491
492 \end_inset 
493
494  y 
495 \begin_inset LatexCommand \pageref{cha:tipo3}
496
497 \end_inset 
498
499 ), archivo de índice (ver página 
500 \begin_inset LatexCommand \pageref{sec:idx}
501
502 \end_inset 
503
504 ), archivo de control de espacio libre (ver página 
505 \begin_inset LatexCommand \pageref{sec:fsc}
506
507 \end_inset 
508
509 ) y archivo de índices recuperables (ver página 
510 \begin_inset LatexCommand \pageref{sec:did}
511
512 \end_inset 
513
514 ).
515 \layout Standard
516
517 El archivo de datos está compuesto por:
518 \layout Itemize
519
520 Una 
521 \emph on 
522 cabecera general
523 \emph default 
524  compuesta por un 
525 \family typewriter 
526 int
527 \family default 
528  (4 bytes en plataformas Linux de 32 bits) que representa el tipo de archivo.
529 \layout Itemize
530
531 Datos dependientes del tipo de archivo.
532 \layout Standard
533
534 La 
535 \emph on 
536 cabecera general
537 \emph default 
538  es utilizada para poder detectar el formato de un archivo al abrirlo.
539  Los datos dependientes del tipo de archivo serán explicados en sus secciones
540  correspondientes.
541 \layout LyX-Code
542
543 archivo
544 \layout LyX-Code
545
546 +-----------+--------------------------------------------//-+
547 \layout LyX-Code
548
549 |    tipo   | Datos dependientes del tipo de archivo ...
550  
551 \backslash 
552
553 \backslash 
554  |
555 \layout LyX-Code
556
557 +-----------+--------------------------------------------//-+
558 \layout LyX-Code
559
560 /- 4 bytes -/
561 \layout Chapter
562
563 Archivos Auxiliares
564 \layout Standard
565
566 Acompañando al archivo de datos (
567 \series bold 
568 .dat
569 \series default 
570 ) el cual es responsable de la contención de los registros, tendremos tres
571  archivos auxiliares (
572 \series bold 
573 .idx
574 \series default 
575
576 \series bold 
577 .fsc
578 \series default 
579  y 
580 \series bold 
581 .did
582 \series default 
583 ) cuya funcionalidad y propósito pasamos a describir a continuación, sin
584  antes remarcar que los tres archivos poseen una sola implementación para
585  las distintas formas de organización física que hemos implementado (tres
586  para ser mas exactos).
587 \layout Standard
588
589 Entre las ventajas de poseer la misma implementación se encuentra el tener
590  un API común entre los tres tipos para el manejo de la localización de
591  sus registros, administración de espacio libre e Id's liberados, sin necesidad
592  de realizar n-implementaciones para un mismo objetivo final.
593 \layout Standard
594
595 Además, la obtención de ciertos datos estadísticos como espacio libre, o
596  cantidad de registros, se realiza a través de la misma interfaz, y también
597  se ha facilitado en cierto grado la re-organización física de un archivo
598  (pasar de un tipo a otro), dado el uso de estos tres archivos auxiliares
599  en común para funciones tan predominantes como índexación, administración
600  de espacio libre y recuperación de Id's.
601 \layout Section
602
603
604 \begin_inset LatexCommand \label{sec:idx}
605
606 \end_inset 
607
608 Archivo índice
609 \layout Standard
610
611 El archivo índice (.idx), permite la localización de los registros en el
612  .DAT de forma directa, mediante la obtención de su offset respecto del inicio
613  del .dat, o nro bloque (segun el tipo de organización física) en donde se
614  encuentra un registro dado, indicado por su 
615 \emph on 
616 id_reg.
617 \layout Standard
618
619 Los registros de este archivo se encuentran representados una estructura
620  que indica un número de registro y el bloque u offset en donde se encuentra
621  el mísmo.
622 \layout Standard
623
624 Es necesario que este archivo esté ordenado por 
625 \emph on 
626 id_reg
627 \emph default 
628 , ya que esto permitirá el acceso directo al mismo, para la rápida obtención
629  del nro de bloque u offset y posterior búsqueda de un registro en el archivo
630  de datos.
631 \layout Subsection
632
633 Organización física
634 \layout Standard
635
636 Los registros de este archivo se encuentran representados a nivel codigo
637  por el siguiente tipo de dato interno (
638 \family typewriter 
639 EMUFS_IDX
640 \family default 
641 ):
642 \layout LyX-Code
643
644 typedef unsigned long EMUFS_REG_ID;
645 \layout LyX-Code
646
647 typedef unsigned long EMUFS_OFFSET;
648 \layout LyX-Code
649
650 typedef struct emufs_idx_t { 
651 \layout LyX-Code
652
653   EMUFS_REG_ID id_reg;
654 \layout LyX-Code
655
656   EMUFS_OFFSET location;
657 \layout LyX-Code
658
659 } EMUFS_IDX;
660 \layout Standard
661
662
663 \begin_inset Float table
664 placement H
665 wide false
666 collapsed true
667
668 \layout Caption
669
670 Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
671  Tipo 1 y 3
672 \layout Standard
673
674
675 \begin_inset  Tabular
676 <lyxtabular version="3" rows="2" columns="3">
677 <features>
678 <column alignment="center" valignment="top" leftline="true" width="0">
679 <column alignment="center" valignment="top" leftline="true" width="0">
680 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
681 <row topline="true" bottomline="true">
682 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
683 \begin_inset Text
684
685 \layout Standard
686
687 id_reg
688 \end_inset 
689 </cell>
690 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
691 \begin_inset Text
692
693 \layout Standard
694
695 nro_bloque
696 \end_inset 
697 </cell>
698 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
699 \begin_inset Text
700
701 \layout Standard
702
703 \end_inset 
704 </cell>
705 </row>
706 <row topline="true" bottomline="true">
707 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
708 \begin_inset Text
709
710 \layout Standard
711
712 5
713 \end_inset 
714 </cell>
715 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
716 \begin_inset Text
717
718 \layout Standard
719
720 54
721 \end_inset 
722 </cell>
723 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
724 \begin_inset Text
725
726 \layout Standard
727
728 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
729 \end_inset 
730 </cell>
731 </row>
732 </lyxtabular>
733
734 \end_inset 
735
736
737 \end_inset 
738
739  
740 \begin_inset Float table
741 placement H
742 wide false
743 collapsed true
744
745 \layout Caption
746
747 Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
748  Tipo 2
749 \layout Standard
750
751
752 \begin_inset  Tabular
753 <lyxtabular version="3" rows="2" columns="3">
754 <features>
755 <column alignment="center" valignment="top" leftline="true" width="0">
756 <column alignment="center" valignment="top" leftline="true" width="0">
757 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
758 <row topline="true" bottomline="true">
759 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
760 \begin_inset Text
761
762 \layout Standard
763
764 id_reg
765 \end_inset 
766 </cell>
767 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
768 \begin_inset Text
769
770 \layout Standard
771
772 nro_bloque
773 \end_inset 
774 </cell>
775 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
776 \begin_inset Text
777
778 \layout Standard
779
780 \end_inset 
781 </cell>
782 </row>
783 <row topline="true" bottomline="true">
784 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
785 \begin_inset Text
786
787 \layout Standard
788
789 5
790 \end_inset 
791 </cell>
792 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
793 \begin_inset Text
794
795 \layout Standard
796
797 54
798 \end_inset 
799 </cell>
800 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
801 \begin_inset Text
802
803 \layout Standard
804
805 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
806 \end_inset 
807 </cell>
808 </row>
809 </lyxtabular>
810
811 \end_inset 
812
813
814 \end_inset 
815
816
817 \layout Standard
818
819
820 \series bold 
821 \emph on 
822 Nota: 
823 \series default 
824 \emph default 
825 Como se puede observar, para distintas organizaciones el significado de
826  los registros en este archivo es diferente y se utilizará de distinta manera
827  en consecuencia.
828 \layout Subsection
829
830 Comportamiento
831 \layout Standard
832
833 Las declaraciones e implementación se pueden encontrar en 
834 \series bold 
835 \emph on 
836 idx.h
837 \series default 
838 \emph default 
839  y 
840 \series bold 
841 \emph on 
842 idx.c
843 \series default 
844 \emph default 
845  respectivamente:
846 \layout List
847 \labelwidthstring 00.00.0000
848
849
850 \series bold 
851 \emph on 
852 Búsqueda:
853 \series default 
854 \emph default 
855  Los registros del archivo indice (
856 \series bold 
857 .idx
858 \series default 
859 ), poseen una correspondencia 1 a 1, con los Id's de los registros en el
860  archivo de datos (
861 \series bold 
862 .dat
863 \series default 
864 ).
865  Con esto, queremos decir que el N-ésimo registro del archivo índice, será
866  aquél que posea la información para localizar al registro cuyo 
867 \family typewriter 
868 id_reg
869 \family default 
870  es N, dentro del archivo de datos (
871 \series bold 
872 .dat
873 \series default 
874 ).
875 \newline 
876
877 \series bold 
878 NOTA:
879 \series default 
880  Cabe aclarar que por si bien el indice se encuentra ordenado por 
881 \family typewriter 
882 id_reg
883 \family default 
884 , los registros en el archivo de datos, por lo general no lo estarán.
885  (ordenados por id).
886  
887 \newline 
888 Ver: 
889 \family typewriter 
890 emufs_idx_buscar_registro()
891 \layout List
892 \labelwidthstring 00.00.0000
893
894
895 \series bold 
896 Alta:
897 \series default 
898  Ante la alta de un registro en el archivo de datos, se insetará un nuevo
899  registro en el archivo índice, con el id_reg del registro en cuestion,
900  y el offset u bloque donde se lo haya grabado en disco.
901 \newline 
902 Ver: 
903 \family typewriter 
904 emufs_idx_agregar()
905 \layout List
906 \labelwidthstring 00.00.0000
907
908
909 \series bold 
910 Baja:
911 \series default 
912  Ante el borrado de un registro del archivo de datos, se accederá el registro
913  correspondiente en el índice, y se actualizara su LOCATION, estableciendolo
914  en el valor -1 UL, el cual indica que ese registro ha sido eliminado y
915  por ende no se lo podrá localizar en el futuro.
916  Como se verá mas adelante, según el tipo de organización física, el registro
917  puede ser borrado concretamente del .
918 \series bold 
919 dat
920 \series default 
921  o nó.
922  
923 \newline 
924 Ver: 
925 \family typewriter 
926 emufs_idx_borrar()
927 \layout List
928 \labelwidthstring 00.00.0000
929
930
931 \series bold 
932 Modificación:
933 \series default 
934  Ante la modificación en la posición física de un registro dentro del archivo
935  de datos (por ejemplo luego del proceso de recompactación, se realizará
936  la modificación respectiva del campo 
937 \family typewriter 
938 location
939 \family default 
940 .
941 \newline 
942 Ver: 
943 \family typewriter 
944 emufs_idx_actualizar()
945 \layout Section
946
947
948 \begin_inset LatexCommand \label{sec:fsc}
949
950 \end_inset 
951
952 Archivo de control de espacio libre
953 \layout Standard
954
955 El archivo de espacio libre (
956 \series bold 
957 .fsc
958 \series default 
959 ) (espacio por bloque o gaps en archivo, según el tipo de organización física),
960  tiene como función la administración del espacio libre, generado por previas
961  eliminaciones de registros en el archivo de datos.
962  El mismo, nos indicará donde hay lugar para insertar un nuevo registro.
963 \layout Standard
964
965 Para el caso de una organización por bloque, nos dirá en que bloque o si
966  se debe generar un nuevo bloque.
967  En el caso de la organización sin bloques, nos indicará en que gap o si
968  al final del archivo.
969 \layout Standard
970
971 Los registros de este archivo se encuentran representados una estructura
972  que indica un número de bloque u offset y el espacio libre disponible en
973  el mismo (o apartir del mismo en el caso del offset).
974 \layout Standard
975
976
977 \series bold 
978 Nota
979 \series default 
980 : Por requerimiento del algoritmo de compactación el tipo de organización
981  física con reg long var, sin bloques, los gaps se graban en forma ordenada
982  en el (.fsc).
983  (El orden se corresponde con lo que hay en el .dat).
984 \layout Subsection
985
986 Organización Física
987 \layout Standard
988
989 Los registros de este archivo se encuentran representados a nivel codigo
990  por el siguiente tipo de dato interno (
991 \family typewriter 
992 EMUFS_FSC
993 \family default 
994 ):
995 \layout LyX-Code
996
997 typedef struct emufs_fsc_t { 
998 \layout LyX-Code
999
1000   unsigned long int marker;
1001 \layout LyX-Code
1002
1003   unsigned long int freespace;
1004 \layout LyX-Code
1005
1006 } EMUFS_FSC;
1007 \layout Standard
1008
1009
1010 \series bold 
1011 \emph on 
1012
1013 \begin_inset Float table
1014 placement H
1015 wide false
1016 collapsed true
1017
1018 \layout Caption
1019
1020 Ejemplo de registro en archivo de control de espacio libre para un archivo
1021  con bloques
1022 \layout Standard
1023
1024
1025 \begin_inset  Tabular
1026 <lyxtabular version="3" rows="2" columns="3">
1027 <features>
1028 <column alignment="center" valignment="top" leftline="true" width="0">
1029 <column alignment="center" valignment="top" leftline="true" width="0">
1030 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1031 <row topline="true" bottomline="true">
1032 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1033 \begin_inset Text
1034
1035 \layout Standard
1036
1037 nro_bloque
1038 \end_inset 
1039 </cell>
1040 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1041 \begin_inset Text
1042
1043 \layout Standard
1044
1045 freespace
1046 \end_inset 
1047 </cell>
1048 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1049 \begin_inset Text
1050
1051 \layout Standard
1052
1053 \end_inset 
1054 </cell>
1055 </row>
1056 <row topline="true" bottomline="true">
1057 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1058 \begin_inset Text
1059
1060 \layout Standard
1061
1062 12
1063 \end_inset 
1064 </cell>
1065 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1066 \begin_inset Text
1067
1068 \layout Standard
1069
1070 120
1071 \end_inset 
1072 </cell>
1073 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1074 \begin_inset Text
1075
1076 \layout Standard
1077
1078 Indica que en el bloque 12, hay 120 bytes libres al final del mismo.
1079 \end_inset 
1080 </cell>
1081 </row>
1082 </lyxtabular>
1083
1084 \end_inset 
1085
1086
1087 \end_inset 
1088
1089  
1090 \begin_inset Float table
1091 placement H
1092 wide false
1093 collapsed true
1094
1095 \layout Caption
1096
1097 Ejemplo de registro en archivo de 
1098 \emph on 
1099 gaps
1100 \emph default 
1101  para un archivo sin bloques
1102 \layout Standard
1103
1104
1105 \begin_inset  Tabular
1106 <lyxtabular version="3" rows="2" columns="3">
1107 <features>
1108 <column alignment="center" valignment="top" leftline="true" width="0">
1109 <column alignment="center" valignment="top" leftline="true" width="0">
1110 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1111 <row topline="true" bottomline="true">
1112 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1113 \begin_inset Text
1114
1115 \layout Standard
1116
1117 offset
1118 \end_inset 
1119 </cell>
1120 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1121 \begin_inset Text
1122
1123 \layout Standard
1124
1125 freespace
1126 \end_inset 
1127 </cell>
1128 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1129 \begin_inset Text
1130
1131 \layout Standard
1132
1133 \end_inset 
1134 </cell>
1135 </row>
1136 <row topline="true" bottomline="true">
1137 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1138 \begin_inset Text
1139
1140 \layout Standard
1141
1142 12
1143 \end_inset 
1144 </cell>
1145 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1146 \begin_inset Text
1147
1148 \layout Standard
1149
1150 120
1151 \end_inset 
1152 </cell>
1153 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1154 \begin_inset Text
1155
1156 \layout Standard
1157
1158 Indica que a partir del byte 12 del archivo de datos, hay 120 bytes libres.
1159 \end_inset 
1160 </cell>
1161 </row>
1162 </lyxtabular>
1163
1164 \end_inset 
1165
1166
1167 \end_inset 
1168
1169
1170 \layout Standard
1171
1172
1173 \series bold 
1174 \emph on 
1175 Nota: 
1176 \series default 
1177 \emph default 
1178 Como se puede observar, para distintas organizaciones el significado de
1179  los registros en este archivo es diferente y se utilizará de distinta manera
1180  en consecuencia.
1181 \layout Subsection
1182
1183 Funciones principales
1184 \layout Standard
1185
1186 Las declaraciones e implementación se pueden encontrar en 
1187 \series bold 
1188 \emph on 
1189 fsc.h
1190 \series default 
1191 \emph default 
1192  y 
1193 \series bold 
1194 \emph on 
1195 fsc.c
1196 \series default 
1197 \emph default 
1198  respectivamente:
1199 \layout List
1200 \labelwidthstring 00.00.0000
1201
1202
1203 \series bold 
1204 Búsqueda:
1205 \series default 
1206  Ante la operación de alta de un registro en el archivo de datos, se realizará
1207  la búsqueda de espacio libre donde este podrá ser insertado.
1208  En el caso de organizaciones con bloques, se buscará en que 
1209 \family typewriter 
1210 nro_bloque
1211 \family default 
1212  se posee espacio suficiente para albergar el nuevo registro.
1213  En el caso de organizacion sin bloque, se buscará un gap o espacio libre
1214  en el archivo, obteniéndose en consecuencia, el 
1215 \family typewriter 
1216 offset
1217 \family default 
1218  hasta el mismo.
1219 \newline 
1220 Ver: 
1221 \family typewriter 
1222 emufs_fsc_buscar_lugar()
1223 \layout List
1224 \labelwidthstring 00.00.0000
1225
1226
1227 \series bold 
1228 Alta/Mod:
1229 \series default 
1230  Luego de una operación de baja o alta de un registro en el archivo de datos
1231  (
1232 \series bold 
1233 .dat
1234 \series default 
1235 ), incrementará o decrementará respectivamente el espacio libre en el archivo
1236  de datos, y esto deberá ser registrado, agregando un nuevo registro en
1237  el archivo de espacios libres (
1238 \series bold 
1239 .fsc
1240 \series default 
1241 ) o bien modificandoló.
1242 \newline 
1243
1244 \newline 
1245 En el caso de organizaciónes con bloques, se actualizará el valor del espacio
1246  libre 
1247 \family typewriter 
1248 freespace
1249 \family default 
1250  en el bloque (ya sea incrementandoló o decrementandoló) o bien se insertará
1251  un nuevo registro en caso de que se esté creando un nuevo bloque en el
1252  archivo de datos (en este caso no será debido a un alta o baja de registro
1253  como se mencionó al principio).
1254 \newline 
1255
1256 \newline 
1257 Para el caso de organización sin bloques, en el caso de baja de un registro
1258  de datos (
1259 \series bold 
1260 .dat
1261 \series default 
1262 ) se insertará un nuevo registro en el 
1263 \series bold 
1264 .fsc
1265 \series default 
1266  dando cuenta de la aparición de un nuevo gap en el archivo de datos (
1267 \series bold 
1268 .dat
1269 \series default 
1270 ), y en caso de estar este lindante con otro gap, se realizará el merge
1271  pertinente.
1272  (esto esta explicado más en profundidad en los casos particulares de organizaci
1273 ón fisica, registros variables sin bloques).
1274  Para el caso de una alta en el archivo de datos (
1275 \series bold 
1276 .dat
1277 \series default 
1278 ), el valor del gap donde se haya insertado se actualizará.
1279  
1280 \newline 
1281 Ver: 
1282 \family typewriter 
1283 emufs_fsc_agregar(), emufs_fsc_agregar_gap(), emufs_fsc_actualizar(), emufs_fsc_
1284 actualizar_gap().
1285 \layout List
1286 \labelwidthstring 00.00.0000
1287
1288
1289 \series bold 
1290 Baja
1291 \series default 
1292 : Unicamente para el caso de una organización que presente gaps en el archivo,
1293  se podrá dar a lugar la eliminación de un registro del archivo de espacios
1294  libres (
1295 \series bold 
1296 .fsc)
1297 \series default 
1298 .
1299  Esta situación tendrá efecto cuando se inserte un registro que entre perfecto
1300  en un gap disponible, y por ende el gap desaparecerá.
1301 \newline 
1302 Ver: 
1303 \family typewriter 
1304 emufs_fsc_borrar_gap()
1305 \layout Section
1306
1307
1308 \begin_inset LatexCommand \label{sec:did}
1309
1310 \end_inset 
1311
1312 Archivo de id's recuperables
1313 \layout Standard
1314
1315 El archivo de Id's liberado (
1316 \series bold 
1317 .did
1318 \series default 
1319 ) llevará cuenta de aquellos Id's de registros (
1320 \family typewriter 
1321 id_reg
1322 \family default 
1323 ) que ya no se encuentran siendo utilizados y fueron liberados por registros
1324  eliminados previamente.
1325  A través del mismo, se podrá realizar la reutilización de Id's ante la
1326  alta de nuevos registros.
1327 \layout Standard
1328
1329 A nivel físico, este archivo poseerá una secuencia de datos del tipo EMUFS_REG_I
1330 D, y el comportamiento del sistema de recuperación de Id's será el de una
1331  pila.
1332  Es decir, ante el requerimiento de un 
1333 \family typewriter 
1334 reg_id
1335 \family default 
1336  libre por una función del sistema como por ejemplo la alta de un nuevo
1337  registro, el API del archivo (
1338 \series bold 
1339 .did
1340 \series default 
1341 ), obtendrá el último dato del mismo (el 
1342 \emph on 
1343 Id
1344 \emph default 
1345  que fue liberado mas recientemente), y truncará el archivo eliminando el
1346  
1347 \emph on 
1348 Id
1349 \emph default 
1350  recuperado de la tabla.
1351  (LIFO, Last in First Out).
1352 \layout Subsection
1353
1354 Organización Física
1355 \layout Standard
1356
1357 Este archivo tiene registros de un solo campo, 
1358 \family typewriter 
1359 EMUFS_REG_ID
1360 \family default 
1361  el cual simboliza al id que fue liberado en un proceso de baja de registros.
1362 \layout Subsection
1363
1364 Funciones principales
1365 \layout Standard
1366
1367 Las declaraciones e implementación se pueden encontrar en 
1368 \series bold 
1369 \emph on 
1370 did.h
1371 \series default 
1372 \emph default 
1373  y 
1374 \series bold 
1375 \emph on 
1376 did.c
1377 \series default 
1378 \emph default 
1379  respectivamente
1380 \layout List
1381 \labelwidthstring 00.00.0000
1382
1383
1384 \series bold 
1385 Alta: 
1386 \series default 
1387 Ante la eliminación de un registro del archivo de datos (
1388 \series bold 
1389 .dat
1390 \series default 
1391 ) se procederá al agregado del correspondiente 
1392 \family typewriter 
1393 id_reg
1394 \family default 
1395  que fue liberado por dicha operación, al archivo 
1396 \series bold 
1397 .did
1398 \series default 
1399 .
1400 \family typewriter 
1401
1402 \newline 
1403
1404 \family default 
1405 Ver: 
1406 \family typewriter 
1407 emufs_did_agregar()
1408 \layout List
1409 \labelwidthstring 00.00.0000
1410
1411
1412 \series bold 
1413 Baja
1414 \series default 
1415  Cuando el sistema desee grabar un nuevo registro en el archivo de datos,
1416  este pedirá un 
1417 \family typewriter 
1418 id_reg
1419 \family default 
1420  disponible para el mismo.
1421  El sistema de administración de Id's libres, obtendrá el último 
1422 \emph on 
1423 id
1424 \emph default 
1425  que se guardó en el archivo (o se eliminó del archivo de datos), y truncará
1426  el archivo eliminandolo.
1427 \family typewriter 
1428
1429 \newline 
1430
1431 \family default 
1432 Ver: 
1433 \family typewriter 
1434 emufs_did_get_last()
1435 \layout Chapter
1436
1437
1438 \begin_inset LatexCommand \label{cha:tipo1}
1439
1440 \end_inset 
1441
1442 Archivo con bloques parametrizados y registros de longitud variable
1443 \layout Standard
1444
1445 Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
1446  intermedio entre el 
1447 \begin_inset LatexCommand \ref{cha:tipo2}
1448
1449 \end_inset 
1450
1451  y el 
1452 \begin_inset LatexCommand \ref{cha:tipo3}
1453
1454 \end_inset 
1455
1456  (cuenta tanto con bloques como con registros variables), hereda los inconvenien
1457 tes (y ventajas) de ambos, más los propios.
1458  Al implementar este tipo de archivo se puso enfásis en la eficiencia mientras
1459  esta no comprometa la mantenibilidad del código, es por esto que en algunas
1460  circunstancias no se hace un uso óptimo del espacio.
1461 \layout Standard
1462
1463 La implementación de este tipo de archivo puede ser encontrada en 
1464 \family typewriter 
1465 emufs/tipo1.c
1466 \family default 
1467  mientras que su interfaz pública está disponible en 
1468 \family typewriter 
1469 emufs/tipo1.h
1470 \family default 
1471 .
1472 \layout Section
1473
1474 Organización física
1475 \layout Standard
1476
1477 El archivo está compuesto por la 
1478 \emph on 
1479 cabecera general
1480 \emph default 
1481  (ver página 
1482 \begin_inset LatexCommand \pageref{sec:cabecera_gral}
1483
1484 \end_inset 
1485
1486 ).
1487  El valor que toma en este tipo de archivo es 0 (o el valor simbólico 
1488 \family typewriter 
1489 T1
1490 \family default 
1491  del tipo 
1492 \family typewriter 
1493 EMUFS_Tipo
1494 \family default 
1495 ).
1496  Luego le sigue una cabecera propia del archivo (un 
1497 \family typewriter 
1498 EMUFS_BLOCK_SIZE
1499 \family default 
1500 , 4 bytes) que almacena el tamaño del bloque que usa el archivo.
1501  De esta menera, al abrir un archivo de este tipo no se necesita tener ninguna
1502  información sobre él.
1503  A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
1504  en la cabecera antes mencionada.
1505 \layout LyX-Code
1506
1507 archivo
1508 \layout LyX-Code
1509
1510 +-----------+-----------+------------------------//-+
1511 \layout LyX-Code
1512
1513 |    tipo   | tam bloque| Cero o más bloques ...
1514  
1515 \backslash 
1516
1517 \backslash 
1518  |
1519 \layout LyX-Code
1520
1521 +-----------+-----------+------------------------//-+
1522 \layout LyX-Code
1523
1524 /- 4 bytes -/- 4 bytes -/
1525 \layout Subsection
1526
1527 Organización física de un bloque
1528 \layout Standard
1529
1530 Cada bloque no guarda información en sí, sólo se comporta como un contenedor
1531  de registros.
1532  Esto no significa que un bloque no tenga utilidad, el bloque es utilizado
1533  para proveer un acceso semi-aleatorio a los registros.
1534  Para esto se utiliza el archivo de índice (ver página 
1535 \begin_inset LatexCommand \ref{sec:idx}
1536
1537 \end_inset 
1538
1539 ), que almacena pares [identificador de registro, número de bloque].
1540  Para que sea suficiente este único índice para hallar un registro (siendo
1541  que puede haber más de un registro por bloque), es necesario 
1542 \emph on 
1543 alinear los registros a izquierda
1544 \emph default 
1545 .
1546  Esto significa que hay que asegurar que siempre los registros en un bloque
1547  se presenten de forma consecutiva, jamás permitiendo que haya un espacio
1548  libre entre registros (en un mismo bloque).
1549 \layout Standard
1550
1551 Podemos ver un ejemplo de esto en forma gráfica:
1552 \layout LyX-Code
1553
1554 bloque N-1 | bloque N                                | bloque N+1
1555 \layout LyX-Code
1556
1557 /----------+------------+------------+---------------+-----------/
1558 \layout LyX-Code
1559
1560
1561 \backslash 
1562           | registro 1 | registro 2 | espacio libre |           
1563 \backslash 
1564
1565 \layout LyX-Code
1566
1567 /----------+------------+------------+---------------+-----------/
1568 \layout LyX-Code
1569
1570            /------------- tamaño del bloque ---------/
1571 \layout Standard
1572
1573 De esta forma, una vez obtenido el número de bloque, se pueda recorrer secuencia
1574 lmente hasta encontrar el registro deseado.
1575  A fin de llevar el conteo de espacio libre se utiliza el archivo de control
1576  de espacio libre (ver página 
1577 \begin_inset LatexCommand \ref{sec:fsc}
1578
1579 \end_inset 
1580
1581 ), de forma tal que no sea necesario recorrer secuencialmente en busca de
1582  espacio libre al hacer una inserción.
1583 \layout Standard
1584
1585 Puede darse un caso excepcional en el que un registro sea más grande que
1586  un bloque, en este caso el registro se almacenará en N bloques consecutivos
1587  (siendo N la cantidad de bloques que necesita el registro), ocupando completos
1588  los todos los bloques a excepción del último, en el que posteriormente
1589  se pueden agregar más registros.
1590 \layout Subsubsection
1591
1592
1593 \begin_inset LatexCommand \label{sub:tipo1_reg}
1594
1595 \end_inset 
1596
1597 Organización física de un registro.
1598 \layout Standard
1599
1600 El registro es el que representa al dato realmente que se quiere almacenar.
1601  Para representar ese dato se necesita una determinada información de control,
1602  tanto para poder identificar el registro en un bloque (en búsquedas secuenciale
1603 s dentro del bloque) como para saber su longitud (dado que este tipo de
1604  archivo utiliza registros de tamaño variable).
1605 \layout Standard
1606
1607 Siguiendo la metodología general de E
1608 \begin_inset Formula $\mu$
1609 \end_inset 
1610
1611 FS, se optó por incluir esta información de control como una cabecera al
1612  comienzo del registro, siguiendo a esta los datos en sí.
1613  La cabecera está compuesta por un identificador (
1614 \family typewriter 
1615 id
1616 \family default 
1617 ) de registro (EMUFS_REG_ID, 4 bytes) seguido por el tamaño (
1618 \family typewriter 
1619 tamaño
1620 \family default 
1621 ) del registros (EMUFS_REG_SIZE, 4 bytes).
1622  Podemos ver gráficamente como se se compone un registro:
1623 \layout LyX-Code
1624
1625 registro id
1626 \layout LyX-Code
1627
1628 +-----------+-----------+------------------+
1629 \layout LyX-Code
1630
1631 |     id    |   tamaño  |   datos ...
1632       |
1633 \layout LyX-Code
1634
1635 +-----------+-----------+------------------+
1636 \layout LyX-Code
1637
1638 /- 4 bytes -/- 4 bytes -/- [tamaño] bytes -/
1639 \layout Subsubsection
1640
1641
1642 \begin_inset LatexCommand \label{sub:tipo1_reg_multi}
1643
1644 \end_inset 
1645
1646 Organización física de un registro más grande que un bloque (registro 
1647 \emph on 
1648 multibloque
1649 \emph default 
1650 ).
1651 \layout Standard
1652
1653 Puede darse el caso excepcional en que un registro sea de mayor longitud
1654  que un bloque.
1655  Al ser una situación excepcional, no siempre se resuelve de la forma más
1656  eficiente ni se mínimiza el espacio ocupado por datos de control (como
1657  se dijo anteriormente, se prefirió conservar la simpleza del código, adoptando
1658  algoritmos generales aunque no sea de la forma más eficiente o maximizando
1659  el uso del espacio para no perjudicar la mantenibilidad).
1660 \layout Standard
1661
1662 Para menejar un registro 
1663 \emph on 
1664 multibloque 
1665 \emph default 
1666 se optó por limitarlo a la siguiente estructura (suponiendo que el registro
1667  ocupa N bloques, con N > 1 y que un 
1668 \emph on 
1669 fragmento
1670 \emph default 
1671  es una porción del registro que entra en un bloque):
1672 \layout Itemize
1673
1674 Los primeros N-1 
1675 \emph on 
1676 fragmentos
1677 \emph default 
1678  se almacenan en bloques completos consecutivos.
1679 \layout Itemize
1680
1681 El último fragmento se almacena al comienzo del bloque inmediatamente posterior
1682  al penúltimo.
1683 \layout Itemize
1684
1685 Cada framento posee las cabeceras mencionadas en la sección 
1686 \begin_inset LatexCommand \ref{sub:tipo1_reg}
1687
1688 \end_inset 
1689
1690 , cuyo contenido es el siguiente:
1691 \begin_deeper 
1692 \layout Itemize
1693
1694 En 
1695 \family typewriter 
1696 id
1697 \family default 
1698  se almacena el identificador único obtenido al hacer el alta.
1699 \layout Itemize
1700
1701 En 
1702 \family typewriter 
1703 tamaño
1704 \family default 
1705  se almacena el tamaño del 
1706 \emph on 
1707 fragmento
1708 \emph default 
1709  actual más los tamaños de los 
1710 \emph on 
1711 fragmentos
1712 \emph default 
1713  posteriores, quedando en el primer 
1714 \emph on 
1715 fragmento
1716 \emph default 
1717  el tamaño completo del registro y en el último sólo el tamaño del 
1718 \emph on 
1719 fragmento
1720 \emph default 
1721  final.
1722 \end_deeper 
1723 \layout Standard
1724
1725 Como puede observarse, la información de control en los 
1726 \emph on 
1727 fragmentos
1728 \emph default 
1729  intermedios puede ser redundante, pero se conserva para poder realizar
1730  algoritmos genéricos (que se basan en que al principio de un bloque, si
1731  no está vacío, hay una cabecera de un registro) y para facilitar chequeos
1732  de integridad del archivo.
1733 \layout Standard
1734
1735 A continuación se presenta un ejemplo gráfico de un registro multibloque
1736  de 10 bytes (de contenido 
1737 \begin_inset Quotes eld
1738 \end_inset 
1739
1740 1234567890
1741 \begin_inset Quotes erd
1742 \end_inset 
1743
1744 ) almacenado en un archivo con bloques de 4 bytes:
1745 \layout LyX-Code
1746
1747 | bloque 0          | bloque 1          | bloque 2
1748 \layout LyX-Code
1749
1750 +-------------------+-------------------+-------------------+-//-+
1751 \layout LyX-Code
1752
1753 | registro 0 - 1/3  | registro 0 - 2/3  | registro 0 - 3/3..| 
1754 \backslash 
1755
1756 \backslash 
1757  |
1758 \layout LyX-Code
1759
1760 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
1761 \layout LyX-Code
1762
1763 || id | tam | datos||| id | tam | datos||| id | tam |dato|..| 
1764 \backslash 
1765
1766 \backslash 
1767  |
1768 \layout LyX-Code
1769
1770 ||----+-----+------+||----+-----+------+||----+-----+----+..| // |
1771 \layout LyX-Code
1772
1773 ||  0 |  10 | 1234 |||  0 |  6  | 5678 |||  0 |  2  | 90 |..| 
1774 \backslash 
1775
1776 \backslash 
1777  |
1778 \layout LyX-Code
1779
1780 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
1781 \layout LyX-Code
1782
1783 +-------------------+-------------------+-------------------+-
1784 \backslash 
1785
1786 \backslash 
1787 -+
1788 \layout Section
1789
1790 Funciones principales
1791 \layout Standard
1792
1793 Las funciones principales son las necesarias para completar la estructura
1794  EMUFS (ver página 
1795 \begin_inset LatexCommand \pageref{sub:EMUFS}
1796
1797 \end_inset 
1798
1799 ).
1800 \layout Subsection
1801
1802 Lectura de registros
1803 \layout Standard
1804
1805 Para leer un registro se hace uso del archivo de índice (ver página 
1806 \begin_inset LatexCommand \pageref{sec:idx}
1807
1808 \end_inset 
1809
1810 ), obteniéndose el número de bloque en donde está almacenado el registro
1811  a buscar.
1812  Una vez obtenido, se carga en memoria el bloque entero y se busca secuencialmen
1813 te en él (leyendo la cabecera de cada registro y salteando los datos) hasta
1814  encontrar el registro pedido.
1815  Una vez encontrado se lo copia y devuelve.
1816 \layout Standard
1817
1818 Si se tratara de un registro 
1819 \emph on 
1820 multibloque
1821 \emph default 
1822  (ver sección 
1823 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
1824
1825 \end_inset 
1826
1827 ), se procede forma similar, sólo que se cargan en memoria uno a uno los
1828  bloques que componen el registro y se van copiando (y uniendo) los 
1829 \emph on 
1830 fragmentos
1831 \emph default 
1832  hasta completarlo.
1833 \layout Standard
1834
1835 Ver: 
1836 \family typewriter 
1837 emufs_tipo1_leer_registro()
1838 \layout Subsection
1839
1840 Altas de registros
1841 \layout Standard
1842
1843 Para realizar el alta de un registro, lo primero que se obtiene es un identifica
1844 dor, buscando primero en el archivo de identificadores recuperables (pág.
1845  
1846 \begin_inset LatexCommand \ref{sec:did}
1847
1848 \end_inset 
1849
1850 ) y de no haber ninguno, buscando el mayor identificador presente en el
1851  archivo de índice (pág.
1852  
1853 \begin_inset LatexCommand \ref{sec:idx}
1854
1855 \end_inset 
1856
1857 ) y sumándole uno.
1858  El paso siguiente es buscar un bloque con espacio libre suficiente como
1859  para almacenar el registro (y su cabecera) en el archivo de control de
1860  espacio libre (pág.
1861  
1862 \begin_inset LatexCommand \ref{sec:fsc}
1863
1864 \end_inset 
1865
1866 ) y cargarlo completo en memoria.
1867  De no encontrarse, se crea un bloque nuevo al final de archivo.
1868  En el bloque cargado en memoria, se agrega el registro nuevo (con su cabecera)
1869  al comienzo del espacio libre (calculado a partir del tamaño del bloque
1870  y el espacio libre en bloque) y se lo graba en disco.
1871  Finalmente se agrega (o actualiza) el identificador al archivo índice y
1872  el espacio libre en el bloque.
1873 \layout Standard
1874
1875 Si el registro ocupara más de un bloque (ver sección 
1876 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
1877
1878 \end_inset 
1879
1880 ), se buscan N bloques consecutivos (todos los que necesite el registro)
1881  absolutamente libres
1882 \begin_inset Foot
1883 collapsed true
1884
1885 \layout Standard
1886
1887 Incluso el último bloque debe estar absolutamente libre para cumplir con
1888  las condiciones presentadas en la sección 
1889 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
1890
1891 \end_inset 
1892
1893 .
1894 \end_inset 
1895
1896  y graba bloque a bloque cada 
1897 \emph on 
1898 fragmento
1899 \emph default 
1900  del registro (con sus cabeceras intermedias), al último 
1901 \emph on 
1902 fragmento
1903 \emph default 
1904  se lo trata de forma análoga a un registro 
1905 \emph on 
1906 simple
1907 \emph default 
1908 .
1909  Por cada bloque utilizado se actualiza el archivo de control de espacio
1910  libre.
1911 \layout Standard
1912
1913 Ver: 
1914 \family typewriter 
1915 emufs_tipo1_agregar_registro()
1916 \layout Subsection
1917
1918 Bajas de registros
1919 \layout Standard
1920
1921 Al eliminar un registro lo primero que se hace es actualizar los archivos
1922  de índice y de indentificadores recuperables, poniendo como número de bloque
1923  el valor especial 
1924 \family typewriter 
1925 EMUFS_NOT_FOUND
1926 \family default 
1927  y agregando el identificador del registro a borrar respectivamente.
1928  También se actualiza el archivo de control de espacio libre por cada bloque
1929  (en caso de ser más de uno, en registros 
1930 \emph on 
1931 multibloque
1932 \emph default 
1933 , se actualizan todos los bloques) y se carga el bloque en memoria para
1934  
1935 \emph on 
1936 alinear los datos a izquierda
1937 \emph default 
1938  (en caso de ser un registro 
1939 \emph on 
1940 multibloque
1941 \emph default 
1942 , esto se realiza sólo para el último bloque).
1943  Para alinear los datos, se recorre secuencialmente en bloque (leyendo la
1944  cabecera de cada registro y salteando los datos) hasta encontrar el registro
1945  a borrar.
1946  Encontrado el registro, se copian todos los bytes que se encuentran entre
1947  el fin del registro a borrar y el fin del bloque, en el comienzo del bloque
1948  borrado.
1949 \layout Standard
1950
1951 Ver: 
1952 \family typewriter 
1953 emufs_tipo1_borrar_registro()
1954 \layout Subsection
1955
1956 Modificación de registros
1957 \layout Standard
1958
1959 Se optó por un algoritmo simple y general, que usa las funciones de alto
1960  nivel mencionadas hasta ahora.
1961  Simplemento borra el registro y vuelve a crearlo.
1962  Al recuperar el último identificador de registro borrado, nos aseguramos
1963  de que se mantenga el identificador del registro.
1964 \layout Standard
1965
1966 Ver: 
1967 \family typewriter 
1968 emufs_tipo1_modificar_registro()
1969 \layout Subsection
1970
1971 Obtención de estadísticas
1972 \layout Standard
1973
1974 Es una función bastante simple, con una única complicación que mencionaremos
1975  más adelante.
1976 \layout Standard
1977
1978 Para obtener las máximas desviaciones, cantidad total de espacio libre,
1979  cantidad de registros y tamaño de los archivos auxiliares se utilizan las
1980  funciones apropiadas de los archivos auxiliares (ver secciones 
1981 \begin_inset LatexCommand \ref{sec:idx}
1982
1983 \end_inset 
1984
1985
1986 \begin_inset LatexCommand \ref{sec:fsc}
1987
1988 \end_inset 
1989
1990  y 
1991 \begin_inset LatexCommand \ref{sec:did}
1992
1993 \end_inset 
1994
1995 ).
1996 \layout Standard
1997
1998 Para obtener la cantidad de bloques se hace el siguiente calculo:
1999 \layout LyX-Code
2000
2001 cant_bloques = (tamaño_archivo_datos - tamaño_cabecera_archivo_datos)
2002 \layout LyX-Code
2003
2004                / tamaño_bloque;
2005 \layout Standard
2006
2007 Hasta aquí no hay mayores inconvenientes.
2008  El problema se presenta para calcular el tamaño de la información de control
2009  utilizada por el archivo de datos; se utiliza el siguiente cálculo:
2010 \layout LyX-Code
2011
2012 tam_info_control_datos = tamaño_cabecera_archivo_datos
2013 \layout LyX-Code
2014
2015                          + cant_registros * tamaño_cabecera_registro;
2016 \layout Standard
2017
2018 Aunque a simple vista esto parece acertado, no contempla el caso de los
2019  registros 
2020 \emph on 
2021 multibloque
2022 \emph default 
2023  (pág 
2024 \begin_inset LatexCommand \pageref{sub:tipo1_reg_multi}
2025
2026 \end_inset 
2027
2028 ), estos registros almacenan 
2029 \family typewriter 
2030 tamaño_cabecera_registro * N
2031 \family default 
2032 , donde 
2033 \family typewriter 
2034 N
2035 \family default 
2036  es la cantidad de bloques que ocupan.
2037  Salvar este caso sería muy costoso, porque habría que recorrer el archivo
2038  registro a registro, 
2039 \emph on 
2040 fragmento
2041 \emph default 
2042  a 
2043 \emph on 
2044 fragmento
2045 \emph default 
2046  e ir contando todas las cabeceras de registro que aparecen (similar a lo
2047  que se hace en la compactación, ver sección 
2048 \begin_inset LatexCommand \ref{sub:tipo1_compact}
2049
2050 \end_inset 
2051
2052 ).
2053  Al tratarse este de un caso excepcional, se optó por mantener la función
2054  simple ya que funciona bien en la mayoría de los casos.
2055 \layout Standard
2056
2057 Ver: 
2058 \family typewriter 
2059 emufs_tipo1_leer_estadisticas()
2060 \layout Subsection
2061
2062
2063 \begin_inset LatexCommand \label{sub:tipo1_compact}
2064
2065 \end_inset 
2066
2067 Compactación del archivo de datos
2068 \layout Standard
2069
2070 Esta función es una de las más simples, porque se limita a un algoritmo
2071  muy simple que utiliza las funciones de 
2072 \emph on 
2073 alto nivel
2074 \emph default 
2075  antes nombradas para realizar su tarea.
2076  Básicamente recorre el archivo de índices de registros, de comienzo a fin,
2077  leyendo el registro, borrándolo y volviéndolo a insertar.
2078  Si había espacio libre en un bloque anterior al que estaba, será insertado
2079  en él, si no volverá a grabarse en el lugar en que estaba.
2080  De esta forma se aprovechan todos los espacios libres intermedios, concluyendo
2081  con un archivo igual o más pequeño que el original.
2082 \layout Standard
2083
2084 Esta implementación no es la más eficiente, pero siendo que esta es una
2085  operación costosa y excepcional por naturaleza, se optó por mantener el
2086  algoritmo simple a costo de un poco de eficiencia.
2087 \layout Standard
2088
2089 Ver:
2090 \family typewriter 
2091  emufs_tipo1_compactar()
2092 \layout Section
2093
2094 Detalles de implementación (funciones internas, ver si lo ponemos o no)
2095 \layout Chapter
2096
2097
2098 \begin_inset LatexCommand \label{cha:tipo2}
2099
2100 \end_inset 
2101
2102 Archivo sin bloques y registros de longitud variable
2103 \layout Standard
2104
2105 Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
2106  de longitud variable sin realizar su agrupación en bloques, y como veremos
2107  en la siguiente sección, tambien permitirá la administración de gaps que
2108  queden en el archivo luego de operaciones de baja de registros.
2109 \layout Section
2110
2111 Organización física
2112 \layout Standard
2113
2114 Este tipo de archivo realizará el almacenamiento de registros de longitud
2115  variable en disco, su borrado y modificación sin la utilización de bloques
2116  de ningún tipo.
2117  Su implementación se encuentra en los archivos fuente (
2118 \series bold 
2119 tipo2.c
2120 \series default 
2121  y 
2122 \series bold 
2123 tipo2.h
2124 \series default 
2125 ).
2126 \layout Standard
2127
2128 Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
2129  simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
2130  de archivo en cuestión.
2131 \layout Standard
2132
2133 Para poder entender mejor la organización fisica de este tipo de archivo,
2134  tomemos el caso hipotético en el que se encuentran grabados 
2135 \series bold 
2136 dos registros
2137 \series default 
2138  (comenzando desde registro 0) de 
2139 \series bold 
2140 30 bytes
2141 \series default 
2142 , y 
2143 \series bold 
2144 25 bytes
2145 \series default 
2146 , respectivamente.
2147  Supongamos también que entre el registro 0 y 1 se encontraba un 
2148 \series bold 
2149 registro de 10 bytes
2150 \series default 
2151  que fue 
2152 \series bold 
2153 borrado
2154 \series default 
2155 , generando un 
2156 \series bold 
2157 gap
2158 \series default 
2159  
2160 \series bold 
2161 o freespace
2162 \series default 
2163 .
2164  Si miramos al archivo de datos (.dat) en el disco nos encontraremos con
2165  lo siguiente: 
2166 \begin_inset Float figure
2167 placement H
2168 wide false
2169 collapsed true
2170
2171 \layout Caption
2172
2173 Organización física de los registros en disco
2174 \layout Standard
2175
2176
2177 \begin_inset Graphics
2178         filename graphics/Example1.png
2179         width 100text%
2180
2181 \end_inset 
2182
2183
2184 \end_inset 
2185
2186
2187 \layout Standard
2188
2189 Como se puede observar, a nivel físico cada registro grabado esta compuesto
2190  por un Header cuyo tamaño total es de 8 bytes (
2191 \series bold 
2192 EMUFS_REG_ID
2193 \series default 
2194  + 
2195 \series bold 
2196 EMUFS_REG_SIZE
2197 \series default 
2198 ), y posteriormente el registro (bloque de datos) en sí.
2199  Luego se encuentra el espacio libre de 18 bytes dejado por el registro
2200  de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
2201  el segundo registro mencionado.dsds
2202 \layout Subsection
2203
2204 Comportamiento Particular de los Archivos Auxiliares
2205 \layout Standard
2206
2207 Como fue explicado al inicio de la documentación, la implementación de cualquier
2208 a de las tres organizaciones físicas de archivos presenta la necesidad de
2209  poseer tres archivos auxiliares que actuarán como índice de direcciones
2210  de registro (.
2211 \series bold 
2212 idx
2213 \series default 
2214 ), administrador de espacio libre (
2215 \series bold 
2216 .fsc
2217 \series default 
2218 ) y administrador de Id's liberados (
2219 \series bold 
2220 .did
2221 \series default 
2222 ) respectivamente.
2223 \layout Standard
2224
2225 No obstante, cada tipo de organización presentara sus particularidades respecto
2226  de estos tres archivos, las cuales describiremos a continuación en caso
2227  de haberla.
2228 \layout Subsubsection
2229
2230 Archivo índice o de posiciones relativas (.idx)
2231 \layout Standard
2232
2233 El archivo indice (
2234 \series bold 
2235 .idx
2236 \series default 
2237 ), permite la localización de los registros en el .DAT de forma directa,
2238  mediante la obtención de su offset o posición relativa respecto del inicio
2239  del 
2240 \series bold 
2241 .dat
2242 \series default 
2243  en donde se encuentra un registro dado, indicado por su ID.
2244 \layout Standard
2245
2246 Así pues, si tomamos el ejemplo descripto al inicio de este capítulo, tendremos
2247  las siguientes entradas en el archivo índice 
2248 \series bold 
2249 .idx
2250 \series default 
2251
2252 \begin_inset Float table
2253 placement H
2254 wide false
2255 collapsed true
2256
2257 \layout Caption
2258
2259 Organización física del archivo de índice o posiciones relativas.
2260 \layout Standard
2261
2262
2263 \begin_inset  Tabular
2264 <lyxtabular version="3" rows="3" columns="3">
2265 <features>
2266 <column alignment="center" valignment="top" leftline="true" width="0">
2267 <column alignment="center" valignment="top" leftline="true" width="0">
2268 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2269 <row topline="true" bottomline="true">
2270 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2271 \begin_inset Text
2272
2273 \layout Standard
2274
2275
2276 \emph on 
2277 ID_REGISTRO
2278 \end_inset 
2279 </cell>
2280 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2281 \begin_inset Text
2282
2283 \layout Standard
2284
2285
2286 \emph on 
2287 OFFSET
2288 \end_inset 
2289 </cell>
2290 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2291 \begin_inset Text
2292
2293 \layout Standard
2294
2295 \end_inset 
2296 </cell>
2297 </row>
2298 <row topline="true">
2299 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2300 \begin_inset Text
2301
2302 \layout Standard
2303
2304
2305 \series bold 
2306 0
2307 \end_inset 
2308 </cell>
2309 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2310 \begin_inset Text
2311
2312 \layout Standard
2313
2314
2315 \series bold 
2316 4
2317 \end_inset 
2318 </cell>
2319 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2320 \begin_inset Text
2321
2322 \layout Standard
2323
2324 El primer registro (reg0) comienza en el byte 4
2325 \end_inset 
2326 </cell>
2327 </row>
2328 <row topline="true" bottomline="true">
2329 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2330 \begin_inset Text
2331
2332 \layout Standard
2333
2334 1
2335 \end_inset 
2336 </cell>
2337 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2338 \begin_inset Text
2339
2340 \layout Standard
2341
2342
2343 \series bold 
2344 60
2345 \end_inset 
2346 </cell>
2347 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2348 \begin_inset Text
2349
2350 \layout Standard
2351
2352 El segundo registro (reg1) comienza en el byte 60
2353 \end_inset 
2354 </cell>
2355 </row>
2356 </lyxtabular>
2357
2358 \end_inset 
2359
2360
2361 \end_inset 
2362
2363
2364 \layout Standard
2365
2366
2367 \series bold 
2368 \emph on 
2369 Observación:
2370 \series default 
2371 \emph default 
2372  LOCATION indica donde comienza el header del registro buscado, y por consiguien
2373 te luego del header tendremos el registro en sí (los datos).
2374 \layout Subsubsection
2375
2376 Achivo de Gaps / Espacios Libres (.fsc)
2377 \layout Standard
2378
2379 El archivo de espacios libres o gaps (.fsc), tiene como función la administración
2380  del espacio libre o gaps (agujeros), generados por previas eliminaciones
2381  de registros en el archivo de datos.
2382  El mismo, nos indicará donde hay lugar para insertar un nuevo registro
2383  (se podrán insertar en algún gap acorde, o bien al final del archivo).
2384  Este archivo será utilizado tambien para el proceso de compactación de
2385  un archivo, explicado luego.
2386 \layout Standard
2387
2388 Así pues, si tomamos el ejemplo descripto al inicio del documento, tendremos
2389  las siguientes entradas en el archivo índice 
2390 \series bold 
2391 .fsc
2392 \series default 
2393
2394 \begin_inset Float table
2395 placement H
2396 wide false
2397 collapsed true
2398
2399 \layout Caption
2400
2401 Organización física del archivo de 
2402 \emph on 
2403 gaps 
2404 \emph default 
2405 o control de espacio libre.
2406 \layout Standard
2407
2408
2409 \begin_inset  Tabular
2410 <lyxtabular version="3" rows="2" columns="3">
2411 <features>
2412 <column alignment="center" valignment="top" leftline="true" width="0">
2413 <column alignment="center" valignment="top" leftline="true" width="0">
2414 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2415 <row topline="true" bottomline="true">
2416 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2417 \begin_inset Text
2418
2419 \layout Standard
2420
2421
2422 \emph on 
2423 OFFSET
2424 \end_inset 
2425 </cell>
2426 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2427 \begin_inset Text
2428
2429 \layout Standard
2430
2431
2432 \emph on 
2433 FREESPACE
2434 \end_inset 
2435 </cell>
2436 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2437 \begin_inset Text
2438
2439 \layout Standard
2440
2441 \end_inset 
2442 </cell>
2443 </row>
2444 <row topline="true" bottomline="true">
2445 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2446 \begin_inset Text
2447
2448 \layout Standard
2449
2450
2451 \series bold 
2452 42
2453 \end_inset 
2454 </cell>
2455 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2456 \begin_inset Text
2457
2458 \layout Standard
2459
2460
2461 \series bold 
2462 18
2463 \end_inset 
2464 </cell>
2465 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2466 \begin_inset Text
2467
2468 \layout Standard
2469
2470 18 bytes libres a partir del byte 42 del .dat
2471 \end_inset 
2472 </cell>
2473 </row>
2474 </lyxtabular>
2475
2476 \end_inset 
2477
2478
2479 \end_inset 
2480
2481
2482 \layout Standard
2483
2484
2485 \series bold 
2486 \emph on 
2487 Nota:
2488 \series default 
2489 \emph default 
2490  Por requerimiento del algoritmo de compactación, los gaps se graban en
2491  forma ordenada en el (.fsc).
2492  (El orden se corresponde con lo que hay en el 
2493 \series bold 
2494 .dat
2495 \series default 
2496 .
2497 \layout Subsubsection*
2498
2499 GAP Merging
2500 \layout Standard
2501
2502 Si bien la utilización concreta de los GAPS será explicada posteriormente
2503  en la ALTA y BAJA de registros, debemos remarcar la funcionalidad de MERGING
2504  que posee nuestro sistema FSC.
2505 \layout Standard
2506
2507 Ante la eliminación de un registro del archivo de datos, se generara por
2508  consiguiente un gap o espacio libre en alguna posición del archivo.
2509  Ese gap deberá ser registrado en el archivo de gaps (.fsc).
2510  Ahora bien, nuestro sistema de gaps, contemplará como es debido, la posibilidad
2511  de que se haya eliminado un registro que posee un GAP por delante, un GAP
2512  por detrás, o bien un GAP por delante y por detrás del mismo.
2513 \layout Standard
2514
2515 Nuestro sistema actuará en consecuencia, realizando un merge de los espacios
2516  libres, y unificándolos en una UNICA entrada en el archivo .fsc, que contendrá
2517  como dato de freespace, la suma correspondiente de los espacios libres
2518  antes mencionados.
2519 \layout Subsubsection
2520
2521 Archivo de ID's liberados (.did)
2522 \layout Standard
2523
2524 El archivo de ID's liberados no presenta ningún aspecto particular en este
2525  tipo de organización.
2526  Remitirse al capítulo correspondiente a los archivos auxiliares para consultar
2527  su estructura y funcionamiento.
2528 \layout Section
2529
2530 Funciones Principales
2531 \layout Standard
2532
2533 Dentro de 
2534 \series bold 
2535 \emph on 
2536 tipo2.h
2537 \series default 
2538 \emph default 
2539  y 
2540 \series bold 
2541 \emph on 
2542 tipo2.c
2543 \series default 
2544 \emph default 
2545  se encuentran las cabeceras y la implementación de las funciones principales
2546  respectivamente, las cuales dan funcionalidad a esta organización.
2547  
2548 \layout Standard
2549
2550 A continuación se comentará el funcionamiento algunas de las mas importantes.
2551 \layout Subsection
2552
2553 Lectura de registros
2554 \layout Standard
2555
2556 Como se vió al comienzo, los registros en este tipo de archivo no se encuentran
2557  agrupados en bloques de ninguna índole y estan dispersos a lo largo del
2558  archivo, con la particularidad de que pueden existir gaps o espacio libre,
2559  entre dos registros dados.
2560 \layout Standard
2561
2562 Por ende la lectura de registros en este tipo de organización es muy simple
2563  y dada la inexistencia de bloques, el procedimiento será el siguiente:
2564 \layout Enumerate
2565
2566 Se determina el offset en bytes, donde comienza el registro deseado, a través
2567  de su ID, buscando la misma en el archivo índice (
2568 \series bold 
2569 .idx
2570 \series default 
2571 )
2572 \layout Enumerate
2573
2574 Ya determinada la posición física del registro dentro del archivo de datos
2575  (
2576 \series bold 
2577 .dat
2578 \series default 
2579 ), nos posicionamos en la misma, y leemos el header del registro (
2580 \series bold 
2581 IDReg
2582 \series default 
2583  + 
2584 \series bold 
2585 RegSize
2586 \series default 
2587 ).
2588  Contando así con el tamaño del registro, procedemos a leer el mismo (los
2589  datos), dando por finalizada la lectura.
2590 \layout Standard
2591
2592 Ver: 
2593 \family typewriter 
2594 emufs_tipo2_leer_registro()
2595 \layout Subsection
2596
2597 Altas de registros
2598 \layout Standard
2599
2600 En el proceso de alta de registros entrarán en juego dos archivos descriptos
2601  en la 
2602 \emph on 
2603 sección de archivos auxiliares
2604 \emph default 
2605 , siendo estos el archivo índice (
2606 \series bold 
2607 .idx
2608 \series default 
2609 ), y el archivo de gaps / espacios libres (
2610 \series bold 
2611 .fsc
2612 \series default 
2613 ).
2614 \layout Standard
2615
2616 Así pues, a la hora de realizar una inserción de un registro en el archivo
2617  de datos, el procedimiento será el siguiente:
2618 \layout Enumerate
2619
2620 Calculamos el espacio que necesitaremos para el registro: sizeof(
2621 \series bold 
2622 EMUFS_REG_ID
2623 \series default 
2624 ) + sizeof(
2625 \series bold 
2626 EMUFS_REG_SIZE
2627 \series default 
2628 ) + sizeof(registro).
2629 \layout Enumerate
2630
2631 Determinamos donde debemos insertar el registro, ya sea un gap donde entre,
2632  o bien al final del archivo.
2633 \layout Enumerate
2634
2635 Insertamos el registro e información de control (
2636 \series bold 
2637 header
2638 \series default 
2639 +
2640 \series bold 
2641 data
2642 \series default 
2643 ), en la posición indicada en el paso 2.
2644 \layout Enumerate
2645
2646 En caso de haber utilizado un GAP, actualizamos el espacio libre restante
2647  en el mismo y en caso de que se haya utilizado al totalidad del GAP, se
2648  lo elimina del archivo (
2649 \series bold 
2650 .fsc
2651 \series default 
2652 ).
2653 \layout Enumerate
2654
2655 Actualizamos la entrada correspondiente al registro ingresado (determinada
2656  por su RegID), en el archivo índice (
2657 \series bold 
2658 .idx
2659 \series default 
2660 ), indicando su offset donde podrá ser accedido luego.
2661 \layout Standard
2662
2663 Ver: 
2664 \family typewriter 
2665 emufs_tipo2_agregar_registro()
2666 \layout Subsection
2667
2668 Bajas de registros
2669 \layout Standard
2670
2671 En el proceso de baja de registros entrarán en juego los tres archivos descripto
2672 s en la 
2673 \emph on 
2674 sección de archivos auxiliares
2675 \emph default 
2676 , siendo estos el archivo índice (
2677 \series bold 
2678 .idx
2679 \series default 
2680 ), el archivo de gaps / espacios libres (
2681 \series bold 
2682 .fsc
2683 \series default 
2684 ) y el archivo de ID's liberados (
2685 \series bold 
2686 .did
2687 \series default 
2688 ).
2689 \layout Standard
2690
2691 Dado que en la implementación de este tipo de organización física contamos
2692  con los gaps o espacios libres entre registros, no se eliminará fisicamente
2693  el registro del archivo de datos (
2694 \series bold 
2695 .dat
2696 \series default 
2697 ), pues entonces carecería de sentido el archivo anteriormente mencionado
2698  (
2699 \series bold 
2700 .fsc
2701 \series default 
2702 ).
2703  En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
2704  y se marca fisicamente en el archivo de datos la eliminación mediante un
2705  fill de los bytes correspondientes con un caracter nulo.
2706  (hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
2707 \layout Standard
2708
2709 El proceso de baja o eliminación de un registro constará luego de los siguientes
2710  pasos:
2711 \layout Enumerate
2712
2713 Se obtiene el offset o posición relativa en donde se encuentra grabado el
2714  registro dentro del archivo de datos.
2715 \layout Enumerate
2716
2717 Se obtiene el tamaño del registro y se realiza un dummyfill del sector del
2718  archivo correspondiente al registro que se está dando de baja.
2719  (Se rellena la zona correspondiente a su header+data).
2720 \layout Enumerate
2721
2722 Se agrega el GAP generado al archivo de gaps o espacios libres, y en caso
2723  de haberse generado un GAP lindante con otro GAP, se realizará un merge
2724  de los mismos y se los registrará bajo una única entrada en el archivo
2725  de espacios libres (.fsc).
2726 \layout Enumerate
2727
2728 Se agrega el ID que fue liberado, al archivo de ID's liberados (
2729 \series bold 
2730 .did
2731 \series default 
2732 ), al final del mismo (
2733 \emph on 
2734 pila
2735 \emph default 
2736 ).
2737 \layout Enumerate
2738
2739 Se marca en el archivo índice (
2740 \series bold 
2741 .idx
2742 \series default 
2743 ) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
2744  al registro recién eliminado (se le cambia el valor al n-esimo registro,
2745  donde N = IDReg del reg eliminado).
2746 \layout Standard
2747
2748 Ver: 
2749 \family typewriter 
2750 emufs_tipo2_borrar_registro()
2751 \layout Subsection
2752
2753 Modificación de registros
2754 \layout Standard
2755
2756 Dada la naturaleza del archivo de ID's liberados, y el manejo de espacio
2757  libre del que consta esta organización de archivo, el proceso de modificación
2758  de un registro se limita a los siguientes pasos:
2759 \layout Enumerate
2760
2761 Se realiza la lectura del registro, mediante el respectivo procedimiento
2762  ya desarollado anteriormente.
2763 \layout Enumerate
2764
2765 Una vez que se cuenta con los nuevos datos modificados, se procede a dar
2766  de baja el registro que ha sido modificado, e inmediatamente después se
2767  realiza una inserción con los nuevos datos.
2768 \layout Standard
2769
2770
2771 \series bold 
2772 \emph on 
2773 NOTA:
2774 \series default 
2775 \emph default 
2776  Como fue indicado, dada la naturaleza de PILA del subsistema de administración
2777  de ID liberados, es asegurado que la nueva inserción del registro modificado
2778  se realizará con el mismo RegID.
2779 \layout Standard
2780
2781 Ver: 
2782 \family typewriter 
2783 emufs_tipo2_modificar_registro()
2784 \layout Subsection
2785
2786 Obtención de estadísticas
2787 \layout Standard
2788
2789 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
2790  cantidad de bloques, cantidad de registros, espacio libre total, espacio
2791  libre promedio, espacio libre máximo y mínimo, etc.
2792 \layout Standard
2793
2794 Esta información es el resultado de ciertos cálculos realizados tanto en
2795  el archivo de datos como en los archivos índice.
2796 \layout Standard
2797
2798 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
2799  del archivo de datos, espacio libre total, cantidad de registros, cantidad
2800  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
2801  libres, etc.
2802 \layout Standard
2803
2804 Ver: 
2805 \family typewriter 
2806 emufs_tipo2_leer_estadisticas()
2807 \layout Subsection
2808
2809 Compactación del archivo de datos
2810 \layout Standard
2811
2812 Asi como los otros dos tipos de datos, el que nos compete también cuenta
2813  con la posibilidad de realizar la compactación de datos cuando el usuario
2814  lo desee, justificando todos los registros a izquierda, eliminando así
2815  los gaps existentes y decrementando el tamaño del archivo en disco (truncandolo
2816 ).
2817 \layout Standard
2818
2819 Para poder comprender como hemos implementado el proceso de recompactación
2820  en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
2821  cuales iremos describiendo el proceso.
2822  Notemos antes, que el proceso de compactación esta directamente ligado
2823  con el archivo de gaps o espacios libres (
2824 \series bold 
2825 .fsc
2826 \series default 
2827 ).
2828 \layout Standard
2829
2830 Comenzemos con el siguiente cuadro situacional: 
2831 \begin_inset Float figure
2832 placement H
2833 wide false
2834 collapsed true
2835
2836 \layout Caption
2837
2838 Archivo con gaps entre registros previo a compactación
2839 \layout Standard
2840
2841
2842 \begin_inset Graphics
2843         filename graphics/Compact1.png
2844         width 100text%
2845         keepAspectRatio
2846
2847 \end_inset 
2848
2849
2850 \end_inset 
2851
2852
2853 \layout Standard
2854
2855 Partiendo de esta base, el algoritmo de compactación tomará en su inicio
2856  al primer gap existente dentro del archivo de datos, en este caso llamado
2857  
2858 \series bold 
2859 Gap0
2860 \series default 
2861 .
2862  Luego, establecerá que el 
2863 \series bold 
2864 Source
2865 \series default 
2866  a partir de donde se quieren mover datos, sera:
2867 \layout LyX-Code
2868
2869 StartGap0 + SizeGap0 = EndGap0 = Source
2870 \layout Standard
2871
2872 Lo cual no es nada más y nada menos que lo obvio, la fuente a partir de
2873  donde se mueven los datos, sera el fin del primer gap, donde comienzan
2874  datos.
2875  Como destino (
2876 \series bold 
2877 Destination
2878 \series default 
2879 ) del movimiento, se establece inicialmente, el inicio del gap, o sea 
2880 \series bold 
2881 StartGap0 = Destination
2882 \series default 
2883 .
2884 \layout Standard
2885
2886 Luego, el algoritmo entrara en un bucle while (mientras haya bucles por
2887  levantar), el cual trabajara hasta el final de la compactación de la siguiente
2888  manera:
2889 \layout Standard
2890
2891
2892 \series bold 
2893 Mientras haya Gaps
2894 \series default 
2895  {
2896 \layout Enumerate
2897
2898 Se levanta el proximo gap al levantado en una instancia previa.
2899  En este ejemplo, durante el primer loop del while, se levantará 
2900 \series bold 
2901 Gap1
2902 \layout Enumerate
2903
2904 Luego, se calcula cuantos bytes hay que mover hacia el Destination de la
2905  siguiente manera:
2906 \layout Enumerate
2907
2908
2909 \series bold 
2910 Mustmove_bytes
2911 \series default 
2912  = 
2913 \series bold 
2914 StartGap1
2915 \series default 
2916  - 
2917 \series bold 
2918 Source
2919 \series default 
2920  = 
2921 \series bold 
2922 StartGap1
2923 \series default 
2924  - 
2925 \series bold 
2926 EndGap0 (
2927 \series default 
2928 Lo cual nuevamente es lógico pues querremos mover lo que se encuentra entre
2929  el final del primer gap levantado y el inicio del siguiente).
2930 \layout Enumerate
2931
2932 Se realiza el movimiento de los datos, utilizando las direcciones 
2933 \series bold 
2934 Source
2935 \series default 
2936  y 
2937 \series bold 
2938 Destination
2939 \series default 
2940 , así como la variable 
2941 \series bold 
2942 Mustmove_bytes
2943 \series default 
2944  que nos indica cuantos bytes transferir.
2945 \series bold 
2946
2947 \newline 
2948 IMPORTANTE: 
2949 \emph on 
2950 La transferencia se hace de a chunks de 25 bytes + un resto segun el valor
2951  de Mustmove_bytes.
2952 \layout Enumerate
2953
2954 Se establece como gap de referencia, al ultimo gap leido (En este caso se
2955  realiza: 
2956 \series bold 
2957 StartGap0
2958 \series default 
2959  = 
2960 \series bold 
2961 StartGap1
2962 \series default 
2963
2964 \series bold 
2965 Gap0Size = Gap1Size
2966 \series default 
2967 ) y termina el código de repetición del bucle, dando lugar a la carga del
2968  siguiente gap en el inicio del mismo.
2969 \layout Standard
2970
2971
2972 \series bold 
2973 }
2974 \layout Standard
2975
2976 Luego del primer bucle, el archivo se vera de la siguiente forma: 
2977 \begin_inset Float figure
2978 placement H
2979 wide false
2980 collapsed true
2981
2982 \layout Caption
2983
2984 Archivo con gaps en disco luego del primer bucle de compactación
2985 \layout Standard
2986
2987
2988 \begin_inset Graphics
2989         filename graphics/Compact2.png
2990         width 100text%
2991
2992 \end_inset 
2993
2994
2995 \end_inset 
2996
2997
2998 \layout Standard
2999
3000 Notemos que al final de la porción de datos de los bytes movidos (donde
3001  quedo apuntando 
3002 \series bold 
3003 Destination
3004 \series default 
3005 ), hay basura que será pisada por el próximo movimiento.
3006 \layout Standard
3007
3008 En el próximo loop, el bucle levantará un nuevo gap, y utilizando el gap
3009  anterior (En esta caso el Gap anterior será 
3010 \series bold 
3011 Gap1
3012 \series default 
3013 ) como referencia, realizará los mismos cálculos, desde donde transferir
3014  y cuantos bytes mover.
3015  (El destino es solo establecido inicialmente por código, y para el resto
3016  del algoritmo es el lugar donde quedo el puntero destination luego de la
3017  última escritura).
3018 \layout Standard
3019
3020 Una vez que se salga del bucle while, se realizará un último movimiento
3021  preprogramado, donde la fuente (
3022 \series bold 
3023 Source
3024 \series default 
3025 ) será el final del ultimo gap, y la cantidad de bytes a mover será lo que
3026  se encuentre luego del mismo hasta el fin de archivo.
3027 \layout LyX-Code
3028
3029 Source = StartLastGap + SizeLastGap = EndLastGap
3030 \layout LyX-Code
3031
3032 Mustmove_bytes = Datsize - Source
3033 \layout Standard
3034
3035 Damos por terminada así, la explicación del algoritmo de compresión el cual
3036  para el caso del tipo 2, es realmente bastante sencillo.
3037 \layout Standard
3038
3039 Ver:
3040 \family typewriter 
3041  emufs_tipo2_compactar()
3042 \layout Section
3043
3044 Consideraciones y Políticas de Diseño
3045 \layout Standard
3046
3047 Se han tomado ciertas consideraciones para algunos casos particulares que
3048  se pueden presentar durante el uso/ejecución de la aplicación, así como
3049  tambien politicas respecto del diseño e implementación del sistema:
3050 \layout Itemize
3051
3052 En la organización física tipo 2 para los registros que se graban en disco
3053  hemos decidido utilizar como encabezado de cada uno de ellos, los datos
3054  [ID_REG][REG_SIZE], los cuales fueron detallados previamente.
3055  Si bien se podría haber descartado el grabado del ID del registro en el
3056  archivo de datos y puede parecer redundante, dado que poseemos el archivo
3057  índice con el offset directo, el mismo se lo graba por distintos motivos:
3058 \newline 
3059
3060 \newline 
3061 A) En caso de la corrupción del archivo índice (.idx), podremos gracias a
3062  que poseemos en el archivo de datos, el ID de cada registro, recrear dicho
3063  índice, ayudándonos del archivo de espacios libres (
3064 \series bold 
3065 .fsc
3066 \series default 
3067 ), para poder saltear los espacios libres y e ir recorriendo secuencialmente
3068  los registros, reconstruyendo así el índice en cuestión.
3069  (esta función de reconstrucción no pudo ser implementada para esta entrega,
3070  pero es una posibilidad real).
3071 \newline 
3072
3073 \newline 
3074 B) Luego de un proceso de recompactación, los espacios libres que pudieron
3075  haber existido en el archivo de datos (
3076 \series bold 
3077 .dat
3078 \series default 
3079 ), son eliminados y los registros han cambiado de posición.
3080  Por ello, recorriendo secuencialmente por única vez el archivo de datos,
3081  se procede a la actualización / reconstrucción del índice de direcciones
3082  u offsets (.
3083 \series bold 
3084 idx
3085 \series default 
3086 )
3087 \layout Itemize
3088
3089 Si se desea insertar un registro y no se puede hayar un gap o espacio libre
3090  donde quepa, se los inserta al final del archivo.
3091 \layout Itemize
3092
3093 Ante una operación de baja de un registro, el mismo no es físicamente borrado
3094  del archivo de datos (
3095 \series bold 
3096 .dat
3097 \series default 
3098 ), simplemente los bytes que ocupa son llenados con hexa (00).
3099  Paralelamente, se procede a actualiza el archivo índice, insertando como
3100  valor de OFFSET para el registro eliminado, el valor ¨-1¨, indicando así
3101  la inexistencia del registro para el futuro, y por otro lado se genera
3102  la entrada de espacio libre en el archivo de gaps (
3103 \series bold 
3104 .fsc
3105 \series default 
3106 ).
3107 \layout Itemize
3108
3109 La reutilización de ID's liberados por previas operaciones de baja de registros,
3110  se ve implementada por el archivo de ID liberados (.did), y su comportamiento
3111  es el de una pila por lo que el último ID liberado, sera el próximo a ser
3112  reutilizado (LIFO).
3113 \layout Itemize
3114
3115 Como fue explicado en la implementación del archivo índice, existe una correspon
3116 dencia 1 a 1 entre los registros allí presentes (en el .idx) y los ID's de
3117  los registros, por lo cual el registro N-ésimo del archivo índice, será
3118  el correspondiente al registro de datos cuyo ID es igual a N.
3119 \layout Itemize
3120
3121 El proceso de compactación de archivos, realiza los movimientos de información
3122  requeridos para dicho propósito de a chunks de 25 bytes por vez.
3123  Este valor es fijo, pero se lo podría hacer parametrizable mediante la
3124  GUI en próximas entregas.
3125 \layout Chapter
3126
3127
3128 \begin_inset LatexCommand \label{cha:tipo3}
3129
3130 \end_inset 
3131
3132 Archivo con bloques parametrizados y registros de longitud constante
3133 \layout Standard
3134
3135 Las distintas organizaciones de archivos buscan aprovechar al máximo el
3136  espacio del archivo.
3137 \layout Standard
3138
3139 En este caso veremos que sucede luego de agregar y borrar una gran cantidad
3140  de registros del archivo, lo que provoca como consecuencia directa la fragmenta
3141 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
3142  produce un desperdicio de espacio.
3143 \layout Standard
3144
3145 La implementación de este tipo de archivo puede ser encontrada en 
3146 \family typewriter 
3147 emufs/tipo3.c
3148 \family default 
3149  mientras que su interfaz pública está disponible en 
3150 \family typewriter 
3151 emufs/tipo3.h
3152 \family default 
3153 .
3154 \layout Section
3155
3156 Organización Física
3157 \layout Standard
3158
3159 Esta organización guarda los registros pertenecientes al archivo en bloques
3160  de tamaño parametrizado, de modo que intentará guardar la mayor cantidad
3161  de registros que quepan en un bloque.
3162  
3163 \layout Standard
3164
3165 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
3166  del archivo.
3167 \layout Standard
3168
3169 El archivo estara compuesto por una cabecera que da información sobre el
3170  tipo de organización, el tamaño de los bloques y el tamaño de los registros.
3171 \layout Subsection
3172
3173 Organización Física de un Bloque
3174 \layout Standard
3175
3176 Cada bloque será capaz de contener la cantidad de registros enteros que
3177  quepan en él.
3178  De esta manera un registro que no entre completamente en el bloque deberá
3179  almacenarce en un bloque diferente.
3180 \layout Standard
3181
3182 Los bloques no contienen ninguna información adicional, solo se conoce su
3183  tamaño y se usa para delimitar 
3184 \begin_inset Quotes eld
3185 \end_inset 
3186
3187 virtualmente
3188 \begin_inset Quotes erd
3189 \end_inset 
3190
3191  zonas en el archivo.
3192 \layout Subsection
3193
3194 Organizacion Física de Registros
3195 \layout Standard
3196
3197 Cada registro se almacena en un bloque, y contiene una cabecera que indica
3198  su 
3199 \emph on 
3200 ID, 
3201 \emph default 
3202 por este motivo al realizar la busqueda de espacio en un bloque se lo hará
3203  preguntando por el tamaño del registro más 
3204 \family typewriter 
3205 sizeof(EMUFS_REG_ID).
3206  
3207 \layout Subsection
3208
3209 Organización Física de Registros Multibloque
3210 \layout Standard
3211
3212 Al ser los registros de longitud constante, se ha adoptado que un registro
3213  multibloque nunca podra estar almacenado en algún lugar que no sea el comienzo
3214  de un bloque.
3215  De esta manera se puede calcular cuantos bloques ocupará un registro y
3216  se podrá solicitar lugar para almacenarlo con la ayuda de la función 
3217 \family typewriter 
3218 emufs_fsc_buscar_n_lugares(), 
3219 \family default 
3220 que es muy importante para evitar el solapamiento de registros.
3221  Esta consideración acarrea como consecuencia directa un alto costo en términos
3222  del espacio desperdiciado.
3223 \layout Section
3224
3225 Funciones Principales
3226 \layout Standard
3227
3228 Dento de 
3229 \emph on 
3230 tipo3.h
3231 \emph default 
3232  y 
3233 \emph on 
3234 tipo3.c
3235 \emph default 
3236  se encuentran las cabeceras y la implementación de las funciones principales
3237  respectivamente, las cuales dan funcionalidad a esta organización.
3238 \layout Standard
3239
3240 A continuación se comentará la descripción de algunas acciones importantes.
3241 \layout Subsection
3242
3243 Leer Registro
3244 \layout Standard
3245
3246 La lectura de un registro se realiza con la ayuda del archivo .
3247 \emph on 
3248 idx
3249 \emph default 
3250  el cual contiene la información de la posición del registro dentro del
3251  archivo de datos.
3252  Una vez leida esta información, se recupera el bloque (en su totalidad)
3253  del archivo y se busca secuencialmente el registro con el 
3254 \emph on 
3255 ID
3256 \emph default 
3257  especificado.
3258 \layout Standard
3259
3260 Ver: 
3261 \family typewriter 
3262 emufs_tipo3_leer_registro()
3263 \layout Subsection
3264
3265 Grabar Registro
3266 \layout Standard
3267
3268 Graba un registro en un bloque donde haya espacio suficiente, y si no crea
3269  un nuevo bloque y lo agrega al final del archivo.
3270 \layout Standard
3271
3272 Luego de grabar un registro, actualiza los archivos de índice .idx y .fsc
3273  para mantener la coherencia.
3274 \layout Standard
3275
3276 Ver: 
3277 \family typewriter 
3278 emufs_tipo3_grabar_registro()
3279 \layout Subsection
3280
3281 Borrar Registro
3282 \layout Standard
3283
3284 Borra un registro del archivo de datos, para esto levanta el bloque al que
3285  pertenece el archivo y ajusta los demás registros justificandolos hacia
3286  la izquierda.
3287 \layout Standard
3288
3289 Cabe destacar que para dar de baja un registro no hace falta borrarlo del
3290  archivo de datos, solo es necesario borrar las entradas en los archivos
3291  de índice, pero cuando se realiza el ajuste el algoritmo toma porciones
3292  del bloque del tamaño de un registro mas su encabezado - comenzando desde
3293  el siguiente al que fue borrado - y copia (sobreescribe) sobre el anterior.
3294  De esta manera, la información correspondiente al registro borrado no estará
3295  presente en el archivo de datos.
3296  Esto es una consecuencia del ajuste al borrar un registro, pudiendo no
3297  ser así, si no se realizara el mismo.
3298 \layout Standard
3299
3300 Ver: 
3301 \family typewriter 
3302 emufs_tipo3_borrar_registro()
3303 \layout Subsection
3304
3305 Leer Estadísticas
3306 \layout Standard
3307
3308 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
3309  cantidad de bloques, cantidad de registros, espacio libre total, espacio
3310  libre promedio, espacio libre máximo y mínimo, etc.
3311 \layout Standard
3312
3313 Esta información es el resultado de ciertos cálculos realizados tanto en
3314  el archivo de datos como en los archivos índice.
3315 \layout Standard
3316
3317 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
3318  del archivo de datos, espacio libre total, cantidad de registros, cantidad
3319  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
3320  libres, etc.
3321 \layout Standard
3322
3323 Ver: 
3324 \family typewriter 
3325 emufs_tipo3_leer_estadisticas()
3326 \layout Subsection
3327
3328 Compactar el Archivo
3329 \layout Standard
3330
3331 Esta función intenta reorganizar el archivo de manera que el espacio libre
3332  sea lo menor posible, recordando siempre que un registro no puede ser almacenad
3333 o en mas de un bloque excepto que el tamaño del registro sea mayor que el
3334  del bloque.
3335 \layout Standard
3336
3337 Para realizar esto, se aprovecha la funcionalidad de 
3338 \emph on 
3339 emufs_tipo3_grabar_registro() 
3340 \emph default 
3341 ya que esta tiene la capacidad de determinar una posición mas eficiente
3342  en el archivo para un registro.
3343  Por esto lo que se hace es levantar uno por uno los registros y volverlos
3344  a grabar, de ese modo todos los 
3345 \emph on 
3346 gaps 
3347 \emph default 
3348 que pudieron haberse formado por la eliminación de registros serán cubiertos
3349  por otros.
3350 \layout Standard
3351
3352 Al estar utilizando recuperación de 
3353 \emph on 
3354 id`s
3355 \emph default 
3356  borrados, esto me asegura que el registro borrado-guardado conservará el
3357  id al grabarse.
3358 \layout Standard
3359
3360 Al finalizar este proceso se verifica si existen bloques vacios para truncar
3361  el archivo.
3362  Lo mismo se debe hacer con el archivo de espacios libres .
3363 \emph on 
3364 fsc 
3365 \emph default 
3366 el cual disminuye su tamaño también.
3367 \layout Standard
3368
3369 Ver: 
3370 \family typewriter 
3371 void emufs_tipo3_compactar()
3372 \layout Section
3373
3374 Consideraciones y Políticas de Diseño
3375 \layout Standard
3376
3377 Se han tomado ciertas consideraciones para algunos casos particulares que
3378  se pueden presentar durante el uso/ejecución de la aplicación.
3379 \layout Enumerate
3380
3381 Cada registro tiene un encabezado que indica el 
3382 \emph on 
3383 id 
3384 \emph default 
3385 del mismo.
3386 \layout Enumerate
3387
3388 Si el tamaño del registro es mayor que el tamaño del bloque el registro
3389  se particionará en la cantidad de bloques que sea necesario, pero siempre
3390  se guardará desde el comienzo de un bloque, esto quiere decir que nunca
3391  se podrá encontrar un comienzo de registro en algún lugar de un bloque
3392  que no sea el comienzo del mismo.
3393 \layout Enumerate
3394
3395 Si el registro se divide en mas de un bloque, se le coloca el id como encabezado
3396  igualmente, pero en el archivo .
3397 \emph on 
3398 idx
3399 \emph default 
3400  solo se guarda el primer bloque.
3401  En el 
3402 \emph on 
3403 .fsc
3404 \emph default 
3405  se actualizan todos los bloques con el espacio libre que realmente tienen.
3406 \layout Chapter
3407
3408 Conclusiones
3409 \layout Standard
3410
3411 Las comparaciones, pruebas, etc...
3412 \the_end