]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - doc/informe.lyx
a87459cf4e8cc1d54ffdb7458b72c07712033800
[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 Standard
47
48 Esta es la documentación correspondiente a las API`s para el manejo de tres
49  organizaciones de archivo diferentes.
50  A continuación se describe cada una de ellas y su modo de funcionamiento
51  y sus características principales.
52  De la correcta elección de la organización, dependerá la eficiencia de
53  la aplicación que la utilice.
54  
55 \layout Chapter
56
57 Estructura común
58 \layout Section
59
60 Tipos
61 \layout Standard
62
63 Se detallan a continuación los tipos de datos definidos y utilizados en
64  las distintas implementaciones que conforman nuestro sistema, siendo el
65  más importante de ellos, la estructura 
66 \family typewriter 
67 EMUFS
68 \family default 
69  que actúa como interfaz común para el manejo de cualquier tipo de archivo
70  (no importa que tipo de organización física posea un archivo, esta estructura
71  prooverá una interfaz (funciones) para su manejo).
72 \layout Subsection
73
74 Tipos Comunes
75 \layout Standard
76
77 En la implementación de cada tipo de organización física, así como tambien
78  en las API de los archivos auxiliares comunes a ellas, se da la utilización
79  de tipo definidos para una clara interfaz entre las mismas, los cuales
80  son brevemente descriptos a continuación y pueden ser hallados en el archivo
81  
82 \series bold 
83 emufs.h
84 \series default 
85 :
86 \layout Itemize
87
88
89 \family typewriter 
90 EMUFS_REG_ID
91 \family default 
92 : usado para representar un 
93 \emph on 
94 Id
95 \emph default 
96  de un registro.
97 \layout Itemize
98
99
100 \family typewriter 
101 EMUFS_REG_SIZE
102 \family default 
103 : usado para representar el tamaño en bytes de un registro.
104 \layout Itemize
105
106
107 \family typewriter 
108 EMUFS_BLOCK_ID
109 \family default 
110 : usado para representar un número de bloque.
111 \layout Itemize
112
113
114 \family typewriter 
115 EMUFS_BLOCK_SIZE
116 \family default 
117 : usado para representar el tamaño en bytes de un bloque.
118 \layout Itemize
119
120
121 \family typewriter 
122 EMUFS_FREE
123 \family default 
124 : usado para representar espacio libre en bytes.
125 \layout Itemize
126
127
128 \family typewriter 
129 EMUFS_OFFSET
130 \family default 
131 : usado para representar un offset.
132 \layout Standard
133
134 Todos son del tipo 
135 \family typewriter 
136 unsigned long
137 \family default 
138 .
139 \layout Subsection
140
141 EMUFS
142 \layout Standard
143
144
145 \family typewriter 
146 EMUFS
147 \family default 
148 \emph on 
149  
150 \emph default 
151 es la estuctura principal que encapsula todas las funciones para el manejo
152  de un archivo de datos.
153  Posee punteros a funciones que dependiendo de la organización fisica por
154  la cual se opte dentro del sistema, serán asignados de acorde.
155  
156 \layout Standard
157
158 Su declaración puede ser observada en el archivo 
159 \series bold 
160 emufs.h 
161 \series default 
162 y la misma cuenta con los siguiente campos:
163 \layout Itemize
164
165
166 \family typewriter 
167 EMUFS_Tipo
168 \family default 
169  que es un tipo enumerado que indica cual es la organización.
170 \layout Itemize
171
172
173 \family typewriter 
174 EMUFS_BLOCK_SIZE
175 \family default 
176  indica el tamaño del bloque para los tipos 1 y 3.
177 \layout Itemize
178
179
180 \family typewriter 
181 EMUFS_REG_SIZE
182 \family default 
183  indica el tamaño del registro, para el tipo 3 que posee tamaño constante.
184 \layout Itemize
185
186
187 \family typewriter 
188 void **leer_bloque() 
189 \family default 
190 puntero a la función para leer un bloque.
191 \layout Itemize
192
193
194 \family typewriter 
195 void *leer_bloque_raw()
196 \family default 
197  puntero a la función para leer un bloque, el anterior y el siguiente.
198 \layout Itemize
199
200
201 \family typewriter 
202 void **leer_registro()
203 \family default 
204  puntero a la función para leer un registro.
205 \layout Itemize
206
207
208 \family typewriter 
209 void **leer_registro_raw()
210 \family default 
211  puntero a la función para leer un registro con su encabezado.
212 \layout Itemize
213
214
215 \family typewriter 
216 EMUFS_REG_ID *grabar_registro()
217 \family default 
218  puntero a la función para grabar un registro.
219 \layout Itemize
220
221
222 \family typewriter 
223 EMUFS_REG_ID *modificar_registro() 
224 \family default 
225 puntero a la función para modificar un registro.
226 \layout Itemize
227
228
229 \family typewriter 
230 int *borrar_registro()
231 \family default 
232  puntero a la función para borrar un registro.
233 \layout Itemize
234
235
236 \family typewriter 
237 EMUFS_Estadisticas *leer_estadisticas()
238 \family default 
239  puntero a la función para cargar una estructura con las estadísticas.
240 \layout Itemize
241
242
243 \family typewriter 
244 void *compactar()
245 \family default 
246  puntero a la función para compactar un archivo.
247 \layout Itemize
248
249
250 \family typewriter 
251 char *nombre
252 \family default 
253  almacena el nombre del archivo sin extensión.
254 \layout Standard
255
256 Esta estructura define los valores de sus punteros según el tipo de organización
257  que se desee manejar y esto se realiza a través del API emufs, implementado
258  en 
259 \series bold 
260 emufs.c
261 \series default 
262 , que se describirá posteriormente.
263 \layout Standard
264
265 Por ejemplo si se desea crear un archivo de nombre 
266 \begin_inset Quotes eld
267 \end_inset 
268
269 facturas
270 \begin_inset Quotes erd
271 \end_inset 
272
273  organizado de la forma 3, se invoca a la función:
274 \layout Standard
275
276
277 \family typewriter 
278 emufs_crear(filename,tipo,tam_bloque,tam_reg), 
279 \family default 
280 donde
281 \family typewriter 
282  filename 
283 \family default 
284 es el nombre que tendrán los archivos de datos e índice, 
285 \family typewriter 
286 tipo
287 \family default 
288  es el tipo de organización - bloques parametrizados y registros constantes
289  en este caso-, 
290 \family typewriter 
291 tam_bloque
292 \family default 
293  es el tamaño del bloque, y 
294 \family typewriter 
295 tam_reg
296 \family default 
297  es el tamaño del registro.
298 \layout Standard
299
300 Para las diferentes organizaciones puede ser que alguno de estos 2 últimos
301  valores no tengan sentido almacenarlas y tomaran un valor por defecto igual
302  a cero.
303 \layout Standard
304
305 Según el tipo de organización, se inicializan los punteros a las funciones.
306  Para el ejemplo 
307 \family typewriter 
308 leer_bloque
309 \family default 
310  se igualará a 
311 \family typewriter 
312 emufs_tipo3_leer_bloque()
313 \family default 
314 , y lo mismo sucede con los demás.
315 \layout Subsection
316
317 EMUFS_Tipo
318 \layout Standard
319
320
321 \family typewriter 
322 EMUFS_Tipo
323 \family default 
324  es un tipo de dato enum, el cual será utilizado en la cabecera de todo
325  archivo de datos (
326 \series bold 
327 .dat
328 \series default 
329 ), para indicar los distintos tipos de organización física.
330  Su declaración puede verse en el archivo 
331 \series bold 
332 emufs.h.
333 \layout Standard
334
335 A saberse los valores y significado correspondiente que puede tomar este
336  tipo de dato son:
337 \layout Itemize
338
339
340 \series bold 
341 T1
342 \series default 
343  : Archivos con registros de longitud variable y bloques parametrizables.
344 \layout Itemize
345
346
347 \series bold 
348 T2
349 \series default 
350  : Archivos con registros de longitud variable sin bloques.
351 \layout Itemize
352
353
354 \series bold 
355 T3
356 \series default 
357  : Archivos con registros de longitud fija y bloques parametrizables.
358 \layout Subsection
359
360 EMUFS_Estadisticas
361 \layout Standard
362
363
364 \family typewriter 
365 EMUFS_Estadisticas
366 \family default 
367  es una estructura que almacenará los datos pertinentes a las estadísticas
368  de un archivo dado, y será utilizada para visualizar dichas observaciones
369  a través de la GUI.
370 \layout Standard
371
372 Su declaración puede ser observada en el archivo 
373 \series bold 
374 emufs.h 
375 \series default 
376 y la misma cuenta con los siguiente campos:
377 \layout Itemize
378
379
380 \family typewriter 
381 unsigned long
382 \family default 
383  
384 \family typewriter 
385 tam_archivo
386 \family default 
387 : indica el tamaño del archivo de datos (.dat) en bytes.
388 \layout Itemize
389
390
391 \family typewriter 
392 unsigned long
393 \family default 
394  
395 \family typewriter 
396 tam_archivos_aux
397 \family default 
398 : indica el tamaño de los archivos auxiliares sumados en bytes.
399 \layout Itemize
400
401
402 \family typewriter 
403 unsigned long
404 \family default 
405  
406 \family typewriter 
407 tam_info_control_dat
408 \family default 
409 : indica la cantidad de bytes en información de control utilizados para
410  el archivo.
411 \layout Itemize
412
413
414 \family typewriter 
415 unsigned long
416 \family default 
417  
418 \family typewriter 
419 media_fs
420 \family default 
421 : promedio de espacio libre en el archivo de datos (por bloque o gap promedio
422  segun la org)
423 \layout Itemize
424
425
426 \family typewriter 
427 unsigned long
428 \family default 
429  
430 \family typewriter 
431 total_fs
432 \family default 
433 : total de espacio libre en el archivo de datos.
434 \layout Itemize
435
436
437 \family typewriter 
438 unsigned long
439 \family default 
440  
441 \family typewriter 
442 max_fs
443 \family default 
444 : máximo espacio libre en el archivo de datos (en un bloque o máximo gap
445  segun la org).
446 \layout Itemize
447
448
449 \family typewriter 
450 unsigned long
451 \family default 
452  
453 \family typewriter 
454 min_fs
455 \family default 
456 : idem pero mínimo.
457 \layout Itemize
458
459
460 \family typewriter 
461 unsigned long
462 \family default 
463  
464 \family typewriter 
465 cant_bloques
466 \family default 
467 : cantidad de bloques en el archivo de datos (.
468 \series bold 
469 dat
470 \series default 
471 )
472 \layout Itemize
473
474
475 \family typewriter 
476 unsigned long
477 \family default 
478  
479 \family typewriter 
480 cant_registros
481 \family default 
482 : cantidad de registros en el archivo de datos (
483 \series bold 
484 .dat
485 \series default 
486 )
487 \layout Standard
488
489 En base a la estructura descripta anteriormente y mediante la utilización
490  de la función de lectura de estadísticas l
491 \family typewriter 
492 emufs_leer_estadisticas()
493 \family default 
494  disponible en la estructura común 
495 \family typewriter 
496 EMUFS
497 \family default 
498  handler de cualquier tipo de archivo, podremos obtener una serie de estadística
499 s que pasamos a detallar (más alla de los datos básicos como cant registros,
500  cant bloques, tam archivo, etc):
501 \layout Itemize
502
503 Relación entre espacio libre y el tamaño del archivo de datos (
504 \series bold 
505 .dat
506 \series default 
507 )
508 \layout Itemize
509
510 Relación entre el espacio ocupado por información de control y el tamaño
511  del archivo de datos (
512 \series bold 
513 .dat
514 \series default 
515 )
516 \layout Itemize
517
518 Cantidad promedio de espacio libre (en bloque o gap promedio)
519 \layout Itemize
520
521 Desviaciones extremas de espacio libre (máximo/mínimo espacio libre en bloque
522  o mayor/menor gap)
523 \layout Section
524
525
526 \begin_inset LatexCommand \label{sec:cabecera_gral}
527
528 \end_inset 
529
530 Organización física general de un archivo E
531 \begin_inset Formula $\mu$
532 \end_inset 
533
534 FS
535 \layout Standard
536
537 Todo archivo E
538 \begin_inset Formula $\mu$
539 \end_inset 
540
541 FS está compuesto por 4 archivos a nivel de sistema operativo: archivo de
542  datos (con 3 formatos posibles, ver páginas 
543 \begin_inset LatexCommand \pageref{cha:tipo1}
544
545 \end_inset 
546
547
548 \begin_inset LatexCommand \pageref{cha:tipo2}
549
550 \end_inset 
551
552  y 
553 \begin_inset LatexCommand \pageref{cha:tipo3}
554
555 \end_inset 
556
557 ), archivo de índice (ver página 
558 \begin_inset LatexCommand \pageref{sec:idx}
559
560 \end_inset 
561
562 ), archivo de control de espacio libre (ver página 
563 \begin_inset LatexCommand \pageref{sec:fsc}
564
565 \end_inset 
566
567 ) y archivo de índices recuperables (ver página 
568 \begin_inset LatexCommand \pageref{sec:did}
569
570 \end_inset 
571
572 ).
573 \layout Standard
574
575 El archivo de datos está compuesto por:
576 \layout Itemize
577
578 Una 
579 \emph on 
580 cabecera general
581 \emph default 
582  compuesta por un 
583 \family typewriter 
584 int
585 \family default 
586  (4 bytes en plataformas Linux de 32 bits) que representa el tipo de archivo.
587 \layout Itemize
588
589 Datos dependientes del tipo de archivo.
590 \layout Standard
591
592 La 
593 \emph on 
594 cabecera general
595 \emph default 
596  es utilizada para poder detectar el formato de un archivo al abrirlo.
597  Los datos dependientes del tipo de archivo serán explicados en sus secciones
598  correspondientes.
599 \layout LyX-Code
600
601 archivo
602 \layout LyX-Code
603
604 +-----------+--------------------------------------------//-+
605 \layout LyX-Code
606
607 |    tipo   | Datos dependientes del tipo de archivo ...
608  
609 \backslash 
610
611 \backslash 
612  |
613 \layout LyX-Code
614
615 +-----------+--------------------------------------------//-+
616 \layout LyX-Code
617
618 /- 4 bytes -/
619 \layout Section
620
621 Uso de la estructura EMUFS
622 \layout Standard
623
624 Como fue mencionado anteriormente en la descripción de la estructura EMUFS,
625  la misma proporciona al usuario una interfaz a través de la cual puede
626  realizar el manejo de archivos en forma genérica, abstrayéndose del tipo
627  de organización física en particular que dicho archivo posea.
628  Se la declara en 
629 \series bold 
630 emufs.h
631 \series default 
632  y las funciones que inicializan la estructura se encuentran en 
633 \series bold 
634 emufs.c
635 \layout Standard
636
637 Es decir que a traves de esta estructura, podemos manejar cualquier tipo
638  de archivo, mediante una misma interfaz en común.
639  La estructura 
640 \family typewriter 
641 EMUFS 
642 \family default 
643 posee además de ciertos datos que describen la organización física de un
644  archivo dado como por ejemplo 
645 \series bold 
646 \emph on 
647 tamaño de registro
648 \series default 
649 \emph default 
650
651 \series bold 
652 \emph on 
653 tamaño de bloque
654 \series default 
655 \emph default 
656  y 
657 \series bold 
658 \emph on 
659 nombre del archivo
660 \series default 
661 \emph default 
662 , una serie de punteros a funciones para el manejo del archivo del cual
663  es handler:
664 \layout Standard
665
666 Entre dichos funciones se encuentran: 
667 \family typewriter 
668 leer_registro()
669 \family default 
670
671 \family typewriter 
672 leer_bloque(), borrar_registro()
673 \family default 
674
675 \family typewriter 
676 agregar_registro()
677 \family default 
678
679 \family typewriter 
680 modificar_registro, leer_estadisticas()
681 \family default 
682
683 \family typewriter 
684 compactar().
685 \layout Standard
686
687 Para entender mejor el uso de esta estructura para el manejo de los archivos,
688  mostraremos un ejemplo concreto.
689  Supongamos que tenemos el siguiente código:
690 \layout LyX-Code
691
692 EMUFS *efs = emufs_crear(¨articulos.dat¨,T3,200,50);
693 \layout Standard
694
695 Esto hará que se cree el archivo de datos 
696 \series bold 
697 articulos.dat
698 \series default 
699 , con la organización física tipo 3 con registros de longitud fija de 50
700  bytes y bloques de 200 bytes.
701  Al mismo tiempo, los se asginarán valores a los punteros a funciones que
702  posee dicha estructura, la cual de ahora en más estará en condiciones de
703  manejar un archivo del tipo 3.
704  Gráficamente lo que sucede es:
705 \layout Standard
706
707
708 \begin_inset Float figure
709 placement H
710 wide false
711 collapsed true
712
713 \layout Caption
714
715 Inicialización de estructura EMUFS para un caso Archivo Tipo 3
716 \layout Standard
717 \align center 
718
719 \begin_inset Graphics
720         filename graphics/Emufsinit.png
721         scale 80
722
723 \end_inset 
724
725
726 \end_inset 
727
728
729 \layout Standard
730
731 Así pues, cuando se utilize la estructura para por ejemplo leer un registro,
732  sucedera lo siguiente:
733 \layout LyX-Code
734
735 efs->leer_registro(params) -- calls -->  emufs_tipo3_leer_registro(params)
736 \layout Standard
737
738 Como se puede observar, la estructura 
739 \family typewriter 
740 EMUFS
741 \family default 
742  permitirá el manejo de cualquier tipo de archivo, a través del mismo código,
743  dandole gran flexibilidad a nuestro sistema, que podrá expandirse a más
744  tipos de archivos de ser necesario.
745 \layout Chapter
746
747 Archivos Auxiliares
748 \layout Standard
749
750 Acompañando al archivo de datos (
751 \series bold 
752 .dat
753 \series default 
754 ) el cual es responsable de la contención de los registros, tendremos tres
755  archivos auxiliares (
756 \series bold 
757 .idx
758 \series default 
759
760 \series bold 
761 .fsc
762 \series default 
763  y 
764 \series bold 
765 .did
766 \series default 
767 ) cuya funcionalidad y propósito pasamos a describir a continuación, sin
768  antes remarcar que los tres archivos poseen una sola implementación para
769  las distintas formas de organización física que hemos implementado (tres
770  para ser mas exactos).
771 \layout Standard
772
773 Entre las ventajas de poseer la misma implementación se encuentra el tener
774  un API común entre los tres tipos para el manejo de la localización de
775  sus registros, administración de espacio libre e Id's liberados, sin necesidad
776  de realizar n-implementaciones para un mismo objetivo final.
777 \layout Standard
778
779 Además, la obtención de ciertos datos estadísticos como espacio libre, o
780  cantidad de registros, se realiza a través de la misma interfaz, y también
781  se ha facilitado en cierto grado la re-organización física de un archivo
782  (pasar de un tipo a otro), dado el uso de estos tres archivos auxiliares
783  en común para funciones tan predominantes como índexación, administración
784  de espacio libre y recuperación de Id's.
785 \layout Section
786
787
788 \begin_inset LatexCommand \label{sec:idx}
789
790 \end_inset 
791
792 Archivo índice
793 \layout Standard
794
795 El archivo índice (.idx), permite la localización de los registros en el
796  .DAT de forma directa, mediante la obtención de su offset respecto del inicio
797  del .dat, o nro bloque (segun el tipo de organización física) en donde se
798  encuentra un registro dado, indicado por su 
799 \emph on 
800 id_reg.
801 \layout Standard
802
803 Los registros de este archivo se encuentran representados una estructura
804  que indica un número de registro y el bloque u offset en donde se encuentra
805  el mísmo.
806 \layout Standard
807
808 Es necesario que este archivo esté ordenado por 
809 \emph on 
810 id_reg
811 \emph default 
812 , ya que esto permitirá el acceso directo al mismo, para la rápida obtención
813  del nro de bloque u offset y posterior búsqueda de un registro en el archivo
814  de datos.
815 \layout Subsection
816
817 Organización física
818 \layout Standard
819
820 Los registros de este archivo se encuentran representados a nivel codigo
821  por el siguiente tipo de dato interno (
822 \family typewriter 
823 EMUFS_IDX
824 \family default 
825 ):
826 \layout LyX-Code
827
828 typedef struct emufs_idx_t { 
829 \layout LyX-Code
830
831   EMUFS_REG_ID id_reg;
832 \layout LyX-Code
833
834   EMUFS_OFFSET location;
835 \layout LyX-Code
836
837 } EMUFS_IDX;
838 \layout Standard
839
840
841 \begin_inset Float table
842 placement H
843 wide false
844 collapsed true
845
846 \layout Caption
847
848 Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
849  Tipo 1 y 3
850 \layout Standard
851
852
853 \begin_inset  Tabular
854 <lyxtabular version="3" rows="2" columns="3">
855 <features>
856 <column alignment="center" valignment="top" leftline="true" width="0">
857 <column alignment="center" valignment="top" leftline="true" width="0">
858 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
859 <row topline="true" bottomline="true">
860 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
861 \begin_inset Text
862
863 \layout Standard
864
865 id_reg
866 \end_inset 
867 </cell>
868 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
869 \begin_inset Text
870
871 \layout Standard
872
873 nro_bloque
874 \end_inset 
875 </cell>
876 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
877 \begin_inset Text
878
879 \layout Standard
880
881 \end_inset 
882 </cell>
883 </row>
884 <row topline="true" bottomline="true">
885 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
886 \begin_inset Text
887
888 \layout Standard
889
890 5
891 \end_inset 
892 </cell>
893 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
894 \begin_inset Text
895
896 \layout Standard
897
898 54
899 \end_inset 
900 </cell>
901 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
902 \begin_inset Text
903
904 \layout Standard
905
906 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
907 \end_inset 
908 </cell>
909 </row>
910 </lyxtabular>
911
912 \end_inset 
913
914
915 \end_inset 
916
917  
918 \begin_inset Float table
919 placement H
920 wide false
921 collapsed true
922
923 \layout Caption
924
925 Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
926  Tipo 2
927 \layout Standard
928
929
930 \begin_inset  Tabular
931 <lyxtabular version="3" rows="2" columns="3">
932 <features>
933 <column alignment="center" valignment="top" leftline="true" width="0">
934 <column alignment="center" valignment="top" leftline="true" width="0">
935 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
936 <row topline="true" bottomline="true">
937 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
938 \begin_inset Text
939
940 \layout Standard
941
942 id_reg
943 \end_inset 
944 </cell>
945 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
946 \begin_inset Text
947
948 \layout Standard
949
950 nro_bloque
951 \end_inset 
952 </cell>
953 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
954 \begin_inset Text
955
956 \layout Standard
957
958 \end_inset 
959 </cell>
960 </row>
961 <row topline="true" bottomline="true">
962 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
963 \begin_inset Text
964
965 \layout Standard
966
967 5
968 \end_inset 
969 </cell>
970 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
971 \begin_inset Text
972
973 \layout Standard
974
975 54
976 \end_inset 
977 </cell>
978 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
979 \begin_inset Text
980
981 \layout Standard
982
983 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
984 \end_inset 
985 </cell>
986 </row>
987 </lyxtabular>
988
989 \end_inset 
990
991
992 \end_inset 
993
994
995 \layout Standard
996
997
998 \series bold 
999 \emph on 
1000 Nota: 
1001 \series default 
1002 \emph default 
1003 Como se puede observar, para distintas organizaciones el significado de
1004  los registros en este archivo es diferente y se utilizará de distinta manera
1005  en consecuencia.
1006 \layout Subsection
1007
1008 Comportamiento
1009 \layout Standard
1010
1011 Las declaraciones e implementación se pueden encontrar en 
1012 \series bold 
1013 \emph on 
1014 idx.h
1015 \series default 
1016 \emph default 
1017  y 
1018 \series bold 
1019 \emph on 
1020 idx.c
1021 \series default 
1022 \emph default 
1023  respectivamente:
1024 \layout List
1025 \labelwidthstring 00.00.0000
1026
1027
1028 \series bold 
1029 \emph on 
1030 Búsqueda:
1031 \series default 
1032 \emph default 
1033  Los registros del archivo indice (
1034 \series bold 
1035 .idx
1036 \series default 
1037 ), poseen una correspondencia 1 a 1, con los Id's de los registros en el
1038  archivo de datos (
1039 \series bold 
1040 .dat
1041 \series default 
1042 ).
1043  Con esto, queremos decir que el N-ésimo registro del archivo índice, será
1044  aquél que posea la información para localizar al registro cuyo 
1045 \family typewriter 
1046 id_reg
1047 \family default 
1048  es N, dentro del archivo de datos (
1049 \series bold 
1050 .dat
1051 \series default 
1052 ).
1053 \newline 
1054
1055 \series bold 
1056 NOTA:
1057 \series default 
1058  Cabe aclarar que por si bien el indice se encuentra ordenado por 
1059 \family typewriter 
1060 id_reg
1061 \family default 
1062 , los registros en el archivo de datos, por lo general no lo estarán.
1063  (ordenados por id).
1064  
1065 \newline 
1066 Ver: 
1067 \family typewriter 
1068 emufs_idx_buscar_registro()
1069 \layout List
1070 \labelwidthstring 00.00.0000
1071
1072
1073 \series bold 
1074 Alta:
1075 \series default 
1076  Ante la alta de un registro en el archivo de datos, se insetará un nuevo
1077  registro en el archivo índice, con el id_reg del registro en cuestion,
1078  y el offset u bloque donde se lo haya grabado en disco.
1079 \newline 
1080 Ver: 
1081 \family typewriter 
1082 emufs_idx_agregar()
1083 \layout List
1084 \labelwidthstring 00.00.0000
1085
1086
1087 \series bold 
1088 Baja:
1089 \series default 
1090  Ante el borrado de un registro del archivo de datos, se accederá el registro
1091  correspondiente en el índice, y se actualizara su LOCATION, estableciendolo
1092  en el valor especial 
1093 \family typewriter 
1094 EMUFS_NOT_FOUND
1095 \family default 
1096 , el cual indica que ese registro ha sido eliminado y por ende no se lo
1097  podrá localizar en el futuro.
1098  Como se verá mas adelante, según el tipo de organización física, el registro
1099  puede ser borrado concretamente del .
1100 \series bold 
1101 dat
1102 \series default 
1103  o nó.
1104  
1105 \newline 
1106 Ver: 
1107 \family typewriter 
1108 emufs_idx_borrar()
1109 \layout List
1110 \labelwidthstring 00.00.0000
1111
1112
1113 \series bold 
1114 Modificación:
1115 \series default 
1116  Ante la modificación en la posición física de un registro dentro del archivo
1117  de datos (por ejemplo luego del proceso de recompactación, se realizará
1118  la modificación respectiva del campo 
1119 \family typewriter 
1120 location
1121 \family default 
1122 .
1123 \newline 
1124 Ver: 
1125 \family typewriter 
1126 emufs_idx_actualizar()
1127 \layout Section
1128
1129
1130 \begin_inset LatexCommand \label{sec:fsc}
1131
1132 \end_inset 
1133
1134 Archivo de control de espacio libre
1135 \layout Standard
1136
1137 El archivo de espacio libre (
1138 \series bold 
1139 .fsc
1140 \series default 
1141 ) (espacio por bloque o gaps en archivo, según el tipo de organización física),
1142  tiene como función la administración del espacio libre, generado por previas
1143  eliminaciones de registros en el archivo de datos.
1144  El mismo, nos indicará donde hay lugar para insertar un nuevo registro.
1145 \layout Standard
1146
1147 Para el caso de una organización por bloque, nos dirá en que bloque o si
1148  se debe generar un nuevo bloque.
1149  En el caso de la organización sin bloques, nos indicará en que gap o si
1150  al final del archivo.
1151 \layout Standard
1152
1153 Los registros de este archivo se encuentran representados una estructura
1154  que indica un número de bloque u offset y el espacio libre disponible en
1155  el mismo (o apartir del mismo en el caso del offset).
1156 \layout Standard
1157
1158
1159 \series bold 
1160 Nota
1161 \series default 
1162 : Por requerimiento del algoritmo de compactación el tipo de organización
1163  física con reg long var, sin bloques, los gaps se graban en forma ordenada
1164  en el (.fsc).
1165  (El orden se corresponde con lo que hay en el .dat).
1166 \layout Subsection
1167
1168 Organización Física
1169 \layout Standard
1170
1171 Los registros de este archivo se encuentran representados a nivel codigo
1172  por el siguiente tipo de dato interno (
1173 \family typewriter 
1174 EMUFS_FSC
1175 \family default 
1176 ):
1177 \layout LyX-Code
1178
1179 typedef struct emufs_fsc_t { 
1180 \layout LyX-Code
1181
1182   EMUFS_BLOCK_ID marker;
1183 \layout LyX-Code
1184
1185   EMUFS_FREE freespace;
1186 \layout LyX-Code
1187
1188 } EMUFS_FSC;
1189 \layout Standard
1190
1191
1192 \series bold 
1193 \emph on 
1194
1195 \begin_inset Float table
1196 placement H
1197 wide false
1198 collapsed true
1199
1200 \layout Caption
1201
1202 Ejemplo de registro en archivo de control de espacio libre para un archivo
1203  con bloques
1204 \layout Standard
1205
1206
1207 \begin_inset  Tabular
1208 <lyxtabular version="3" rows="2" columns="3">
1209 <features>
1210 <column alignment="center" valignment="top" leftline="true" width="0">
1211 <column alignment="center" valignment="top" leftline="true" width="0">
1212 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1213 <row topline="true" bottomline="true">
1214 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1215 \begin_inset Text
1216
1217 \layout Standard
1218
1219 nro_bloque
1220 \end_inset 
1221 </cell>
1222 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1223 \begin_inset Text
1224
1225 \layout Standard
1226
1227 freespace
1228 \end_inset 
1229 </cell>
1230 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1231 \begin_inset Text
1232
1233 \layout Standard
1234
1235 \end_inset 
1236 </cell>
1237 </row>
1238 <row topline="true" bottomline="true">
1239 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1240 \begin_inset Text
1241
1242 \layout Standard
1243
1244 12
1245 \end_inset 
1246 </cell>
1247 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1248 \begin_inset Text
1249
1250 \layout Standard
1251
1252 120
1253 \end_inset 
1254 </cell>
1255 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1256 \begin_inset Text
1257
1258 \layout Standard
1259
1260 Indica que en el bloque 12, hay 120 bytes libres al final del mismo.
1261 \end_inset 
1262 </cell>
1263 </row>
1264 </lyxtabular>
1265
1266 \end_inset 
1267
1268
1269 \end_inset 
1270
1271  
1272 \begin_inset Float table
1273 placement H
1274 wide false
1275 collapsed true
1276
1277 \layout Caption
1278
1279 Ejemplo de registro en archivo de 
1280 \emph on 
1281 gaps
1282 \emph default 
1283  para un archivo sin bloques
1284 \layout Standard
1285
1286
1287 \begin_inset  Tabular
1288 <lyxtabular version="3" rows="2" columns="3">
1289 <features>
1290 <column alignment="center" valignment="top" leftline="true" width="0">
1291 <column alignment="center" valignment="top" leftline="true" width="0">
1292 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1293 <row topline="true" bottomline="true">
1294 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1295 \begin_inset Text
1296
1297 \layout Standard
1298
1299 offset
1300 \end_inset 
1301 </cell>
1302 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1303 \begin_inset Text
1304
1305 \layout Standard
1306
1307 freespace
1308 \end_inset 
1309 </cell>
1310 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1311 \begin_inset Text
1312
1313 \layout Standard
1314
1315 \end_inset 
1316 </cell>
1317 </row>
1318 <row topline="true" bottomline="true">
1319 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1320 \begin_inset Text
1321
1322 \layout Standard
1323
1324 12
1325 \end_inset 
1326 </cell>
1327 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1328 \begin_inset Text
1329
1330 \layout Standard
1331
1332 120
1333 \end_inset 
1334 </cell>
1335 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1336 \begin_inset Text
1337
1338 \layout Standard
1339
1340 Indica que a partir del byte 12 del archivo de datos, hay 120 bytes libres.
1341 \end_inset 
1342 </cell>
1343 </row>
1344 </lyxtabular>
1345
1346 \end_inset 
1347
1348
1349 \end_inset 
1350
1351
1352 \layout Standard
1353
1354
1355 \series bold 
1356 \emph on 
1357 Nota: 
1358 \series default 
1359 \emph default 
1360 Como se puede observar, para distintas organizaciones el significado de
1361  los registros en este archivo es diferente y se utilizará de distinta manera
1362  en consecuencia.
1363 \layout Subsection
1364
1365 Funciones principales
1366 \layout Standard
1367
1368 Las declaraciones e implementación se pueden encontrar en 
1369 \series bold 
1370 \emph on 
1371 fsc.h
1372 \series default 
1373 \emph default 
1374  y 
1375 \series bold 
1376 \emph on 
1377 fsc.c
1378 \series default 
1379 \emph default 
1380  respectivamente:
1381 \layout List
1382 \labelwidthstring 00.00.0000
1383
1384
1385 \series bold 
1386 Búsqueda:
1387 \series default 
1388  Ante la operación de alta de un registro en el archivo de datos, se realizará
1389  la búsqueda de espacio libre donde este podrá ser insertado.
1390  En el caso de organizaciones con bloques, se buscará en que 
1391 \family typewriter 
1392 nro_bloque
1393 \family default 
1394  se posee espacio suficiente para albergar el nuevo registro.
1395  En el caso de organizacion sin bloque, se buscará un gap o espacio libre
1396  en el archivo, obteniéndose en consecuencia, el 
1397 \family typewriter 
1398 offset
1399 \family default 
1400  hasta el mismo.
1401 \newline 
1402 Ver: 
1403 \family typewriter 
1404 emufs_fsc_buscar_lugar()
1405 \layout List
1406 \labelwidthstring 00.00.0000
1407
1408
1409 \series bold 
1410 Alta/Mod:
1411 \series default 
1412  Luego de una operación de baja o alta de un registro en el archivo de datos
1413  (
1414 \series bold 
1415 .dat
1416 \series default 
1417 ), incrementará o decrementará respectivamente el espacio libre en el archivo
1418  de datos, y esto deberá ser registrado, agregando un nuevo registro en
1419  el archivo de espacios libres (
1420 \series bold 
1421 .fsc
1422 \series default 
1423 ) o bien modificandoló.
1424 \newline 
1425
1426 \newline 
1427 En el caso de organizaciónes con bloques, se actualizará el valor del espacio
1428  libre 
1429 \family typewriter 
1430 freespace
1431 \family default 
1432  en el bloque (ya sea incrementandoló o decrementandoló) o bien se insertará
1433  un nuevo registro en caso de que se esté creando un nuevo bloque en el
1434  archivo de datos (en este caso no será debido a un alta o baja de registro
1435  como se mencionó al principio).
1436 \newline 
1437
1438 \newline 
1439 Para el caso de organización sin bloques, en el caso de baja de un registro
1440  de datos (
1441 \series bold 
1442 .dat
1443 \series default 
1444 ) se insertará un nuevo registro en el 
1445 \series bold 
1446 .fsc
1447 \series default 
1448  dando cuenta de la aparición de un nuevo gap en el archivo de datos (
1449 \series bold 
1450 .dat
1451 \series default 
1452 ), y en caso de estar este lindante con otro gap, se realizará el merge
1453  pertinente.
1454  (esto esta explicado más en profundidad en los casos particulares de organizaci
1455 ón fisica, registros variables sin bloques).
1456  Para el caso de una alta en el archivo de datos (
1457 \series bold 
1458 .dat
1459 \series default 
1460 ), el valor del gap donde se haya insertado se actualizará.
1461  
1462 \newline 
1463 Ver: 
1464 \family typewriter 
1465 emufs_fsc_agregar(), emufs_fsc_agregar_gap(), emufs_fsc_actualizar(), emufs_fsc_
1466 actualizar_gap().
1467 \layout List
1468 \labelwidthstring 00.00.0000
1469
1470
1471 \series bold 
1472 Baja
1473 \series default 
1474 : Unicamente para el caso de una organización que presente gaps en el archivo,
1475  se podrá dar a lugar la eliminación de un registro del archivo de espacios
1476  libres (
1477 \series bold 
1478 .fsc)
1479 \series default 
1480 .
1481  Esta situación tendrá efecto cuando se inserte un registro que entre perfecto
1482  en un gap disponible, y por ende el gap desaparecerá.
1483 \newline 
1484 Ver: 
1485 \family typewriter 
1486 emufs_fsc_borrar_gap()
1487 \layout Section
1488
1489
1490 \begin_inset LatexCommand \label{sec:did}
1491
1492 \end_inset 
1493
1494 Archivo de id's recuperables
1495 \layout Standard
1496
1497 El archivo de Id's liberado (
1498 \series bold 
1499 .did
1500 \series default 
1501 ) llevará cuenta de aquellos Id's de registros (
1502 \family typewriter 
1503 id_reg
1504 \family default 
1505 ) que ya no se encuentran siendo utilizados y fueron liberados por registros
1506  eliminados previamente.
1507  A través del mismo, se podrá realizar la reutilización de Id's ante la
1508  alta de nuevos registros.
1509 \layout Standard
1510
1511 A nivel físico, este archivo poseerá una secuencia de datos del tipo EMUFS_REG_I
1512 D, y el comportamiento del sistema de recuperación de Id's será el de una
1513  pila.
1514  Es decir, ante el requerimiento de un 
1515 \family typewriter 
1516 reg_id
1517 \family default 
1518  libre por una función del sistema como por ejemplo la alta de un nuevo
1519  registro, el API del archivo (
1520 \series bold 
1521 .did
1522 \series default 
1523 ), obtendrá el último dato del mismo (el 
1524 \emph on 
1525 Id
1526 \emph default 
1527  que fue liberado mas recientemente), y truncará el archivo eliminando el
1528  
1529 \emph on 
1530 Id
1531 \emph default 
1532  recuperado de la tabla.
1533  (LIFO, Last in First Out).
1534 \layout Subsection
1535
1536 Organización Física
1537 \layout Standard
1538
1539 Este archivo tiene registros de un solo campo, 
1540 \family typewriter 
1541 EMUFS_REG_ID
1542 \family default 
1543  el cual simboliza al id que fue liberado en un proceso de baja de registros.
1544 \layout Subsection
1545
1546 Funciones principales
1547 \layout Standard
1548
1549 Las declaraciones e implementación se pueden encontrar en 
1550 \series bold 
1551 \emph on 
1552 did.h
1553 \series default 
1554 \emph default 
1555  y 
1556 \series bold 
1557 \emph on 
1558 did.c
1559 \series default 
1560 \emph default 
1561  respectivamente
1562 \layout List
1563 \labelwidthstring 00.00.0000
1564
1565
1566 \series bold 
1567 Alta: 
1568 \series default 
1569 Ante la eliminación de un registro del archivo de datos (
1570 \series bold 
1571 .dat
1572 \series default 
1573 ) se procederá al agregado del correspondiente 
1574 \family typewriter 
1575 id_reg
1576 \family default 
1577  que fue liberado por dicha operación, al archivo 
1578 \series bold 
1579 .did
1580 \series default 
1581 .
1582 \family typewriter 
1583
1584 \newline 
1585
1586 \family default 
1587 Ver: 
1588 \family typewriter 
1589 emufs_did_agregar()
1590 \layout List
1591 \labelwidthstring 00.00.0000
1592
1593
1594 \series bold 
1595 Baja
1596 \series default 
1597  Cuando el sistema desee grabar un nuevo registro en el archivo de datos,
1598  este pedirá un 
1599 \family typewriter 
1600 id_reg
1601 \family default 
1602  disponible para el mismo.
1603  El sistema de administración de Id's libres, obtendrá el último 
1604 \emph on 
1605 id
1606 \emph default 
1607  que se guardó en el archivo (o se eliminó del archivo de datos), y truncará
1608  el archivo eliminandolo.
1609 \family typewriter 
1610
1611 \newline 
1612
1613 \family default 
1614 Ver: 
1615 \family typewriter 
1616 emufs_did_get_last()
1617 \layout Chapter
1618
1619
1620 \begin_inset LatexCommand \label{cha:tipo1}
1621
1622 \end_inset 
1623
1624 Archivo con bloques parametrizados y registros de longitud variable
1625 \layout Standard
1626
1627 Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
1628  intermedio entre el 
1629 \begin_inset LatexCommand \ref{cha:tipo2}
1630
1631 \end_inset 
1632
1633  y el 
1634 \begin_inset LatexCommand \ref{cha:tipo3}
1635
1636 \end_inset 
1637
1638  (cuenta tanto con bloques como con registros variables), hereda los inconvenien
1639 tes (y ventajas) de ambos, más los propios.
1640  Al implementar este tipo de archivo se puso enfásis en la eficiencia mientras
1641  esta no comprometa la mantenibilidad del código, es por esto que en algunas
1642  circunstancias no se hace un uso óptimo del espacio.
1643 \layout Standard
1644
1645 La implementación de este tipo de archivo puede ser encontrada en 
1646 \family typewriter 
1647 emufs/tipo1.c
1648 \family default 
1649  mientras que su interfaz pública está disponible en 
1650 \family typewriter 
1651 emufs/tipo1.h
1652 \family default 
1653 .
1654 \layout Section
1655
1656 Organización física
1657 \layout Standard
1658
1659 El archivo está compuesto por la 
1660 \emph on 
1661 cabecera general
1662 \emph default 
1663  (ver página 
1664 \begin_inset LatexCommand \pageref{sec:cabecera_gral}
1665
1666 \end_inset 
1667
1668 ).
1669  El valor que toma en este tipo de archivo es 0 (o el valor simbólico 
1670 \family typewriter 
1671 T1
1672 \family default 
1673  del tipo 
1674 \family typewriter 
1675 EMUFS_Tipo
1676 \family default 
1677 ).
1678  Luego le sigue una cabecera propia del archivo (un 
1679 \family typewriter 
1680 EMUFS_BLOCK_SIZE
1681 \family default 
1682 , 4 bytes) que almacena el tamaño del bloque que usa el archivo.
1683  De esta menera, al abrir un archivo de este tipo no se necesita tener ninguna
1684  información sobre él.
1685  A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
1686  en la cabecera antes mencionada.
1687 \layout LyX-Code
1688
1689 archivo
1690 \layout LyX-Code
1691
1692 +-----------+-----------+------------------------//-+
1693 \layout LyX-Code
1694
1695 |    tipo   | tam bloque| Cero o más bloques ...
1696  
1697 \backslash 
1698
1699 \backslash 
1700  |
1701 \layout LyX-Code
1702
1703 +-----------+-----------+------------------------//-+
1704 \layout LyX-Code
1705
1706 /- 4 bytes -/- 4 bytes -/
1707 \layout Subsection
1708
1709 Organización física de un bloque
1710 \layout Standard
1711
1712 Cada bloque no guarda información en sí, sólo se comporta como un contenedor
1713  de registros.
1714  Esto no significa que un bloque no tenga utilidad, el bloque es utilizado
1715  para proveer un acceso semi-aleatorio a los registros.
1716  Para esto se utiliza el archivo de índice (ver página 
1717 \begin_inset LatexCommand \ref{sec:idx}
1718
1719 \end_inset 
1720
1721 ), que almacena pares [identificador de registro, número de bloque].
1722  Para que sea suficiente este único índice para hallar un registro (siendo
1723  que puede haber más de un registro por bloque), es necesario 
1724 \emph on 
1725 alinear los registros a izquierda
1726 \emph default 
1727 .
1728  Esto significa que hay que asegurar que siempre los registros en un bloque
1729  se presenten de forma consecutiva, jamás permitiendo que haya un espacio
1730  libre entre registros (en un mismo bloque).
1731 \layout Standard
1732
1733 Podemos ver un ejemplo de esto en forma gráfica:
1734 \layout LyX-Code
1735
1736 bloque N-1 | bloque N                                | bloque N+1
1737 \layout LyX-Code
1738
1739 /----------+------------+------------+---------------+-----------/
1740 \layout LyX-Code
1741
1742
1743 \backslash 
1744           | registro 1 | registro 2 | espacio libre |           
1745 \backslash 
1746
1747 \layout LyX-Code
1748
1749 /----------+------------+------------+---------------+-----------/
1750 \layout LyX-Code
1751
1752            /------------- tamaño del bloque ---------/
1753 \layout Standard
1754
1755 De esta forma, una vez obtenido el número de bloque, se pueda recorrer secuencia
1756 lmente hasta encontrar el registro deseado.
1757  A fin de llevar el conteo de espacio libre se utiliza el archivo de control
1758  de espacio libre (ver página 
1759 \begin_inset LatexCommand \ref{sec:fsc}
1760
1761 \end_inset 
1762
1763 ), de forma tal que no sea necesario recorrer secuencialmente en busca de
1764  espacio libre al hacer una inserción.
1765 \layout Standard
1766
1767 Puede darse un caso excepcional en el que un registro sea más grande que
1768  un bloque, en este caso el registro se almacenará en N bloques consecutivos
1769  (siendo N la cantidad de bloques que necesita el registro), ocupando completos
1770  los todos los bloques a excepción del último, en el que posteriormente
1771  se pueden agregar más registros.
1772 \layout Subsubsection
1773
1774
1775 \begin_inset LatexCommand \label{sub:tipo1_reg}
1776
1777 \end_inset 
1778
1779 Organización física de un registro.
1780 \layout Standard
1781
1782 El registro es el que representa al dato realmente que se quiere almacenar.
1783  Para representar ese dato se necesita una determinada información de control,
1784  tanto para poder identificar el registro en un bloque (en búsquedas secuenciale
1785 s dentro del bloque) como para saber su longitud (dado que este tipo de
1786  archivo utiliza registros de tamaño variable).
1787 \layout Standard
1788
1789 Siguiendo la metodología general de E
1790 \begin_inset Formula $\mu$
1791 \end_inset 
1792
1793 FS, se optó por incluir esta información de control como una cabecera al
1794  comienzo del registro, siguiendo a esta los datos en sí.
1795  La cabecera está compuesta por un identificador (
1796 \family typewriter 
1797 id
1798 \family default 
1799 ) de registro (EMUFS_REG_ID, 4 bytes) seguido por el tamaño (
1800 \family typewriter 
1801 tamaño
1802 \family default 
1803 ) del registros (EMUFS_REG_SIZE, 4 bytes).
1804  Podemos ver gráficamente como se se compone un registro:
1805 \layout LyX-Code
1806
1807 registro id
1808 \layout LyX-Code
1809
1810 +-----------+-----------+------------------+
1811 \layout LyX-Code
1812
1813 |     id    |   tamaño  |   datos ...
1814       |
1815 \layout LyX-Code
1816
1817 +-----------+-----------+------------------+
1818 \layout LyX-Code
1819
1820 /- 4 bytes -/- 4 bytes -/- [tamaño] bytes -/
1821 \layout Subsubsection
1822
1823
1824 \begin_inset LatexCommand \label{sub:tipo1_reg_multi}
1825
1826 \end_inset 
1827
1828 Organización física de un registro más grande que un bloque (registro 
1829 \emph on 
1830 multibloque
1831 \emph default 
1832 ).
1833 \layout Standard
1834
1835 Puede darse el caso excepcional en que un registro sea de mayor longitud
1836  que un bloque.
1837  Al ser una situación excepcional, no siempre se resuelve de la forma más
1838  eficiente ni se mínimiza el espacio ocupado por datos de control (como
1839  se dijo anteriormente, se prefirió conservar la simpleza del código, adoptando
1840  algoritmos generales aunque no sea de la forma más eficiente o maximizando
1841  el uso del espacio para no perjudicar la mantenibilidad).
1842 \layout Standard
1843
1844 Para menejar un registro 
1845 \emph on 
1846 multibloque 
1847 \emph default 
1848 se optó por limitarlo a la siguiente estructura (suponiendo que el registro
1849  ocupa N bloques, con N > 1 y que un 
1850 \emph on 
1851 fragmento
1852 \emph default 
1853  es una porción del registro que entra en un bloque):
1854 \layout Itemize
1855
1856 Los primeros N-1 
1857 \emph on 
1858 fragmentos
1859 \emph default 
1860  se almacenan en bloques completos consecutivos.
1861 \layout Itemize
1862
1863 El último fragmento se almacena al comienzo del bloque inmediatamente posterior
1864  al penúltimo.
1865 \layout Itemize
1866
1867 Cada framento posee las cabeceras mencionadas en la sección 
1868 \begin_inset LatexCommand \ref{sub:tipo1_reg}
1869
1870 \end_inset 
1871
1872 , cuyo contenido es el siguiente:
1873 \begin_deeper 
1874 \layout Itemize
1875
1876 En 
1877 \family typewriter 
1878 id
1879 \family default 
1880  se almacena el identificador único obtenido al hacer el alta.
1881 \layout Itemize
1882
1883 En 
1884 \family typewriter 
1885 tamaño
1886 \family default 
1887  se almacena el tamaño del 
1888 \emph on 
1889 fragmento
1890 \emph default 
1891  actual más los tamaños de los 
1892 \emph on 
1893 fragmentos
1894 \emph default 
1895  posteriores, quedando en el primer 
1896 \emph on 
1897 fragmento
1898 \emph default 
1899  el tamaño completo del registro y en el último sólo el tamaño del 
1900 \emph on 
1901 fragmento
1902 \emph default 
1903  final.
1904 \end_deeper 
1905 \layout Standard
1906
1907 Como puede observarse, la información de control en los 
1908 \emph on 
1909 fragmentos
1910 \emph default 
1911  intermedios puede ser redundante, pero se conserva para poder realizar
1912  algoritmos genéricos (que se basan en que al principio de un bloque, si
1913  no está vacío, hay una cabecera de un registro) y para facilitar chequeos
1914  de integridad del archivo.
1915 \layout Standard
1916
1917 A continuación se presenta un ejemplo gráfico de un registro multibloque
1918  de 10 bytes (de contenido 
1919 \begin_inset Quotes eld
1920 \end_inset 
1921
1922 1234567890
1923 \begin_inset Quotes erd
1924 \end_inset 
1925
1926 ) almacenado en un archivo con bloques de 4 bytes:
1927 \layout LyX-Code
1928
1929 | bloque 0          | bloque 1          | bloque 2
1930 \layout LyX-Code
1931
1932 +-------------------+-------------------+-------------------+-//-+
1933 \layout LyX-Code
1934
1935 | registro 0 - 1/3  | registro 0 - 2/3  | registro 0 - 3/3..| 
1936 \backslash 
1937
1938 \backslash 
1939  |
1940 \layout LyX-Code
1941
1942 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
1943 \layout LyX-Code
1944
1945 || id | tam | datos||| id | tam | datos||| id | tam |dato|..| 
1946 \backslash 
1947
1948 \backslash 
1949  |
1950 \layout LyX-Code
1951
1952 ||----+-----+------+||----+-----+------+||----+-----+----+..| // |
1953 \layout LyX-Code
1954
1955 ||  0 |  10 | 1234 |||  0 |  6  | 5678 |||  0 |  2  | 90 |..| 
1956 \backslash 
1957
1958 \backslash 
1959  |
1960 \layout LyX-Code
1961
1962 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
1963 \layout LyX-Code
1964
1965 +-------------------+-------------------+-------------------+-
1966 \backslash 
1967
1968 \backslash 
1969 -+
1970 \layout Section
1971
1972 Funciones principales
1973 \layout Standard
1974
1975 Las funciones principales son las necesarias para completar la estructura
1976  EMUFS (ver página 
1977 \begin_inset LatexCommand \pageref{sub:EMUFS}
1978
1979 \end_inset 
1980
1981 ).
1982 \layout Subsection
1983
1984 Lectura de registros
1985 \layout Standard
1986
1987 Para leer un registro se hace uso del archivo de índice (ver página 
1988 \begin_inset LatexCommand \pageref{sec:idx}
1989
1990 \end_inset 
1991
1992 ), obteniéndose el número de bloque en donde está almacenado el registro
1993  a buscar.
1994  Una vez obtenido, se carga en memoria el bloque entero y se busca secuencialmen
1995 te en él (leyendo la cabecera de cada registro y salteando los datos) hasta
1996  encontrar el registro pedido.
1997  Una vez encontrado se lo copia y devuelve.
1998 \layout Standard
1999
2000 Si se tratara de un registro 
2001 \emph on 
2002 multibloque
2003 \emph default 
2004  (ver sección 
2005 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2006
2007 \end_inset 
2008
2009 ), se procede forma similar, sólo que se cargan en memoria uno a uno los
2010  bloques que componen el registro y se van copiando (y uniendo) los 
2011 \emph on 
2012 fragmentos
2013 \emph default 
2014  hasta completarlo.
2015 \layout Standard
2016
2017 Ver: 
2018 \family typewriter 
2019 emufs_tipo1_leer_registro()
2020 \layout Subsection
2021
2022 Altas de registros
2023 \layout Standard
2024
2025 Para realizar el alta de un registro, lo primero que se obtiene es un identifica
2026 dor, buscando primero en el archivo de identificadores recuperables (pág.
2027  
2028 \begin_inset LatexCommand \ref{sec:did}
2029
2030 \end_inset 
2031
2032 ) y de no haber ninguno, buscando el mayor identificador presente en el
2033  archivo de índice (pág.
2034  
2035 \begin_inset LatexCommand \ref{sec:idx}
2036
2037 \end_inset 
2038
2039 ) y sumándole uno.
2040  El paso siguiente es buscar un bloque con espacio libre suficiente como
2041  para almacenar el registro (y su cabecera) en el archivo de control de
2042  espacio libre (pág.
2043  
2044 \begin_inset LatexCommand \ref{sec:fsc}
2045
2046 \end_inset 
2047
2048 ) y cargarlo completo en memoria.
2049  De no encontrarse, se crea un bloque nuevo al final de archivo.
2050  En el bloque cargado en memoria, se agrega el registro nuevo (con su cabecera)
2051  al comienzo del espacio libre (calculado a partir del tamaño del bloque
2052  y el espacio libre en bloque) y se lo graba en disco.
2053  Finalmente se agrega (o actualiza) el identificador al archivo índice y
2054  el espacio libre en el bloque.
2055 \layout Standard
2056
2057 Si el registro ocupara más de un bloque (ver sección 
2058 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2059
2060 \end_inset 
2061
2062 ), se buscan N bloques consecutivos (todos los que necesite el registro)
2063  absolutamente libres
2064 \begin_inset Foot
2065 collapsed true
2066
2067 \layout Standard
2068
2069 Incluso el último bloque debe estar absolutamente libre para cumplir con
2070  las condiciones presentadas en la sección 
2071 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2072
2073 \end_inset 
2074
2075 .
2076 \end_inset 
2077
2078  y graba bloque a bloque cada 
2079 \emph on 
2080 fragmento
2081 \emph default 
2082  del registro (con sus cabeceras intermedias), al último 
2083 \emph on 
2084 fragmento
2085 \emph default 
2086  se lo trata de forma análoga a un registro 
2087 \emph on 
2088 simple
2089 \emph default 
2090 .
2091  Por cada bloque utilizado se actualiza el archivo de control de espacio
2092  libre.
2093 \layout Standard
2094
2095 Ver: 
2096 \family typewriter 
2097 emufs_tipo1_agregar_registro()
2098 \layout Subsection
2099
2100 Bajas de registros
2101 \layout Standard
2102
2103 Al eliminar un registro lo primero que se hace es actualizar los archivos
2104  de índice y de indentificadores recuperables, poniendo como número de bloque
2105  el valor especial 
2106 \family typewriter 
2107 EMUFS_NOT_FOUND
2108 \family default 
2109  y agregando el identificador del registro a borrar respectivamente.
2110  También se actualiza el archivo de control de espacio libre por cada bloque
2111  (en caso de ser más de uno, en registros 
2112 \emph on 
2113 multibloque
2114 \emph default 
2115 , se actualizan todos los bloques) y se carga el bloque en memoria para
2116  
2117 \emph on 
2118 alinear los datos a izquierda
2119 \emph default 
2120  (en caso de ser un registro 
2121 \emph on 
2122 multibloque
2123 \emph default 
2124 , esto se realiza sólo para el último bloque).
2125  Para alinear los datos, se recorre secuencialmente en bloque (leyendo la
2126  cabecera de cada registro y salteando los datos) hasta encontrar el registro
2127  a borrar.
2128  Encontrado el registro, se copian todos los bytes que se encuentran entre
2129  el fin del registro a borrar y el fin del bloque, en el comienzo del bloque
2130  borrado.
2131 \layout Standard
2132
2133 Ver: 
2134 \family typewriter 
2135 emufs_tipo1_borrar_registro()
2136 \layout Subsection
2137
2138 Modificación de registros
2139 \layout Standard
2140
2141 Se optó por un algoritmo simple y general, que usa las funciones de alto
2142  nivel mencionadas hasta ahora.
2143  Simplemento borra el registro y vuelve a crearlo.
2144  Al recuperar el último identificador de registro borrado, nos aseguramos
2145  de que se mantenga el identificador del registro.
2146 \layout Standard
2147
2148 Ver: 
2149 \family typewriter 
2150 emufs_tipo1_modificar_registro()
2151 \layout Subsection
2152
2153 Obtención de estadísticas
2154 \layout Standard
2155
2156 Es una función bastante simple, con una única complicación que mencionaremos
2157  más adelante.
2158 \layout Standard
2159
2160 Para obtener las máximas desviaciones, cantidad total de espacio libre,
2161  cantidad de registros y tamaño de los archivos auxiliares se utilizan las
2162  funciones apropiadas de los archivos auxiliares (ver secciones 
2163 \begin_inset LatexCommand \ref{sec:idx}
2164
2165 \end_inset 
2166
2167
2168 \begin_inset LatexCommand \ref{sec:fsc}
2169
2170 \end_inset 
2171
2172  y 
2173 \begin_inset LatexCommand \ref{sec:did}
2174
2175 \end_inset 
2176
2177 ).
2178 \layout Standard
2179
2180 Para obtener la cantidad de bloques se hace el siguiente calculo:
2181 \layout LyX-Code
2182
2183 cant_bloques = (tamaño_archivo_datos - tamaño_cabecera_archivo_datos)
2184 \layout LyX-Code
2185
2186                / tamaño_bloque;
2187 \layout Standard
2188
2189 Hasta aquí no hay mayores inconvenientes.
2190  El problema se presenta para calcular el tamaño de la información de control
2191  utilizada por el archivo de datos; se utiliza el siguiente cálculo:
2192 \layout LyX-Code
2193
2194 tam_info_control_datos = tamaño_cabecera_archivo_datos
2195 \layout LyX-Code
2196
2197                          + cant_registros * tamaño_cabecera_registro;
2198 \layout Standard
2199
2200 Aunque a simple vista esto parece acertado, no contempla el caso de los
2201  registros 
2202 \emph on 
2203 multibloque
2204 \emph default 
2205  (pág 
2206 \begin_inset LatexCommand \pageref{sub:tipo1_reg_multi}
2207
2208 \end_inset 
2209
2210 ), estos registros almacenan 
2211 \family typewriter 
2212 tamaño_cabecera_registro * N
2213 \family default 
2214 , donde 
2215 \family typewriter 
2216 N
2217 \family default 
2218  es la cantidad de bloques que ocupan.
2219  Salvar este caso sería muy costoso, porque habría que recorrer el archivo
2220  registro a registro, 
2221 \emph on 
2222 fragmento
2223 \emph default 
2224  a 
2225 \emph on 
2226 fragmento
2227 \emph default 
2228  e ir contando todas las cabeceras de registro que aparecen (similar a lo
2229  que se hace en la compactación, ver sección 
2230 \begin_inset LatexCommand \ref{sub:tipo1_compact}
2231
2232 \end_inset 
2233
2234 ).
2235  Al tratarse este de un caso excepcional, se optó por mantener la función
2236  simple ya que funciona bien en la mayoría de los casos.
2237 \layout Standard
2238
2239 Ver: 
2240 \family typewriter 
2241 emufs_tipo1_leer_estadisticas()
2242 \layout Subsection
2243
2244
2245 \begin_inset LatexCommand \label{sub:tipo1_compact}
2246
2247 \end_inset 
2248
2249 Compactación del archivo de datos
2250 \layout Standard
2251
2252 Esta función es una de las más simples, porque se limita a un algoritmo
2253  muy simple que utiliza las funciones de 
2254 \emph on 
2255 alto nivel
2256 \emph default 
2257  antes nombradas para realizar su tarea.
2258  Básicamente recorre el archivo de índices de registros, de comienzo a fin,
2259  leyendo el registro, borrándolo y volviéndolo a insertar.
2260  Si había espacio libre en un bloque anterior al que estaba, será insertado
2261  en él, si no volverá a grabarse en el lugar en que estaba.
2262  De esta forma se aprovechan todos los espacios libres intermedios, concluyendo
2263  con un archivo igual o más pequeño que el original.
2264 \layout Standard
2265
2266 Esta implementación no es la más eficiente, pero siendo que esta es una
2267  operación costosa y excepcional por naturaleza, se optó por mantener el
2268  algoritmo simple a costo de un poco de eficiencia.
2269 \layout Standard
2270
2271 Ver:
2272 \family typewriter 
2273  emufs_tipo1_compactar()
2274 \layout Section
2275
2276 Detalles de implementación (funciones internas, ver si lo ponemos o no)
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 false
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 Cuando nos encontramos con registros multibloque, se calcula cuantos bloques
3459  ocupará el registro de la siguiente manera: Cantidad de Bloques = 1 + Tamaño
3460  del Registro/(Tamaño del Bloque-Sizeof(EMUFS_REG_ID)
3461 \layout Standard
3462
3463 y con esta información se realiza un ciclo 
3464 \family typewriter 
3465 for
3466 \family default 
3467  que grabará tantas veces como sea necesario.
3468 \layout Standard
3469
3470 Ver: 
3471 \family typewriter 
3472 emufs_tipo3_grabar_registro()
3473 \layout Subsection
3474
3475 Borrar Registro
3476 \layout Standard
3477
3478 Borra un registro del archivo de datos, para esto levanta el bloque al que
3479  pertenece el archivo y ajusta los demás registros justificandolos hacia
3480  la izquierda.
3481 \layout Standard
3482
3483 Cabe destacar que para dar de baja un registro no hace falta borrarlo del
3484  archivo de datos, solo es necesario borrar las entradas en los archivos
3485  de índice, pero cuando se realiza el ajuste el algoritmo toma porciones
3486  del bloque del tamaño de un registro mas su encabezado - comenzando desde
3487  el siguiente al que fue borrado - y copia (sobreescribe) sobre el anterior.
3488  De esta manera, la información correspondiente al registro borrado no estará
3489  presente en el archivo de datos.
3490  Esto es una consecuencia del ajuste al borrar un registro, pudiendo no
3491  ser así, si no se realizara el mismo.
3492 \layout Standard
3493
3494 En el caso de los registros multibloque, se eliminará la porción del registro
3495  contenida en el primer bloque y se actualizarán de manera conveniente los
3496  archivos índice, para restaurarlos a un valor verdadero.
3497 \layout Standard
3498
3499 Ver: 
3500 \family typewriter 
3501 emufs_tipo3_borrar_registro()
3502 \layout Subsection
3503
3504 Leer Estadísticas
3505 \layout Standard
3506
3507 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
3508  cantidad de bloques, cantidad de registros, espacio libre total, espacio
3509  libre promedio, espacio libre máximo y mínimo, etc.
3510 \layout Standard
3511
3512 Esta información es el resultado de ciertos cálculos realizados tanto en
3513  el archivo de datos como en los archivos índice.
3514 \layout Standard
3515
3516 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
3517  del archivo de datos, espacio libre total, cantidad de registros, cantidad
3518  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
3519  libres, etc.
3520 \layout Standard
3521
3522 Ver: 
3523 \family typewriter 
3524 emufs_tipo3_leer_estadisticas()
3525 \layout Subsection
3526
3527 Compactar el Archivo
3528 \layout Standard
3529
3530 Esta función intenta reorganizar el archivo de manera que el espacio libre
3531  sea lo menor posible, recordando siempre que un registro no puede ser almacenad
3532 o en mas de un bloque excepto que el tamaño del registro sea mayor que el
3533  del bloque.
3534 \layout Standard
3535
3536 Para realizar esto, se aprovecha la funcionalidad de 
3537 \emph on 
3538 emufs_tipo3_grabar_registro() 
3539 \emph default 
3540 ya que esta tiene la capacidad de determinar una posición mas eficiente
3541  en el archivo para un registro.
3542  Por esto lo que se hace es levantar uno por uno los registros y volverlos
3543  a grabar, de ese modo todos los 
3544 \emph on 
3545 gaps 
3546 \emph default 
3547 que pudieron haberse formado por la eliminación de registros serán cubiertos
3548  por otros.
3549 \layout Standard
3550
3551 Al estar utilizando recuperación de 
3552 \emph on 
3553 id`s
3554 \emph default 
3555  borrados, esto me asegura que el registro borrado-guardado conservará el
3556  id al grabarse.
3557 \layout Standard
3558
3559 Al finalizar este proceso se verifica si existen bloques vacios para truncar
3560  el archivo.
3561  Lo mismo se debe hacer con el archivo de espacios libres .
3562 \emph on 
3563 fsc 
3564 \emph default 
3565 el cual disminuye su tamaño también.
3566 \layout Standard
3567
3568 Ver: 
3569 \family typewriter 
3570 void emufs_tipo3_compactar()
3571 \layout Section
3572
3573 Consideraciones y Políticas de Diseño
3574 \layout Standard
3575
3576 Se han tomado ciertas consideraciones para algunos casos particulares que
3577  se pueden presentar durante el uso/ejecución de la aplicación.
3578 \layout Enumerate
3579
3580 Cada registro tiene un encabezado que indica el 
3581 \emph on 
3582 id 
3583 \emph default 
3584 del mismo.
3585 \layout Enumerate
3586
3587 Si el tamaño del registro es mayor que el tamaño del bloque el registro
3588  se particionará en la cantidad de bloques que sea necesario, pero siempre
3589  se guardará desde el comienzo de un bloque, esto quiere decir que nunca
3590  se podrá encontrar un comienzo de registro en algún lugar de un bloque
3591  que no sea el comienzo del mismo.
3592 \layout Enumerate
3593
3594 Si el registro se divide en mas de un bloque, se le coloca el id como encabezado
3595  igualmente, pero en el archivo .
3596 \emph on 
3597 idx
3598 \emph default 
3599  solo se guarda el primer bloque.
3600  En el 
3601 \emph on 
3602 .fsc
3603 \emph default 
3604  se actualizan todos los bloques con el espacio libre que realmente tienen.
3605 \layout Chapter
3606
3607 Conclusiones
3608 \layout Standard
3609
3610 Las comparaciones, pruebas, etc...
3611 \the_end