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