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