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