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