]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - doc/informe.lyx
Chapter 5, Tipo2 uploaded y terminado al menos por ahora
[z.facultad/75.06/emufs.git] / doc / informe.lyx
1 #LyX 1.3 created this file. For more info see http://www.lyx.org/
2 \lyxformat 221
3 \textclass book
4 \language spanish
5 \inputencoding auto
6 \fontscheme palatino
7 \graphics default
8 \paperfontsize default
9 \spacing single 
10 \papersize a4paper
11 \paperpackage widemarginsa4
12 \use_geometry 0
13 \use_amsmath 0
14 \use_natbib 0
15 \use_numerical_citations 0
16 \paperorientation portrait
17 \secnumdepth 3
18 \tocdepth 3
19 \paragraph_separation indent
20 \defskip medskip
21 \quotes_language english
22 \quotes_times 2
23 \papercolumns 1
24 \papersides 1
25 \paperpagestyle default
26
27 \layout Title
28
29 E
30 \begin_inset Formula $\mu$
31 \end_inset 
32
33 FS
34 \layout Author
35
36 Nicolás Dimov
37 \newline 
38 Alan Kennedy
39 \newline 
40 Leandro Lucarella
41 \newline 
42 Ricardo Markiewicz
43 \layout Chapter
44
45 Introducción
46 \layout Chapter
47
48 Estructura común
49 \layout Section
50
51 Tipos
52 \layout Subsection
53
54 EMUFS
55 \layout Standard
56
57
58 \family typewriter 
59 EMUFS
60 \family default 
61 \emph on 
62  
63 \emph default 
64 es la estuctura principal que encapsula todas las funciones para el manejo
65  de un archivo de datos.
66 \layout Standard
67
68 Esta estructura consta de:
69 \layout Enumerate
70
71
72 \family typewriter 
73 EMUFS_Tipo
74 \family default 
75  que es un tipo enumerado que indica cual es la organización.
76 \layout Enumerate
77
78
79 \family typewriter 
80 EMUFS_BLOCK_SIZE
81 \family default 
82  indica el tamaño del bloque para los tipos 1 y 3.
83 \layout Enumerate
84
85
86 \family typewriter 
87 EMUFS_REG_SIZE
88 \family default 
89  indica el tamaño del registro, para el tipo 3 que posee tamaño constante.
90 \layout Enumerate
91
92
93 \family typewriter 
94 void **leer_bloque() 
95 \family default 
96 puntero a la función para leer un bloque.
97 \layout Enumerate
98
99
100 \family typewriter 
101 void *leer_bloque_raw()
102 \family default 
103  puntero a la función para leer un bloque, el anterior y el siguiente.
104 \layout Enumerate
105
106
107 \family typewriter 
108 void **leer_registro()
109 \family default 
110  puntero a la función para leer un registro.
111 \layout Enumerate
112
113
114 \family typewriter 
115 void **leer_registro_raw()
116 \family default 
117  puntero a la función para leer un registro con su encabezado.
118 \layout Enumerate
119
120
121 \family typewriter 
122 EMUFS_REG_ID *grabar_registro()
123 \family default 
124  puntero a la función para grabar un registro.
125 \layout Enumerate
126
127
128 \family typewriter 
129 EMUFS_REG_ID *modificar_registro() 
130 \family default 
131 puntero a la función para modificar un registro.
132 \layout Enumerate
133
134
135 \family typewriter 
136 int *borrar_registro()
137 \family default 
138  puntero a la función para borrar un registro.
139 \layout Enumerate
140
141
142 \family typewriter 
143 EMUFS_Estadisticas *leer_estadisticas()
144 \family default 
145  puntero a la función para cargar una estructura con las estadísticas.
146 \layout Enumerate
147
148
149 \family typewriter 
150 void *compactar()
151 \family default 
152  puntero a la función para compactar un archivo.
153 \layout Enumerate
154
155
156 \family typewriter 
157 char *nombre
158 \family default 
159  almacena el nombre del archivo sin extensión.
160 \layout Standard
161
162 Esta estructura define los valores de sus punteros según el tipo de organización
163  que se desee manejar.
164 \layout Standard
165
166 Por ejemplo si se desea crear un archivo de nombre 
167 \begin_inset Quotes eld
168 \end_inset 
169
170 facturas
171 \begin_inset Quotes erd
172 \end_inset 
173
174  organizado de la forma 3, se invoca a la función 
175 \family typewriter 
176 EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo,EMUFS_BLOCK_SIZE
177  tam_bloque, EMUFS_REG_SIZE tam_reg), 
178 \family default 
179 donde
180 \family typewriter 
181  filename 
182 \family default 
183 es el nombre que tendrán los archivos de datos e índice, 
184 \family typewriter 
185 tipo
186 \family default 
187  es el tipo de organización - bloques parametrizados y registros constantes
188  en este caso-, 
189 \family typewriter 
190 tam_bloque
191 \family default 
192  es el tamaño del bloque, y 
193 \family typewriter 
194 tam_reg
195 \family default 
196  es el tamaño del registro.
197 \layout Standard
198
199 Para las diferentes organizaciones puede ser que alguno de estos 2 últimos
200  valores no tengan sentido almacenarlas y tomaran un valor por defecto igual
201  a cero.
202 \layout Standard
203
204 Según el tipo de organización, se inicializan los punteros a las funciones.
205  Para el ejemplo 
206 \family typewriter 
207 leer_bloque
208 \family default 
209  se igualará a 
210 \family typewriter 
211 emufs_tipo3_leer_bloque()
212 \family default 
213 , y lo mismo sucede con los demás.
214 \layout Subsection
215
216 EMUFS_Tipo
217 \layout Subsection
218
219 EMUFS_Estadisticas
220 \layout Subsection
221
222 EMUFS_BLOCK_ID
223 \layout Standard
224
225 etc
226 \layout Section
227
228
229 \begin_inset LatexCommand \label{sec:cabecera_gral}
230
231 \end_inset 
232
233 Organización física general de un archivo E
234 \begin_inset Formula $\mu$
235 \end_inset 
236
237 FS
238 \layout Standard
239
240 Todo archivo E
241 \begin_inset Formula $\mu$
242 \end_inset 
243
244 FS está compuesto por 4 archivos a nivel de sistema operativo: archivo de
245  datos (con 3 formatos posibles, ver páginas 
246 \begin_inset LatexCommand \pageref{cha:tipo1}
247
248 \end_inset 
249
250
251 \begin_inset LatexCommand \pageref{cha:tipo2}
252
253 \end_inset 
254
255  y 
256 \begin_inset LatexCommand \pageref{cha:tipo3}
257
258 \end_inset 
259
260 ), archivo de índice (ver página 
261 \begin_inset LatexCommand \pageref{sec:idx}
262
263 \end_inset 
264
265 ), archivo de control de espacio libre (ver página 
266 \begin_inset LatexCommand \pageref{sec:fsc}
267
268 \end_inset 
269
270 ) y archivo de índices recuperables (ver página 
271 \begin_inset LatexCommand \pageref{sec:did}
272
273 \end_inset 
274
275 ).
276 \layout Standard
277
278 El archivo de datos está compuesto por:
279 \layout Itemize
280
281 Una 
282 \emph on 
283 cabecera general
284 \emph default 
285  compuesta por un 
286 \family typewriter 
287 int
288 \family default 
289  (4 bytes en plataformas Linux de 32 bits) que representa el tipo de archivo.
290 \layout Itemize
291
292 Datos dependientes del tipo de archivo.
293 \layout Standard
294
295 La 
296 \emph on 
297 cabecera general
298 \emph default 
299  es utilizada para poder detectar el formato de un archivo al abrirlo.
300  Los datos dependientes del tipo de archivo serán explicados en sus secciones
301  correspondientes.
302 \layout LyX-Code
303
304 archivo
305 \layout LyX-Code
306
307 +-----------+--------------------------------------------//-+
308 \layout LyX-Code
309
310 |    tipo   | Datos dependientes del tipo de archivo ...
311  
312 \backslash 
313
314 \backslash 
315  |
316 \layout LyX-Code
317
318 +-----------+--------------------------------------------//-+
319 \layout LyX-Code
320
321 /- 4 bytes -/
322 \layout Chapter
323
324 Archivos Auxiliares
325 \layout Comment
326
327 Por que los 3 tipos usan lo mismo.
328  Ventajas y desventajas.
329 \layout Section
330
331
332 \begin_inset LatexCommand \label{sec:idx}
333
334 \end_inset 
335
336 Archivo de índice
337 \layout Standard
338
339 Con la ayuda de un archivo de bloques y registros (de extensión .idx), podremos
340  ubicar cualquier registro existente dentro del archivo.
341 \layout Standard
342
343 El archivo de índice contiene una estructura que contiene el id de un registro
344  y el número de bloque al que pertenece.
345  Este archivo esta ordenado por 
346 \emph on 
347 id
348 \emph default 
349 , de modo que incrementa su tamaño cada vez que se grabe en el archivo de
350  datos un nuevo registro, excepto que un registro haya sido borrado con
351  anterioridad lo cual produce que al guardar un nuevo registro se actualice
352  y no crezca.
353 \layout Standard
354
355 Si un registro es borrado del archivo de datos, debe actualizarse el índice,
356  esto se logra colocando un flag que indique que el 
357 \emph on 
358 id
359 \emph default 
360  no pertenece a ningún bloque, hemos adoptado poner -1 en el campo location
361  de la estructura 
362 \family typewriter 
363 EMUFS_IDX
364 \family default 
365 .
366 \layout Standard
367
368 Es necesario que este archivo esté ordenado por 
369 \emph on 
370 id
371 \emph default 
372  de registro, ya que esto permitirá el acceso directo para la búsqueda de
373  un registro en el archivo de datos.
374 \layout Subsection
375
376 Organización física
377 \layout Standard
378
379 El tipo 
380 \family typewriter 
381 EMUFS_IDX
382 \family default 
383  define la estuctura de los registros de este archivo.
384 \layout Standard
385
386 Esta estructura está compuesta por:
387 \layout Itemize
388
389
390 \family typewriter 
391 EMUFS_REG_ID
392 \family default 
393  reg_id indica el 
394 \emph on 
395 id
396 \emph default 
397  del registro
398 \layout Itemize
399
400
401 \family typewriter 
402 EMUFS_BLOCK_ID
403 \family default 
404  location número de bloque donde se encuentra el registro.
405 \layout Standard
406
407
408 \family typewriter 
409 EMUFS_REG_ID
410 \family default 
411  y 
412 \family typewriter 
413 EMUFS_BLOCK_ID
414 \family default 
415  son 
416 \emph on 
417 unsigned long.
418 \layout Comment
419
420 ponerlo mas lindo...
421 \layout Subsection
422
423 Comportamiento (funciones generales)
424 \layout Section
425
426
427 \begin_inset LatexCommand \label{sec:fsc}
428
429 \end_inset 
430
431 Archivo de control de espacio libre
432 \layout Standard
433
434 El archivo de de espacios libres permite decidir a la hora de guardar un
435  registro, donde será guardado.
436  
437 \layout Standard
438
439 La estructura de este archivo está formada por un número que indica el bloque
440  y otro que indica el espacio libre en él.
441 \layout Standard
442
443 De esta manera al querer guardar un registro este archivo informará donde
444  cabe el mismo, previa invocación al la función 
445 \family typewriter 
446 EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *, EMUFS_FREE, EMUFS_FREE*)
447 \family default 
448  perteneciente a 
449 \emph on 
450 fsc.h,
451 \emph default 
452  la cual devuelve el número de bloque donde entra el registro o -1 si no
453  hay un bloque con lugar suficiente, y toma como parámetros una estructura
454  
455 \family typewriter 
456 EMUFS
457 \family default 
458 , y dos 
459 \family typewriter 
460 EMUFS_FREE
461 \family default 
462  donde el segndo parámetro es el tamaño buscado, y el tercero devuelve el
463  tamaño disponible.
464 \layout Standard
465
466 De la misma manera, al borrar un registro este archivo debe ser actualizado
467  colocando el nuevo espacio libre en el bloque.
468 \layout Subsection
469
470 Organización Física
471 \layout Standard
472
473 La estuctura que define este archivo es la siguiente:
474 \layout Standard
475
476
477 \family typewriter 
478 EMUFS_FSC
479 \family default 
480  que contiene:
481 \layout Itemize
482
483
484 \family typewriter 
485 EMUFS_BLOCK_ID
486 \family default 
487  indica el número de bloque
488 \layout Itemize
489
490
491 \family typewriter 
492 EMUFS_FREE
493 \family default 
494  freespace indica la cantidad de espacio libre que queda en el bloque.
495 \layout Standard
496
497
498 \family typewriter 
499 EMUFS_FSC
500 \family default 
501  y 
502 \family typewriter 
503 EMUFS_FREE
504 \family default 
505  son 
506 \emph on 
507 unsiged long int
508 \layout Subsection
509
510 Comportamiento
511 \layout Section
512
513
514 \begin_inset LatexCommand \label{sec:did}
515
516 \end_inset 
517
518 Archivo de índices recuperables
519 \layout Standard
520
521 Este archivo funciona como una pila de i
522 \emph on 
523 d`s
524 \emph default 
525  borrados, es decir, cuando se borra un registro el 
526 \emph on 
527 id
528 \emph default 
529  se almacena en este archivo y será recuperado cuando se desee grabar un
530  registro nuevo, de esta manera se aprovechan todos los 
531 \emph on 
532 id`s
533 \emph default 
534  sin necesidad de crear uno nuevo cada vez que se borra y graba un registro.
535 \layout Subsection
536
537 Estructura Física
538 \layout Standard
539
540 Este archivo tiene registros de un solo campo, 
541 \family typewriter 
542 EMUFS_REG_ID
543 \family default 
544  el cual simboliza al id almacenado.
545 \layout Subsection
546
547 Comportamiento
548 \layout Standard
549
550 Las declaraciones e implementación se pueden encontrar en 
551 \emph on 
552 did.h
553 \emph default 
554  y 
555 \emph on 
556 did.c
557 \emph default 
558  respectivamente
559 \layout Itemize
560
561
562 \series bold 
563 Agregar: 
564 \series default 
565 agrega un 
566 \emph on 
567 id 
568 \emph default 
569 al archivo, el cual será el primero recuperado.
570  
571 \family typewriter 
572 Ver: emufs_did_agregar()
573 \layout Itemize
574
575
576 \series bold 
577 Obtener el último:
578 \series default 
579  Obtiene el último 
580 \emph on 
581 id
582 \emph default 
583  que se guardó en el archivo (o se eliminó del archivo de datos), y trunca
584  el archivo.
585  
586 \family typewriter 
587 Ver: emufs_did_get_last()
588 \layout Chapter
589
590
591 \begin_inset LatexCommand \label{cha:tipo1}
592
593 \end_inset 
594
595 Archivo con bloques parametrizados y registros de longitud variable
596 \layout Standard
597
598 Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
599  intermedio entre el 
600 \begin_inset LatexCommand \ref{cha:tipo2}
601
602 \end_inset 
603
604  y el 
605 \begin_inset LatexCommand \ref{cha:tipo3}
606
607 \end_inset 
608
609  (cuenta tanto con bloques como con registros variables), hereda los inconvenien
610 tes (y ventajas) de ambos, más los propios.
611  Al implementar este tipo de archivo se puso enfásis en la eficiencia mientras
612  esta no comprometa la mantenibilidad del código, es por esto que en algunas
613  circunstancias no se hace un uso óptimo del espacio.
614 \layout Standard
615
616 La implementación de este tipo de archivo puede ser encontrada en 
617 \family typewriter 
618 emufs/tipo1.c
619 \family default 
620  mientras que su interfaz pública está disponible en 
621 \family typewriter 
622 emufs/tipo1.h
623 \family default 
624 .
625 \layout Section
626
627 Organización física
628 \layout Standard
629
630 El archivo está compuesto por la 
631 \emph on 
632 cabecera general
633 \emph default 
634  (ver página 
635 \begin_inset LatexCommand \pageref{sec:cabecera_gral}
636
637 \end_inset 
638
639 ).
640  El valor que toma en este tipo de archivo es 0 (o el valor simbólico 
641 \family typewriter 
642 T1
643 \family default 
644  del tipo 
645 \family typewriter 
646 EMUFS_Tipo
647 \family default 
648 ).
649  Luego le sigue una cabecera propia del archivo (un 
650 \family typewriter 
651 EMUFS_BLOCK_SIZE
652 \family default 
653 , 4 bytes) que almacena el tamaño del bloque que usa el archivo.
654  De esta menera, al abrir un archivo de este tipo no se necesita tener ninguna
655  información sobre él.
656  A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
657  en la cabecera antes mencionada.
658 \layout LyX-Code
659
660 archivo
661 \layout LyX-Code
662
663 +-----------+-----------+------------------------//-+
664 \layout LyX-Code
665
666 |    tipo   | tam bloque| Cero o más bloques ...
667  
668 \backslash 
669
670 \backslash 
671  |
672 \layout LyX-Code
673
674 +-----------+-----------+------------------------//-+
675 \layout LyX-Code
676
677 /- 4 bytes -/- 4 bytes -/
678 \layout Subsection
679
680 Organización física de un bloque
681 \layout Standard
682
683 Cada bloque no guarda información en sí, sólo se comporta como un contenedor
684  de registros.
685  Esto no significa que un bloque no tenga utilidad, el bloque es utilizado
686  para proveer un acceso semi-aleatorio a los registros.
687  Para esto se utiliza el archivo de índice (ver página 
688 \begin_inset LatexCommand \ref{sec:idx}
689
690 \end_inset 
691
692 ), que almacena pares (identificador de registro, número de bloque).
693  Para que sea suficiente este único índice para hallar un registro (siendo
694  que puede haber más de un registro por bloque), es necesario 
695 \emph on 
696 alinear los registros a izquierda
697 \emph default 
698 .
699 \layout LyX-Code
700
701 bloque N-1 | bloque N                                    | bloque N+1
702 \layout LyX-Code
703
704 /----------+------------+------------+-------------------+-----------/
705 \layout LyX-Code
706
707
708 \backslash 
709           | registro 1 | registro 2 | espacio libre ...
710  |           
711 \backslash 
712  /----------+------------+------------+-------------------+-----------/
713 \layout Standard
714
715 De forma tal que una vez obtenido el número de bloque se pueda recorrer
716  secuencialmente hasta encontrar el registro deseado.
717  A fin de llevar el conteo de espacio libre se utiliza el archivo de control
718  de espacio libre (ver página 
719 \begin_inset LatexCommand \ref{sec:fsc}
720
721 \end_inset 
722
723 ), de forma tal que no sea necesario recorrer secuencialmente en busca de
724  espacio libre al hacer una inserción.
725 \layout Standard
726
727 Puede darse un caso excepcional en el que un registro sea más grande que
728  un bloque, en este caso el registro se almacenará en N bloques consecutivos
729  (siendo N la cantidad de bloques que necesita el registro), ocupando completos
730  los todos los bloques a excepción del último, en el que posteriormente
731  se pueden agregar más registros.
732 \layout Section
733
734 Comportamiento (funciones de la interfáz)
735 \layout Section
736
737 Detalles de implementación (funciones internas, ver si lo ponemos o no)
738 \layout Chapter
739
740
741 \begin_inset LatexCommand \label{cha:tipo2}
742
743 \end_inset 
744
745 Archivo sin bloques y registros de longitud variable
746 \layout Standard
747
748 Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
749  de longitud variable sin realizar su agrupación en bloques, y como veremos
750  en la siguiente sección, tambien permitirá la administración de gaps que
751  queden en el archivo luego de operaciones de baja de registros.
752 \layout Section
753
754 Organización física
755 \layout Standard
756
757 Este tipo de archivo realizará el almacenamiento de registros de longitud
758  variable en disco, su borrado y modificación sin la utilización de bloques
759  de ningún tipo.
760  Su implementación se encuentra en los archivos fuente (
761 \series bold 
762 tipo2.c
763 \series default 
764  y 
765 \series bold 
766 tipo2.h
767 \series default 
768 ).
769 \layout Standard
770
771 Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
772  simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
773  de archivo en cuestión.
774 \layout Standard
775
776 Para poder entender mejor la organización fisica de este tipo de archivo,
777  tomemos el caso hipotético en el que se encuentran grabados 
778 \series bold 
779 dos registros
780 \series default 
781  (comenzando desde registro 0) de 
782 \series bold 
783 30 bytes
784 \series default 
785 , y 
786 \series bold 
787 25 bytes
788 \series default 
789 , respectivamente.
790  Supongamos también que entre el registro 0 y 1 se encontraba un 
791 \series bold 
792 registro de 10 bytes
793 \series default 
794  que fue 
795 \series bold 
796 borrado
797 \series default 
798 , generando un 
799 \series bold 
800 gap
801 \series default 
802  
803 \series bold 
804 o freespace
805 \series default 
806 .
807  Si miramos al archivo de datos (.dat) en el disco nos encontraremos con
808  lo siguiente: 
809 \begin_inset Float figure
810 placement H
811 wide false
812 collapsed true
813
814 \layout Caption
815
816 Organización física de los registros en disco
817 \layout Standard
818
819
820 \begin_inset Graphics
821         filename graphics/Example1.png
822         width 100text%
823
824 \end_inset 
825
826
827 \end_inset 
828
829
830 \layout Standard
831
832 Como se puede observar, a nivel físico cada registro grabado esta compuesto
833  por un Header cuyo tamaño total es de 8 bytes (
834 \series bold 
835 EMUFS_REG_ID
836 \series default 
837  + 
838 \series bold 
839 EMUFS_REG_SIZE
840 \series default 
841 ), y posteriormente el registro (bloque de datos) en sí.
842  Luego se encuentra el espacio libre de 18 bytes dejado por el registro
843  de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
844  el segundo registro mencionado.dsds
845 \layout Subsection
846
847 Comportamiento Particular de los Archivos Auxiliares
848 \layout Standard
849
850 Como fue explicado al inicio de la documentación, la implementación de cualquier
851 a de las tres organizaciones físicas de archivos presenta la necesidad de
852  poseer tres archivos auxiliares que actuarán como índice de direcciones
853  de registro (.
854 \series bold 
855 idx
856 \series default 
857 ), administrador de espacio libre (
858 \series bold 
859 .fsc
860 \series default 
861 ) y administrador de Id's liberados (
862 \series bold 
863 .did
864 \series default 
865 ) respectivamente.
866 \layout Standard
867
868 No obstante, cada tipo de organización presentara sus particularidades respecto
869  de estos tres archivos, las cuales describiremos a continuación en caso
870  de haberla.
871 \layout Subsubsection
872
873 Archivo índice o de posiciones relativas (.idx)
874 \layout Standard
875
876 El archivo indice (
877 \series bold 
878 .idx
879 \series default 
880 ), permite la localizacin de los registros en el .DAT de forma directa, mediante
881  la obtención de su offset o posición relativa respecto del inicio del 
882 \series bold 
883 .dat
884 \series default 
885  en donde se encuentra un registro dado, indicado por su ID.
886 \layout Standard
887
888 Así pues, si tomamos el ejemplo descripto al inicio de este capítudlo, tendremos
889  las siguientes entradas en el archivo indice 
890 \series bold 
891 .idx
892 \series default 
893  :
894 \newline 
895
896 \layout Standard
897
898
899 \begin_inset  Tabular
900 <lyxtabular version="3" rows="3" columns="3">
901 <features>
902 <column alignment="center" valignment="top" leftline="true" width="0">
903 <column alignment="center" valignment="top" leftline="true" width="0">
904 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
905 <row topline="true" bottomline="true">
906 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
907 \begin_inset Text
908
909 \layout Standard
910
911
912 \emph on 
913 ID_REGISTRO
914 \end_inset 
915 </cell>
916 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
917 \begin_inset Text
918
919 \layout Standard
920
921
922 \emph on 
923 OFFSET
924 \end_inset 
925 </cell>
926 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
927 \begin_inset Text
928
929 \layout Standard
930
931 \end_inset 
932 </cell>
933 </row>
934 <row topline="true">
935 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
936 \begin_inset Text
937
938 \layout Standard
939
940
941 \series bold 
942 0
943 \end_inset 
944 </cell>
945 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
946 \begin_inset Text
947
948 \layout Standard
949
950
951 \series bold 
952 4
953 \end_inset 
954 </cell>
955 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
956 \begin_inset Text
957
958 \layout Standard
959
960 El primer registro (reg0) comienza en el byte 4
961 \end_inset 
962 </cell>
963 </row>
964 <row topline="true" bottomline="true">
965 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
966 \begin_inset Text
967
968 \layout Standard
969
970 1
971 \end_inset 
972 </cell>
973 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
974 \begin_inset Text
975
976 \layout Standard
977
978
979 \series bold 
980 60
981 \end_inset 
982 </cell>
983 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
984 \begin_inset Text
985
986 \layout Standard
987
988 El segundo registro (reg1) comienza en el byte 60
989 \end_inset 
990 </cell>
991 </row>
992 </lyxtabular>
993
994 \end_inset 
995
996
997 \layout Standard
998
999
1000 \series bold 
1001 \emph on 
1002 \SpecialChar ~
1003
1004 \newline 
1005 Observación:
1006 \series default 
1007 \emph default 
1008  LOCATION indica donde comienza el header del registro buscado, y por consiguien
1009 te luego del header tendremos el registro en sí (los datos).
1010 \layout Subsubsection
1011
1012 Achivo de Gaps / Espacios Libres (.fsc)
1013 \layout Standard
1014
1015 El archivo de espacios libres o gaps (.fsc), tiene como función la administracion
1016  del espacio libre o gaps (agujeros), generados por previas eliminaciones
1017  de registros en el archivo de datos.
1018  El mismo, nos indicará donde hay lugar para insertar un nuevo registro
1019  (se podrán insertar en algún gap acorde, o bien al final del archivo).
1020  Este archivo será utilizado tambien para el proceso de compactación de
1021  un archivo, explicado luego.
1022 \layout Standard
1023
1024 Así pues, si tomamos el ejemplo descripto al inicio del documento, tendremos
1025  las siguientes entradas en el archivo índice 
1026 \series bold 
1027 .fsc
1028 \series default 
1029  : 
1030 \newline 
1031
1032 \newline 
1033
1034 \begin_inset  Tabular
1035 <lyxtabular version="3" rows="2" columns="3">
1036 <features>
1037 <column alignment="center" valignment="top" leftline="true" width="0">
1038 <column alignment="center" valignment="top" leftline="true" width="0">
1039 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1040 <row topline="true" bottomline="true">
1041 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1042 \begin_inset Text
1043
1044 \layout Standard
1045
1046
1047 \emph on 
1048 OFFSET
1049 \end_inset 
1050 </cell>
1051 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1052 \begin_inset Text
1053
1054 \layout Standard
1055
1056
1057 \emph on 
1058 FREESPACE
1059 \end_inset 
1060 </cell>
1061 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1062 \begin_inset Text
1063
1064 \layout Standard
1065
1066 \end_inset 
1067 </cell>
1068 </row>
1069 <row topline="true" bottomline="true">
1070 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1071 \begin_inset Text
1072
1073 \layout Standard
1074
1075
1076 \series bold 
1077 42
1078 \end_inset 
1079 </cell>
1080 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1081 \begin_inset Text
1082
1083 \layout Standard
1084
1085
1086 \series bold 
1087 18
1088 \end_inset 
1089 </cell>
1090 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1091 \begin_inset Text
1092
1093 \layout Standard
1094
1095 18 bytes libres a partir del byte 42 del .dat
1096 \end_inset 
1097 </cell>
1098 </row>
1099 </lyxtabular>
1100
1101 \end_inset 
1102
1103
1104 \layout Standard
1105
1106
1107 \series bold 
1108 \emph on 
1109 \SpecialChar ~
1110
1111 \newline 
1112 Nota:
1113 \series default 
1114 \emph default 
1115  Por requerimiento del algoritmo de compactación, los gaps se graban en
1116  forma ordenada en el (.fsc).
1117  (El orden se corresponde con lo que hay en el .dat)
1118 \layout Subsubsection*
1119
1120 GAP Merging
1121 \layout Standard
1122
1123 Si bien la utilización concreta de los GAPS será explicada posteriormente
1124  en la ALTA y BAJA de registros, debemos remarcar la funcionalidad de MERGING
1125  que posee nuestro sistema FSC.
1126 \layout Standard
1127
1128 Ante la eliminación de un registro del archivo de datos, se generara por
1129  consiguiente un gap o espacio libre en alguna posición del archivo.
1130  Ese gap deberá ser registrado en el archivo de gaps (.fsc).
1131  Ahora bien, nuestro sistema de gaps, contemplará como es debido, la posibilidad
1132  de que se haya eliminado un registro que posee un GAP por delante, un GAP
1133  por detrás, o bien un GAP por delante y por detrás del mismo.
1134 \layout Standard
1135
1136 Nuestro sistema actuará en consecuencia, realizando un merge de los espacios
1137  libres, y unificándolos en una UNICA entrada en el archivo .fsc, que contendrá
1138  como dato de freespace, la suma correspondiente de los espacios libres
1139  antes mencionados.
1140 \layout Subsubsection
1141
1142 Archivo de ID's liberados (.did)
1143 \layout Standard
1144
1145 El archivo de ID's liberados no presenta ningún aspecto particular en este
1146  tipo de organización.
1147  Remitirse al capítulo correspondiente a los archivos auxiliares para consultar
1148  su estructura y funcionamiento.
1149 \layout Section
1150
1151 Comportamiento (funciones de la interfaz)
1152 \layout Standard
1153
1154 Dentro de 
1155 \series bold 
1156 \emph on 
1157 tipo2.h
1158 \series default 
1159 \emph default 
1160  y 
1161 \series bold 
1162 \emph on 
1163 tipo2.c
1164 \series default 
1165 \emph default 
1166  se encuentran las cabeceras y la implementación de las funciones principales
1167  respectivamente, las cuales dan funcionalidad a esta organización.
1168  
1169 \layout Standard
1170
1171 A continuación se comentará el funcionamiento algunas de las mas importantes.
1172 \layout Subsection
1173
1174 Lectura de registros
1175 \layout Standard
1176
1177 Como se vió al comienzo, los registros en este tipo de archivo no se encuentran
1178  agrupados en bloques de ninguna índole y estan dispersos a lo largo del
1179  archivo, con la particularidad de que pueden existir gaps o espacio libre,
1180  entre dos registros dados.
1181 \layout Standard
1182
1183 Por ende la lectura de registros en este tipo de organización es muy simple
1184  y dada la inexistencia de bloques, el procedimiento será el siguiente:
1185 \layout Enumerate
1186
1187 Se determina el offset en bytes, donde comienza el registro deseado, a través
1188  de su ID, buscando la misma en el archivo índice (
1189 \series bold 
1190 .idx
1191 \series default 
1192 )
1193 \layout Enumerate
1194
1195 Ya determinada la posición física del registro dentro del archivo de datos
1196  (
1197 \series bold 
1198 .dat
1199 \series default 
1200 ), nos posicionamos en la misma, y leemos el header del registro (
1201 \series bold 
1202 IDReg
1203 \series default 
1204  + 
1205 \series bold 
1206 RegSize
1207 \series default 
1208 ).
1209  Contando así con el tamaño del registro, procedemos a leer el mismo (los
1210  datos), dando por finalizada la lectura.
1211 \layout Standard
1212
1213 Ver: 
1214 \family typewriter 
1215 emufs_tipo2_leer_registro()
1216 \layout Subsection
1217
1218 Altas de registros
1219 \layout Standard
1220
1221 En el proceso de alta de registros entrarán en juego dos archivos descriptos
1222  en la 
1223 \emph on 
1224 sección de archivos auxiliares
1225 \emph default 
1226 , siendo estos el archivo índice (
1227 \series bold 
1228 .idx
1229 \series default 
1230 ), y el archivo de gaps / espacios libres (
1231 \series bold 
1232 .fsc
1233 \series default 
1234 ).
1235 \layout Standard
1236
1237 Así pues, a la hora de realizar una inserción de un registro en el archivo
1238  de datos, el procedimiento será el siguiente:
1239 \layout Enumerate
1240
1241 Calculamos el espacio que necesitaremos para el registro: sizeof(
1242 \series bold 
1243 EMUFS_REG_ID
1244 \series default 
1245 ) + sizeof(
1246 \series bold 
1247 EMUFS_REG_SIZE
1248 \series default 
1249 ) + sizeof(registro).
1250 \layout Enumerate
1251
1252 Determinamos donde debemos insertar el registro, ya sea un gap donde entre,
1253  o bien al final del archivo.
1254 \layout Enumerate
1255
1256 Insertamos el registro e información de control (
1257 \series bold 
1258 header
1259 \series default 
1260 +
1261 \series bold 
1262 data
1263 \series default 
1264 ), en la posición indicada en el paso 2.
1265 \layout Enumerate
1266
1267 En caso de haber utilizado un GAP, actualizamos el espacio libre restante
1268  en el mismo y en caso de que se haya utilizado al totalidad del GAP, se
1269  lo elimina del archivo (
1270 \series bold 
1271 .fsc
1272 \series default 
1273 ).
1274 \layout Enumerate
1275
1276 Actualizamos la entrada correspondiente al registro ingresado (determinada
1277  por su RegID), en el archivo índice (
1278 \series bold 
1279 .idx
1280 \series default 
1281 ), indicando su offset donde podrá ser accedido luego.
1282 \layout Standard
1283
1284 Ver: 
1285 \family typewriter 
1286 emufs_tipo2_agregar_registro()
1287 \layout Subsection
1288
1289 Bajas de registros
1290 \layout Standard
1291
1292 En el proceso de baja de registros entrarán en juego los tres archivos descripto
1293 s en la 
1294 \emph on 
1295 sección de archivos auxiliares
1296 \emph default 
1297 , siendo estos el archivo índice (
1298 \series bold 
1299 .idx
1300 \series default 
1301 ), el archivo de gaps / espacios libres (
1302 \series bold 
1303 .fsc
1304 \series default 
1305 ) y el archivo de ID's liberados (
1306 \series bold 
1307 .did
1308 \series default 
1309 ).
1310 \layout Standard
1311
1312 Dado que en la implementación de este tipo de organización física contamos
1313  con los gaps o espacios libres entre registros, no se eliminará fisicamente
1314  el registro del archivo de datos (
1315 \series bold 
1316 .dat
1317 \series default 
1318 ), pues entonces carecería de sentido el archivo anteriormente mencionado
1319  (
1320 \series bold 
1321 .fsc
1322 \series default 
1323 ).
1324  En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
1325  y se marca fisicamente en el archivo de datos la eliminación mediante un
1326  fill de los bytes correspondientes con un caracter nulo.
1327  (hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
1328 \layout Standard
1329
1330 El proceso de baja o eliminación de un registro constará luego de los siguientes
1331  pasos:
1332 \layout Enumerate
1333
1334 Se obtiene el offset o posición relativa en donde se encuentra grabado el
1335  registro dentro del archivo de datos.
1336 \layout Enumerate
1337
1338 Se obtiene el tamaño del registro y se realiza un dummyfill del sector del
1339  archivo correspondiente al registro que se está dando de baja.
1340  (Se rellena la zona correspondiente a su header+data).
1341 \layout Enumerate
1342
1343 Se agrega el GAP generado al archivo de gaps o espacios libres, y en caso
1344  de haberse generado un GAP lindante con otro GAP, se realizará un merge
1345  de los mismos y se los registrará bajo una única entrada en el archivo
1346  de espacios libres (.fsc).
1347 \layout Enumerate
1348
1349 Se agrega el ID que fue liberado, al archivo de ID's liberados (
1350 \series bold 
1351 .did
1352 \series default 
1353 ), al final del mismo (
1354 \emph on 
1355 pila
1356 \emph default 
1357 ).
1358 \layout Enumerate
1359
1360 Se marca en el archivo índice (
1361 \series bold 
1362 .idx
1363 \series default 
1364 ) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
1365  al registro recién eliminado (se le cambia el valor al n-esimo registro,
1366  donde N = IDReg del reg eliminado).
1367 \layout Standard
1368
1369 Ver: 
1370 \family typewriter 
1371 emufs_tipo2_borrar_registro()
1372 \layout Subsection
1373
1374 Modificación de registros
1375 \layout Standard
1376
1377 Dada la naturaleza del archivo de ID's liberados, y el manejo de espacio
1378  libre del que consta esta organización de archivo, el proceso de modificación
1379  de un registro se limita a los siguientes pasos:
1380 \layout Enumerate
1381
1382 Se realiza la lectura del registro, mediante el respectivo procedimiento
1383  ya desarollado anteriormente.
1384 \layout Enumerate
1385
1386 Una vez que se cuenta con los nuevos datos modificados, se procede a dar
1387  de baja el registro que ha sido modificado, e inmediatamente después se
1388  realiza una inserción con los nuevos datos.
1389 \layout Standard
1390
1391
1392 \series bold 
1393 \emph on 
1394 NOTA:
1395 \series default 
1396 \emph default 
1397  Como fue indicado, dada la naturaleza de PILA del subsistema de administración
1398  de ID liberados, es asegurado que la nueva inserción del registro modificado
1399  se realizará con el mismo RegID.
1400 \layout Standard
1401
1402 Ver: 
1403 \family typewriter 
1404 emufs_tipo2_modificar_registro()
1405 \layout Subsection
1406
1407 Obtención de estadísticas
1408 \layout Standard
1409
1410 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
1411  cantidad de bloques, cantidad de registros, espacio libre total, espacio
1412  libre promedio, espacio libre máximo y mínimo, etc.
1413 \layout Standard
1414
1415 Esta información es el resultado de ciertos cálculos realizados tanto en
1416  el archivo de datos como en los archivos índice.
1417 \layout Standard
1418
1419 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
1420  del archivo de datos, espacio libre total, cantidad de registros, cantidad
1421  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
1422  libres, etc.
1423 \layout Standard
1424
1425 Ver: 
1426 \family typewriter 
1427 emufs_tipo2_leer_estadisticas()
1428 \layout Subsection
1429
1430 Compactación del archivo de datos
1431 \layout Standard
1432
1433 Asi como los otros dos tipos de datos, el que nos compete también cuenta
1434  con la posibilidad de realizar la compactación de datos cuando el usuario
1435  lo desee, justificando todos los registros a izquierda, eliminando así
1436  los gaps existentes y decrementando el tamaño del archivo en disco (truncandolo
1437 ).
1438 \layout Standard
1439
1440 Para poder comprender como hemos implementado el proceso de recompactación
1441  en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
1442  cuales iremos describiendo el proceso.
1443  Notemos antes, que el proceso de compactación esta directamente ligado
1444  con el archivo de gaps o espacios libres (
1445 \series bold 
1446 .fsc
1447 \series default 
1448 ).
1449 \layout Standard
1450
1451 Comenzemos con el siguiente cuadro situacional: 
1452 \begin_inset Float figure
1453 placement H
1454 wide false
1455 collapsed true
1456
1457 \layout Caption
1458
1459 Archivo con gaps entre registros previo a compactación
1460 \layout Standard
1461
1462
1463 \begin_inset Graphics
1464         filename graphics/Compact1.png
1465         width 100text%
1466         keepAspectRatio
1467
1468 \end_inset 
1469
1470
1471 \end_inset 
1472
1473
1474 \layout Standard
1475
1476 Partiendo de esta base, el algoritmo de compactación tomará en su inicio
1477  al primer gap existente dentro del archivo de datos, en este caso llamado
1478  
1479 \series bold 
1480 Gap0
1481 \series default 
1482 .
1483  Luego, establecerá que el 
1484 \series bold 
1485 Source
1486 \series default 
1487  a partir de donde se quieren mover datos, sera:
1488 \layout LyX-Code
1489
1490 StartGap0 + SizeGap0 = EndGap0 = Source
1491 \layout Standard
1492
1493 Lo cual no es nada más y nada menos que lo obvio, la fuente a partir de
1494  donde se mueven los datos, sera el fin del primer gap, donde comienzan
1495  datos.
1496  Como destino (
1497 \series bold 
1498 Destination
1499 \series default 
1500 ) del movimiento, se establece inicialmente, el inicio del gap, o sea 
1501 \series bold 
1502 StartGap0 = Destination
1503 \series default 
1504 .
1505 \layout Standard
1506
1507 Luego, el algoritmo entrara en un bucle while (mientras haya bucles por
1508  levantar), el cual trabajara hasta el final de la compactación de la siguiente
1509  manera:
1510 \layout Standard
1511
1512
1513 \series bold 
1514 Mientras haya Gaps
1515 \series default 
1516  {
1517 \layout Enumerate
1518
1519 Se levanta el proximo gap al levantado en una instancia previa.
1520  En este ejemplo, durante el primer loop del while, se levantará 
1521 \series bold 
1522 Gap1
1523 \layout Enumerate
1524
1525 Luego, se calcula cuantos bytes hay que mover hacia el Destination de la
1526  siguiente manera:
1527 \layout Enumerate
1528
1529
1530 \series bold 
1531 Mustmove_bytes
1532 \series default 
1533  = 
1534 \series bold 
1535 StartGap1
1536 \series default 
1537  - 
1538 \series bold 
1539 Source
1540 \series default 
1541  = 
1542 \series bold 
1543 StartGap1
1544 \series default 
1545  - 
1546 \series bold 
1547 EndGap0 (
1548 \series default 
1549 Lo cual nuevamente es lógico pues querremos mover lo que se encuentra entre
1550  el final del primer gap levantado y el inicio del siguiente).
1551 \layout Enumerate
1552
1553 Se realiza el movimiento de los datos, utilizando las direcciones 
1554 \series bold 
1555 Source
1556 \series default 
1557  y 
1558 \series bold 
1559 Destination
1560 \series default 
1561 , así como la variable 
1562 \series bold 
1563 Mustmove_bytes
1564 \series default 
1565  que nos indica cuantos bytes transferir.
1566 \series bold 
1567
1568 \newline 
1569 IMPORTANTE: 
1570 \emph on 
1571 La transferencia se hace de a chunks de 25 bytes + un resto segun el valor
1572  de Mustmove_bytes.
1573 \layout Enumerate
1574
1575 Se establece como gap de referencia, al ultimo gap leido (En este caso se
1576  realiza: 
1577 \series bold 
1578 StartGap0
1579 \series default 
1580  = 
1581 \series bold 
1582 StartGap1
1583 \series default 
1584
1585 \series bold 
1586 Gap0Size = Gap1Size
1587 \series default 
1588 ) y termina el código de repetición del bucle, dando lugar a la carga del
1589  siguiente gap en el inicio del mismo.
1590 \layout Standard
1591
1592
1593 \series bold 
1594 }
1595 \layout Standard
1596
1597 Luego del primer bucle, el archivo se vera de la siguiente forma: 
1598 \begin_inset Float figure
1599 placement H
1600 wide false
1601 collapsed true
1602
1603 \layout Caption
1604
1605 Archivo con gaps en disco luego del primer bucle de compactación
1606 \layout Standard
1607
1608
1609 \begin_inset Graphics
1610         filename graphics/Compact2.png
1611         width 100text%
1612
1613 \end_inset 
1614
1615
1616 \end_inset 
1617
1618
1619 \layout Standard
1620
1621 Notemos que al final de la porción de datos de los bytes movidos (donde
1622  quedo apuntando 
1623 \series bold 
1624 Destination
1625 \series default 
1626 ), hay basura que será pisada por el próximo movimiento.
1627 \layout Standard
1628
1629 En el próximo loop, el bucle levantará un nuevo gap, y utilizando el gap
1630  anterior (En esta caso el Gap anterior será 
1631 \series bold 
1632 Gap1
1633 \series default 
1634 ) como referencia, realizará los mismos cálculos, desde donde transferir
1635  y cuantos bytes mover.
1636  (El destino es solo establecido inicialmente por código, y para el resto
1637  del algoritmo es el lugar donde quedo el puntero destination luego de la
1638  última escritura).
1639 \layout Standard
1640
1641 Una vez que se salga del bucle while, se realizará un último movimiento
1642  preprogramado, donde la fuente (
1643 \series bold 
1644 Source
1645 \series default 
1646 ) será el final del ultimo gap, y la cantidad de bytes a mover será lo que
1647  se encuentre luego del mismo hasta el fin de archivo.
1648 \layout LyX-Code
1649
1650 Source = StartLastGap + SizeLastGap = EndLastGap
1651 \layout LyX-Code
1652
1653 Mustmove_bytes = Datsize - Source
1654 \layout Standard
1655
1656 Damos por terminada así, la explicación del algoritmo de compresión el cual
1657  para el caso del tipo 2, es realmente bastante sencillo.
1658 \layout Standard
1659
1660 Ver: 
1661 \family typewriter 
1662 void emufs_tipo2_compactar()
1663 \layout Section
1664
1665 Consideraciones y Políticas de Diseño
1666 \layout Standard
1667
1668 Se han tomado ciertas consideraciones para algunos casos particulares que
1669  se pueden presentar durante el uso/ejecución de la aplicación, así como
1670  tambien politicas respecto del diseño e implementación del sistema:
1671 \layout Itemize
1672
1673 En la organización física tipo 2 para los registros que se graban en disco
1674  hemos decidido utilizar como encabezado de cada uno de ellos, los datos
1675  [ID_REG][REG_SIZE], los cuales fueron detallados previamente.
1676  Si bien se podría haber descartado el grabado del ID del registro en el
1677  archivo de datos y puede parecer redundante, dado que poseemos el archivo
1678  índice con el offset directo, el mismo se lo graba por distintos motivos:
1679 \newline 
1680
1681 \newline 
1682 A) En caso de la corrupción del archivo índice (.idx), podremos gracias a
1683  que poseemos en el archivo de datos, el ID de cada registro, recrear dicho
1684  índice, ayudándonos del archivo de espacios libres (
1685 \series bold 
1686 .fsc
1687 \series default 
1688 ), para poder saltear los espacios libres y e ir recorriendo secuencialmente
1689  los registros, reconstruyendo así el índice en cuestión.
1690  (esta función de reconstrucción no pudo ser implementada para esta entrega,
1691  pero es una posibilidad real).
1692 \newline 
1693
1694 \newline 
1695 B) Luego de un proceso de recompactación, los espacios libres que pudieron
1696  haber existido en el archivo de datos (
1697 \series bold 
1698 .dat
1699 \series default 
1700 ), son eliminados y los registros han cambiado de posición.
1701  Por ello, recorriendo secuencialmente por única vez el archivo de datos,
1702  se procede a la actualización / reconstrucción del índice de direcciones
1703  u offsets (.
1704 \series bold 
1705 idx
1706 \series default 
1707 )
1708 \layout Itemize
1709
1710 Si se desea insertar un registro y no se puede hayar un gap o espacio libre
1711  donde quepa, se los inserta al final del archivo.
1712 \layout Itemize
1713
1714 Ante una operación de baja de un registro, el mismo no es físicamente borrado
1715  del archivo de datos (
1716 \series bold 
1717 .dat
1718 \series default 
1719 ), simplemente los bytes que ocupa son llenados con hexa (00).
1720  Paralelamente, se procede a actualiza el archivo índice, insertando como
1721  valor de OFFSET para el registro eliminado, el valor ¨-1¨, indicando así
1722  la inexistencia del registro para el futuro, y por otro lado se genera
1723  la entrada de espacio libre en el archivo de gaps (
1724 \series bold 
1725 .fsc
1726 \series default 
1727 ).
1728 \layout Itemize
1729
1730 La reutilización de ID's liberados por previas operaciones de baja de registros,
1731  se ve implementada por el archivo de ID liberados (.did), y su comportamiento
1732  es el de una pila por lo que el último ID liberado, sera el próximo a ser
1733  reutilizado (LIFO).
1734 \layout Itemize
1735
1736 Como fue explicado en la implementación del archivo índice, existe una correspon
1737 dencia 1 a 1 entre los registros allí presentes (en el .idx) y los ID's de
1738  los registros, por lo cual el registro N-ésimo del archivo índice, será
1739  el correspondiente al registro de datos cuyo ID es igual a N.
1740 \layout Itemize
1741
1742 El proceso de compactación de archivos, realiza los movimientos de información
1743  requeridos para dicho propósito de a chunks de 25 bytes por vez.
1744  Este valor es fijo, pero se lo podría hacer parametrizable mediante la
1745  GUI en próximas entregas.
1746 \layout Chapter
1747
1748
1749 \begin_inset LatexCommand \label{cha:tipo3}
1750
1751 \end_inset 
1752
1753 Archivo con bloques parametrizados y registros de longitud constante
1754 \layout Standard
1755
1756 Las distintas organizaciones de archivos buscan aprovechar al máximo el
1757  espacio del archivo.
1758 \layout Standard
1759
1760 En este caso veremos que sucede luego de agregar y borrar una gran cantidad
1761  de registros del archivo, lo que provoca como consecuencia directa la fragmenta
1762 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
1763  produce un desperdicio de espacio.
1764 \layout Section
1765
1766 Organización Física
1767 \layout Standard
1768
1769 Esta organización guarda los registros pertenecientes al archivo en bloques
1770  de tamaño parametrizado, de modo que intentará guardar la mayor cantidad
1771  de registros que quepan en un bloque.
1772  
1773 \layout Standard
1774
1775 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
1776  del archivo.
1777 \layout Subsection
1778
1779 Comportamiento Particular de los Archivos Auxiliares
1780 \layout Subsubsection
1781
1782 Archivo de Bloques y Registros (.idx)
1783 \layout Comment
1784
1785 buscar algun caso extraordinario.
1786 \layout Subsubsection
1787
1788 Archivo de Bloques y Espacio Libre (.fsc)
1789 \layout Subsubsection
1790
1791 Archivo de Id`s Borrados (.did)
1792 \layout Standard
1793
1794 El comportamiento de este archivo, es común para todas las organizaciones
1795  y se ha explicado en 3.3.2.
1796 \layout Section
1797
1798 Funciones Principales
1799 \layout Subsection
1800
1801 EMUFS Tipo 3
1802 \layout Standard
1803
1804 Dento de 
1805 \emph on 
1806 tipo3.h
1807 \emph default 
1808  y 
1809 \emph on 
1810 tipo3.c
1811 \emph default 
1812  se encuentran las cabeceras y la implementación de las funciones principales
1813  respectivamente, las cuales dan funcionalidad a esta organización.
1814 \layout Standard
1815
1816 A continuación se comentará la descripción de algunas acciones importantes.
1817 \layout Subsubsection
1818
1819 Leer Registro
1820 \layout Standard
1821
1822 La lectura de un registro se realiza con la ayuda del archivo .
1823 \emph on 
1824 idx
1825 \emph default 
1826  el cual contiene la información de la posición del registro dentro del
1827  archivo de datos.
1828  Una vez leida esta información, se recupera el bloque (en su totalidad)
1829  del archivo y se busca secuencialmente el registro con el 
1830 \emph on 
1831 ID
1832 \emph default 
1833  especificado.
1834 \layout Standard
1835
1836 Ver: 
1837 \family typewriter 
1838 emufs_tipo3_leer_registro()
1839 \layout Subsubsection
1840
1841 Grabar Registro
1842 \layout Standard
1843
1844 Graba un registro en un bloque donde haya espacio suficiente, y si no crea
1845  un nuevo bloque y lo agrega al final del archivo.
1846 \layout Standard
1847
1848 Luego de grabar un registro, actualiza los archivos de índice .idx y .fsc
1849  para mantener la coherencia.
1850 \layout Standard
1851
1852 Ver: 
1853 \family typewriter 
1854 emufs_tipo3_grabar_registro()
1855 \layout Subsubsection
1856
1857 Borrar Registro
1858 \layout Standard
1859
1860 Borra un registro del archivo de datos, para esto levanta el bloque al que
1861  pertenece el archivo y ajusta los demás registros justificandolos hacia
1862  la izquierda.
1863 \layout Standard
1864
1865 Cabe destacar que para dar de baja un registro no hace falta borrarlo del
1866  archivo de datos, solo es necesario borrar las entradas en los archivos
1867  de índice, pero cuando se realiza el ajuste el algoritmo toma porciones
1868  del bloque del tamaño de un registro mas su encabezado - comenzando desde
1869  el siguiente al que fue borrado - y copia (sobreescribe) sobre el anterior.
1870  De esta manera, la información correspondiente al registro borrado no estará
1871  presente en el archivo de datos.
1872  Esto es una consecuencia del ajuste al borrar un registro, pudiendo no
1873  ser así, si no se realizara el mismo.
1874 \layout Subsubsection
1875
1876 Leer Estadísticas
1877 \layout Standard
1878
1879 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
1880  cantidad de bloques, cantidad de registros, espacio libre total, espacio
1881  libre promedio, espacio libre máximo y mínimo, etc.
1882 \layout Standard
1883
1884 Esta información es el resultado de ciertos cálculos realizados tanto en
1885  el archivo de datos como en los archivos índice.
1886 \layout Standard
1887
1888 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
1889  del archivo de datos, espacio libre total, cantidad de registros, cantidad
1890  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
1891  libres, etc.
1892 \layout Standard
1893
1894 Ver: 
1895 \family typewriter 
1896 emufs_tipo3_leer_estadisticas()
1897 \layout Subsubsection
1898
1899 Compactar el Archivo
1900 \layout Standard
1901
1902 Esta función intenta reorganizar el archivo de manera que el espacio libre
1903  sea lo menor posible, recordando siempre que un registro no puede ser almacenad
1904 o en mas de un bloque excepto que el tamaño del registro sea mayor que el
1905  del bloque.
1906 \layout Standard
1907
1908 Para realizar esto, se aprovecha la funcionalidad de 
1909 \emph on 
1910 emufs_tipo3_grabar_registro() 
1911 \emph default 
1912 ya que esta tiene la capacidad de determinar una posición mas eficiente
1913  en el archivo para un registro.
1914  Por esto lo que se hace es levantar uno por uno los registros y volverlos
1915  a grabar, de ese modo todos los 
1916 \emph on 
1917 gaps 
1918 \emph default 
1919 que pudieron haberse formado por la eliminación de registros serán cubiertos
1920  por otros.
1921 \layout Standard
1922
1923 Al estar utilizando recuperación de 
1924 \emph on 
1925 id`s
1926 \emph default 
1927  borrados, esto me asegura que el registro borrado-guardado conservará el
1928  id al grabarse.
1929 \layout Standard
1930
1931 Al finalizar este proceso se verifica si existen bloques vacios para truncar
1932  el archivo.
1933  Lo mismo se debe hacer con el archivo de espacios libres .
1934 \emph on 
1935 fsc 
1936 \emph default 
1937 el cual disminuye su tamaño también.
1938 \layout Standard
1939
1940 Ver: 
1941 \family typewriter 
1942 void emufs_tipo3_compactar()
1943 \layout Section
1944
1945 Consideraciones y Políticas de Diseño
1946 \layout Comment
1947
1948 Esto para mi va en organización física.
1949 \layout Standard
1950
1951 Se han tomado ciertas consideraciones para algunos casos particulares que
1952  se pueden presentar durante el uso/ejecución de la aplicación.
1953 \layout Enumerate
1954
1955 Cada registro tiene un encabezado que indica el 
1956 \emph on 
1957 id 
1958 \emph default 
1959 del mismo.
1960 \layout Enumerate
1961
1962 Si el tamaño del registro es mayor que el tamaño del bloque el registro
1963  se particionará en la cantidad de bloques que sea necesario, pero siempre
1964  se guardará desde el comienzo de un bloque, esto quiere decir que nunca
1965  se podrá encontrar un comienzo de registro en algún lugar de un bloque
1966  que no sea el comienzo del mismo.
1967 \layout Enumerate
1968
1969 Si el registro se divide en mas de un bloque, se le coloca el id como encabezado
1970  igualmente, pero en el archivo .
1971 \emph on 
1972 idx
1973 \emph default 
1974  solo se guarda el primer bloque.
1975  En el 
1976 \emph on 
1977 .fsc
1978 \emph default 
1979  se actualizan todos los bloques con el espacio libre que realmente tienen.
1980 \layout Chapter
1981
1982 Conclusiones
1983 \layout Standard
1984
1985 Las comparaciones, pruebas, etc...
1986 \the_end