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