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