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