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