]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - doc/informe.lyx
subo lo de rich mas lo mio, espero que se haya bancado el merge
[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 \emph on 
59 EMUFS 
60 \emph default 
61 es la estuctura principal que encapsula todas las funciones para el manejo
62  de un archivo de datos.
63 \layout Standard
64
65 Esta estructura consta de:
66 \layout Enumerate
67
68 EMUFS_Tipo que es un tipo enumerado que indica cual es la organización.
69 \layout Enumerate
70
71 EMUFS_BLOCK_SIZE indica el tamaño del bloque para los tipos 1 y 3.
72 \layout Enumerate
73
74 EMUFS_REG_SIZE indica el tamaño del registro, para el tipo 3 que posee tamaño
75  constante.
76 \layout Enumerate
77
78 void *leer_bloque()
79 \layout Comment
80
81 no me convence esta descripcion.
82  
83 \layout Subsection
84
85 EMUFS_Tipo
86 \layout Subsection
87
88 EMUFS_Estadisticas
89 \layout Subsection
90
91 EMUFS_BLOCK_ID
92 \layout Standard
93
94 etc
95 \layout Section
96
97
98 \begin_inset LatexCommand \label{sec:cabecera_gral}
99
100 \end_inset 
101
102 Organización física general de un archivo E
103 \begin_inset Formula $\mu$
104 \end_inset 
105
106 FS
107 \layout Standard
108
109 Todo archivo E
110 \begin_inset Formula $\mu$
111 \end_inset 
112
113 FS está compuesto por 4 archivos a nivel de sistema operativo: archivo de
114  datos (con 3 formatos posibles, ver páginas 
115 \begin_inset LatexCommand \pageref{cha:tipo1}
116
117 \end_inset 
118
119
120 \begin_inset LatexCommand \pageref{cha:tipo2}
121
122 \end_inset 
123
124  y 
125 \begin_inset LatexCommand \pageref{cha:tipo3}
126
127 \end_inset 
128
129 ), archivo de índice (ver página 
130 \begin_inset LatexCommand \pageref{sec:idx}
131
132 \end_inset 
133
134 ), archivo de control de espacio libre (ver página 
135 \begin_inset LatexCommand \pageref{sec:fsc}
136
137 \end_inset 
138
139 ) y archivo de índices recuperables (ver página 
140 \begin_inset LatexCommand \pageref{sec:did}
141
142 \end_inset 
143
144 ).
145 \layout Standard
146
147 El archivo de datos está compuesto por:
148 \layout Itemize
149
150 Una 
151 \emph on 
152 cabecera general
153 \emph default 
154  compuesta por un 
155 \family typewriter 
156 int
157 \family default 
158  (4 bytes en plataformas Linux de 32 bits) que representa el tipo de archivo.
159 \layout Itemize
160
161 Datos dependientes del tipo de archivo.
162 \layout Standard
163
164 La 
165 \emph on 
166 cabecera general
167 \emph default 
168  es utilizada para poder detectar el formato de un archivo al abrirlo.
169  Los datos dependientes del tipo de archivo serán explicados en sus secciones
170  correspondientes.
171 \layout LyX-Code
172
173 archivo
174 \layout LyX-Code
175
176 +-----------+--------------------------------------------//-+
177 \layout LyX-Code
178
179 |    tipo   | Datos dependientes del tipo de archivo ...
180  
181 \backslash 
182
183 \backslash 
184  |
185 \layout LyX-Code
186
187 +-----------+--------------------------------------------//-+
188 \layout LyX-Code
189
190 /- 4 bytes -/
191 \layout Chapter
192
193 Archivos Auxiliares
194 \layout Comment
195
196 Por que los 3 tipos usan lo mismo.
197  Ventajas y desventajas.
198 \layout Section
199
200
201 \begin_inset LatexCommand \label{sec:idx}
202
203 \end_inset 
204
205 Archivo de índice
206 \layout Standard
207
208 Con la ayuda de un archivo de bloques y registros (de extensión .idx), podremos
209  ubicar cualquier registro existente dentro del archivo.
210 \layout Standard
211
212 El archivo de índice contiene una estructura que contiene el id de un registro
213  y el número de bloque al que pertenece.
214  Este archivo esta ordenado por 
215 \emph on 
216 id
217 \emph default 
218 , de modo que incrementa su tamaño cada vez que se grabe en el archivo de
219  datos un nuevo registro, excepto que un registro haya sido borrado con
220  anterioridad lo cual produce que al guardar un nuevo registro se actualice
221  y no crezca.
222 \layout Standard
223
224 Si un registro es borrado del archivo de datos, debe actualizarse el índice,
225  esto se logra colocando un flag que indique que el id no pertenece a ningún
226  bloque, hemos adoptado poner -1 en el campo location de la estructura 
227 \emph on 
228 EMUFS_IDX
229 \emph default 
230 .
231 \layout Standard
232
233 Es necesario que este archivo esté ordenado por 
234 \emph on 
235 id
236 \emph default 
237  de registro, ya que esto permitirá el acceso directo para la búsqueda de
238  un registro en el archivo de datos.
239 \layout Subsection
240
241 Organización física
242 \layout Standard
243
244 El tipo EMUFS_IDX define la estuctura de los registros de este archivo.
245 \layout Standard
246
247 Esta estructura está compuesta por:
248 \layout Itemize
249
250 EMUFS_REG_ID reg_id indica el 
251 \emph on 
252 id
253 \emph default 
254  del registro
255 \layout Itemize
256
257 EMUFS_BLOCK_ID location número de bloque donde se encuentra el registro.
258 \layout Standard
259
260 EMUFS_REG_ID y EMUFS_BLOCK_ID son 
261 \emph on 
262 unsigned long.
263 \layout Comment
264
265 ponerlo mas lindo...
266 \layout Subsection
267
268 Comportamiento (funciones generales)
269 \layout Section
270
271
272 \begin_inset LatexCommand \label{sec:fsc}
273
274 \end_inset 
275
276 Archivo de control de espacio libre
277 \layout Standard
278
279 El archivo de de espacios libres permite decidir a la hora de guardar un
280  registro, donde será guardado.
281  
282 \layout Standard
283
284 La estructura de este archivo está formada por un número que indica el bloque
285  y otro que indica el espacio libre en él.
286 \layout Standard
287
288 De esta manera al querer guardar un registro este archivo informará donde
289  cabe el mismo, previa invocación al la función 
290 \emph on 
291 EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *, EMUFS_FREE, EMUFS_FREE*)
292 \emph default 
293  perteneciente a fsc.h, la cual devuelve el número de bloque donde entra
294  el registro o -1 si no hay un bloque con lugar suficiente, y toma como
295  parámetros una estructura 
296 \emph on 
297 EMUFS
298 \emph default 
299 , y dos 
300 \emph on 
301 EMUFS_FREE
302 \emph default 
303  donde el segndo parámetro es el tamaño buscado, y el tercero devuelve el
304  tamaño disponible.
305 \layout Standard
306
307 De la misma manera, al borrar un registro este archivo debe ser actualizado
308  colocando el nuevo espacio libre en el bloque.
309 \layout Subsection
310
311 Organización Física
312 \layout Standard
313
314 La estuctura que define este archivo es la siguiente:
315 \layout Standard
316
317 EMUFS_FSC que contiene:
318 \layout Itemize
319
320 EMUFS_BLOCK_ID indica el número de bloque
321 \layout Itemize
322
323 EMUFS_FREE freespace indica la cantidad de espacio libre que queda en el
324  bloque.
325 \layout Standard
326
327 EMUFS_FSC y EMUFS_FREE son 
328 \emph on 
329 unsiged long int
330 \layout Subsection
331
332 Comportamiento
333 \layout Section
334
335
336 \begin_inset LatexCommand \label{sec:did}
337
338 \end_inset 
339
340 Archivo de índices recuperables
341 \layout Standard
342
343 <<<<<<< .mine
344 Este archivo funciona como una pila de id`s borrados, es decir, cuando se
345  borra un registro el 
346 \emph on 
347 id
348 \emph default 
349  se almacena en este archivo y será recuperado cuando se desee grabar un
350  registro nuevo, de esta manera se aprovechan todos los 
351 \emph on 
352 id`s
353 \emph default 
354  sin necesidad de crear uno nuevo cada vez que se borra y graba un registro.
355 \layout Subsection
356
357 Estructura Física
358 \layout Standard
359
360 Este archivo tiene registros de un solo campo, EMUFS_REG_ID el cual simboliza
361  al id almacenado.
362 \layout Subsection
363
364 Comportamiento
365 \layout Standard
366
367 Las declaraciones e implementación se pueden encontrar en 
368 \emph on 
369 did.h
370 \emph default 
371  y 
372 \emph on 
373 did.c
374 \emph default 
375  respectivamente
376 \layout Itemize
377
378
379 \series bold 
380 Agregar: 
381 \series default 
382 agrega un 
383 \emph on 
384 id 
385 \emph default 
386 al archivo, el cual será el primero recuperado.
387  
388 \emph on 
389 ver: emufs_did_agregar()
390 \layout Itemize
391
392
393 \series bold 
394 Obtener el último:
395 \series default 
396  Obtiene el último 
397 \emph on 
398 id
399 \emph default 
400  que se guardó en el archivo (o se eliminó del archivo de datos), y trunca
401  el archivo.
402  
403 \emph on 
404 ver: emufs_did_get_last()
405 =======
406 (.did)
407 \layout Standard
408
409 idem anterior
410 >>>>>>> .r356
411 \layout Chapter
412
413
414 \begin_inset LatexCommand \label{cha:tipo1}
415
416 \end_inset 
417
418 Archivo con bloques parametrizados y registros de longitud variable
419 \layout Standard
420
421 Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
422  intermedio entre el 
423 \begin_inset LatexCommand \ref{cha:tipo2}
424
425 \end_inset 
426
427  y el 
428 \begin_inset LatexCommand \ref{cha:tipo3}
429
430 \end_inset 
431
432  (cuenta tanto con bloques como con registros variables), hereda los inconvenien
433 tes (y ventajas) de ambos, más los propios.
434  Al implementar este tipo de archivo se puso enfásis en la eficiencia mientras
435  esta no comprometa la mantenibilidad del código, es por esto que en algunas
436  circunstancias no se hace un uso óptimo del espacio.
437 \layout Standard
438
439 La implementación de este tipo de archivo puede ser encontrada en 
440 \family typewriter 
441 emufs/tipo1.c
442 \family default 
443  mientras que su interfaz pública está disponible en 
444 \family typewriter 
445 emufs/tipo1.h
446 \family default 
447 .
448 \layout Section
449
450 Organización física
451 \layout Standard
452
453 El archivo está compuesto por la 
454 \emph on 
455 cabecera general
456 \emph default 
457  (ver página 
458 \begin_inset LatexCommand \pageref{sec:cabecera_gral}
459
460 \end_inset 
461
462 ).
463  El valor que toma en este tipo de archivo es 0 (o el valor simbólico 
464 \family typewriter 
465 T1
466 \family default 
467  del tipo 
468 \family typewriter 
469 EMUFS_Tipo
470 \family default 
471 ).
472  Luego le sigue una cabecera propia del archivo (un EMUFS_BLOCK_SIZE, 4
473  bytes) que almacena el tamaño del bloque que usa el archivo.
474  De esta menera, al abrir un archivo de este tipo no se necesita tener ninguna
475  información sobre él.
476  A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
477  en la cabecera antes mencionada.
478 \layout LyX-Code
479
480 archivo
481 \layout LyX-Code
482
483 +-----------+-----------+------------------------//-+
484 \layout LyX-Code
485
486 |    tipo   | tam bloque| Cero o más bloques ...
487  
488 \backslash 
489
490 \backslash 
491  |
492 \layout LyX-Code
493
494 +-----------+-----------+------------------------//-+
495 \layout LyX-Code
496
497 /- 4 bytes -/- 4 bytes -/
498 \layout Subsection
499
500 Organización física de un bloque
501 \layout Standard
502
503 Cada bloque no guarda información en sí, sólo se comporta como un contenedor
504  de registros.
505  Esto no significa que un bloque no tenga utilidad, el bloque es utilizado
506  para proveer un acceso semi-aleatorio a los registros.
507  Para esto se utiliza el archivo de índice (ver página 
508 \begin_inset LatexCommand \ref{sec:idx}
509
510 \end_inset 
511
512 ), que almacena pares (identificador de registro, número de bloque).
513  Para que sea suficiente este único índice para hallar un registro (siendo
514  que puede haber más de un registro por bloque), es necesario 
515 \emph on 
516 alinear los registros a izquierda
517 \emph default 
518 .
519 \layout LyX-Code
520
521 bloque N-1 | bloque N                                    | bloque N+1
522 \layout LyX-Code
523
524 /----------+------------+------------+-------------------+-----------/
525 \layout LyX-Code
526
527
528 \backslash 
529           | registro 1 | registro 2 | espacio libre ...
530  |           
531 \backslash 
532  /----------+------------+------------+-------------------+-----------/
533 \layout Standard
534
535 De forma tal que una vez obtenido el número de bloque se pueda recorrer
536  secuencialmente hasta encontrar el registro deseado.
537  A fin de llevar el conteo de espacio libre se utiliza el archivo de control
538  de espacio libre (ver página 
539 \begin_inset LatexCommand \ref{sec:fsc}
540
541 \end_inset 
542
543 ), de forma tal que no sea necesario recorrer secuencialmente en busca de
544  espacio libre al hacer una inserción.
545 \layout Standard
546
547 Puede darse un caso excepcional en el que un registro sea más grande que
548  un bloque, en este caso el registro se almacenará en N bloques consecutivos
549  (siendo N la cantidad de bloques que necesita el registro), ocupando completos
550  los todos los bloques a excepción del último, en el que posteriormente
551  se pueden agregar más registros.
552 \layout Section
553
554 Comportamiento (funciones de la interfáz)
555 \layout Section
556
557 Detalles de implementación (funciones internas, ver si lo ponemos o no)
558 \layout Chapter
559
560
561 \begin_inset LatexCommand \label{cha:tipo2}
562
563 \end_inset 
564
565 Archivo sin bloques y registros de longitud variable
566 \layout Standard
567
568 Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
569  de longitud variable sin realizar su agrupación en bloques, y como veremos
570  en la siguiente sección, tambien permitirá la administración de gaps que
571  queden en el archivo luego de operaciones de baja de registros.
572 \layout Section
573
574 Organización física
575 \layout Standard
576
577 Este tipo de archivo realizará el almacenamiento de registros de longitud
578  variable en disco, su borrado y modificación sin la utilización de bloques
579  de ningún tipo.
580  Su implementación se encuentra en los archivos fuente (
581 \series bold 
582 tipo2.c
583 \series default 
584  y 
585 \series bold 
586 tipo2.h
587 \series default 
588 ).
589 \layout Standard
590
591 Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
592  simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
593  de archivo en cuestión.
594 \layout Standard
595
596 Para poder entender mejor la organización fisica de este tipo de archivo,
597  tomemos el caso hipotético en el que se encuentran grabados 
598 \series bold 
599 dos registros
600 \series default 
601  (comenzando desde registro 0) de 
602 \series bold 
603 30 bytes
604 \series default 
605 , y 
606 \series bold 
607 25 bytes
608 \series default 
609 , respectivamente.
610  Supongamos también que entre el registro 0 y 1 se encontraba un 
611 \series bold 
612 registro de 10 bytes
613 \series default 
614  que fue 
615 \series bold 
616 borrado
617 \series default 
618 , generando un 
619 \series bold 
620 gap
621 \series default 
622  
623 \series bold 
624 o freespace
625 \series default 
626 .
627  Si miramos al archivo de datos (.dat) en el disco nos encontraremos con
628  lo siguiente: 
629 \begin_inset Float figure
630 placement H
631 wide false
632 collapsed true
633
634 \layout Caption
635
636 NOMBRE, ARREGLAME!!!!
637 \layout Standard
638
639
640 \begin_inset Graphics
641         filename graphics/Example1.png
642         width 100text%
643
644 \end_inset 
645
646
647 \end_inset 
648
649
650 \layout Standard
651
652 Como se puede observar, a nivel físico cada registro grabado esta compuesto
653  por un Header cuyo tamaño total es de 8 bytes (
654 \series bold 
655 EMUFS_REG_ID
656 \series default 
657  + 
658 \series bold 
659 EMUFS_REG_SIZE
660 \series default 
661 ), y posteriormente el registro (bloque de datos) en sí.
662  Luego se encuentra el espacio libre de 18 bytes dejado por el registro
663  de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
664  el segundo registro mencionado.dsds
665 \layout Section
666
667 Comportamiento (funciones de la interfaz)
668 \layout Standard
669
670 Dentro de 
671 \series bold 
672 \emph on 
673 tipo2.h
674 \series default 
675 \emph default 
676  y 
677 \series bold 
678 \emph on 
679 tipo2.c
680 \series default 
681 \emph default 
682  se encuentran las cabeceras y la implementación de las funciones principales
683  respectivamente, las cuales dan funcionalidad a esta organización.
684  
685 \layout Standard
686
687 A continuación se comentará el funcionamiento algunas de las mas importantes.
688 \layout Subsection
689
690 Lectura de registros
691 \layout Standard
692
693 Como se vió al comienzo, los registros en este tipo de archivo no se encuentran
694  agrupados en bloques de ninguna índole y estan dispersos a lo largo del
695  archivo, con la particularidad de que pueden existir gaps o espacio libre,
696  entre dos registros dados.
697 \layout Standard
698
699 Por ende la lectura de registros en este tipo de organización es muy simple
700  y dada la inexistencia de bloques, el procedimiento será el siguiente:
701 \layout Enumerate
702
703 Se determina el offset en bytes, donde comienza el registro deseado, a través
704  de su ID, buscando la misma en el archivo índice (
705 \series bold 
706 .idx
707 \series default 
708 )
709 \layout Enumerate
710
711 Ya determinada la posición física del registro dentro del archivo de datos
712  (
713 \series bold 
714 .dat
715 \series default 
716 ), nos posicionamos en la misma, y leemos el header del registro (
717 \series bold 
718 IDReg
719 \series default 
720  + 
721 \series bold 
722 RegSize
723 \series default 
724 ).
725  Contando así con el tamaño del registro, procedemos a leer el mismo (los
726  datos), dando por finalizada la lectura.
727 \layout Subsection
728
729 Altas de registros
730 \layout Standard
731
732 En el proceso de alta de registros entrarán en juego dos archivos descriptos
733  en la 
734 \emph on 
735 sección de archivos auxiliares
736 \emph default 
737 , siendo estos el archivo índice (
738 \series bold 
739 .idx
740 \series default 
741 ), y el archivo de gaps / espacios libres (
742 \series bold 
743 .fsc
744 \series default 
745 ).
746 \layout Standard
747
748 Así pues, a la hora de realizar una inserción de un registro en el archivo
749  de datos, el procedimiento será el siguiente:
750 \layout Enumerate
751
752 Calculamos el espacio que necesitaremos para el registro: sizeof(
753 \series bold 
754 EMUFS_REG_ID
755 \series default 
756 ) + sizeof(
757 \series bold 
758 EMUFS_REG_SIZE
759 \series default 
760 ) + sizeof(registro).
761 \layout Enumerate
762
763 Determinamos donde debemos insertar el registro, ya sea un gap donde entre,
764  o bien al final del archivo.
765 \layout Enumerate
766
767 Insertamos el registro e información de control (
768 \series bold 
769 header
770 \series default 
771 +
772 \series bold 
773 data
774 \series default 
775 ), en la posición indicada en el paso 2.
776 \layout Enumerate
777
778 En caso de haber utilizado un GAP, actualizamos el espacio libre restante
779  en el mismo y en caso de que se haya utilizado al totalidad del GAP, se
780  lo elimina del archivo (
781 \series bold 
782 .fsc
783 \series default 
784 ).
785 \layout Enumerate
786
787 Actualizamos la entrada correspondiente al registro ingresado (determinada
788  por su RegID), en el archivo índice (
789 \series bold 
790 .idx
791 \series default 
792 ), indicando su offset donde podrá ser accedido luego.
793 \layout Subsection
794
795 Bajas de registros
796 \layout Standard
797
798 En el proceso de baja de registros entrarán en juego los tres archivos descripto
799 s en la 
800 \emph on 
801 sección de archivos auxiliares
802 \emph default 
803 , siendo estos el archivo índice (
804 \series bold 
805 .idx
806 \series default 
807 ), el archivo de gaps / espacios libres (
808 \series bold 
809 .fsc
810 \series default 
811 ) y el archivo de ID's liberados (
812 \series bold 
813 .did
814 \series default 
815 ).
816 \layout Standard
817
818 Dado que en la implementación de este tipo de organización física contamos
819  con los gaps o espacios libres entre registros, no se eliminará fisicamente
820  el registro del archivo de datos (
821 \series bold 
822 .dat
823 \series default 
824 ), pues entonces carecería de sentido el archivo anteriormente mencionado
825  (
826 \series bold 
827 .fsc
828 \series default 
829 ).
830  En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
831  y se marca fisicamente en el archivo de datos la eliminación mediante un
832  fill de los bytes correspondientes con un caracter nulo.
833  (hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
834 \layout Standard
835
836 El proceso de baja o eliminación de un registro constará luego de los siguientes
837  pasos:
838 \layout Enumerate
839
840 Se obtiene el offset o posición relativa en donde se encuentra grabado el
841  registro dentro del archivo de datos.
842 \layout Enumerate
843
844 Se obtiene el tamaño del registro y se realiza un dummyfill del sector del
845  archivo correspondiente al registro que se está dando de baja.
846  (Se rellena la zona correspondiente a su header+data).
847 \layout Enumerate
848
849 Se agrega el GAP generado al archivo de gaps o espacios libres, y en caso
850  de haberse generado un GAP lindante con otro GAP, se realizará un merge
851  de los mismos y se los registrará bajo una única entrada en el archivo
852  de espacios libres (.fsc).
853 \layout Enumerate
854
855 Se agrega el ID que fue liberado, al archivo de ID's liberados (
856 \series bold 
857 .did
858 \series default 
859 ), al final del mismo (
860 \emph on 
861 pila
862 \emph default 
863 ).
864 \layout Enumerate
865
866 Se marca en el archivo índice (
867 \series bold 
868 .idx
869 \series default 
870 ) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
871  al registro recién eliminado (se le cambia el valor al n-esimo registro,
872  donde N = IDReg del reg eliminado).
873 \layout Subsection
874
875 Modificación de registros
876 \layout Standard
877
878 Dada la naturaleza del archivo de ID's liberados, y el manejo de espacio
879  libre del que consta esta organización de archivo, el proceso de modificación
880  de un registro se limita a los siguientes pasos:
881 \layout Enumerate
882
883 Se realiza la lectura del registro, mediante el respectivo procedimiento
884  ya desarollado anteriormente.
885 \layout Enumerate
886
887 Una vez que se cuenta con los nuevos datos modificados, se procede a dar
888  de baja el registro que ha sido modificado, e inmediatamente después se
889  realiza una inserción con los nuevos datos.
890 \layout Standard
891
892
893 \series bold 
894 \emph on 
895 NOTA:
896 \series default 
897 \emph default 
898  Como fue indicado, dada la naturaleza de PILA del subsistema de administración
899  de ID liberados, es asegurado que la nueva inserción del registro modificado
900  se realizará con el mismo RegID.
901 \layout Subsection
902
903 Obtención de estadísticas
904 \layout Subsection
905
906 Compactación del archivo de datos
907 \layout Standard
908
909 Asi como los otros dos tipos de datos, el que nos compete también cuenta
910  con la posibilidad de realizar la compactación de datos cuando el usuario
911  lo desee, justificando todos los registros a izquierda, eliminando así
912  los gaps existentes y decrementando el tamaño del archivo en disco (truncandolo
913 ).
914 \layout Standard
915
916 Para poder comprender como hemos implementado el proceso de recompactación
917  en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
918  cuales iremos describiendo el proceso.
919  Notemos antes, que el proceso de compactación esta directamente ligado
920  con el archivo de gaps o espacios libres (
921 \series bold 
922 .fsc
923 \series default 
924 ).
925 \layout Standard
926
927 Comenzemos con el siguiente cuadro situacional: 
928 \begin_inset Float figure
929 placement H
930 wide false
931 collapsed true
932
933 \layout Caption
934
935 NOMBRE, ARREGLAMEE!!!
936 \layout Standard
937
938
939 \begin_inset Graphics
940         filename graphics/Compact1.png
941         width 100text%
942         keepAspectRatio
943
944 \end_inset 
945
946
947 \end_inset 
948
949
950 \layout Standard
951
952 Partiendo de esta base, el algoritmo de compactación tomará en su inicio
953  al primer gap existente dentro del archivo de datos, en este caso llamado
954  
955 \series bold 
956 Gap0
957 \series default 
958 .
959  Luego, establecerá que el 
960 \series bold 
961 Source
962 \series default 
963  a partir de donde se quieren mover datos, sera:
964 \layout LyX-Code
965
966 StartGap0 + SizeGap0 = EndGap0 = Source
967 \layout Standard
968
969 Lo cual no es nada más y nada menos que lo obvio, la fuente a partir de
970  donde se mueven los datos, sera el fin del primer gap, donde comienzan
971  datos.
972  Como destino (
973 \series bold 
974 Destination
975 \series default 
976 ) del movimiento, se establece inicialmente, el inicio del gap, o sea 
977 \series bold 
978 StartGap0 = Destination
979 \series default 
980 .
981 \layout Standard
982
983 Luego, el algoritmo entrara en un bucle while (mientras haya bucles por
984  levantar), el cual trabajara hasta el final de la compactación de la siguiente
985  manera:
986 \layout Standard
987
988
989 \series bold 
990 Mientras haya Gaps
991 \series default 
992  {
993 \layout Enumerate
994
995 Se levanta el proximo gap al levantado en una instancia previa.
996  En este ejemplo, durante el primer loop del while, se levantará 
997 \series bold 
998 Gap1
999 \layout Enumerate
1000
1001 Luego, se calcula cuantos bytes hay que mover hacia el Destination de la
1002  siguiente manera:
1003 \layout Enumerate
1004
1005
1006 \series bold 
1007 Mustmove_bytes
1008 \series default 
1009  = 
1010 \series bold 
1011 StartGap1
1012 \series default 
1013  - 
1014 \series bold 
1015 Source
1016 \series default 
1017  = 
1018 \series bold 
1019 StartGap1
1020 \series default 
1021  - 
1022 \series bold 
1023 EndGap0 (
1024 \series default 
1025 Lo cual nuevamente es lógico pues querremos mover lo que se encuentra entre
1026  el final del primer gap levantado y el inicio del siguiente).
1027 \layout Enumerate
1028
1029 Se realiza el movimiento de los datos, utilizando las direcciones 
1030 \series bold 
1031 Source
1032 \series default 
1033  y 
1034 \series bold 
1035 Destination
1036 \series default 
1037 , así como la variable 
1038 \series bold 
1039 Mustmove_bytes
1040 \series default 
1041  que nos indica cuantos bytes transferir.
1042 \series bold 
1043
1044 \newline 
1045 IMPORTANTE: 
1046 \emph on 
1047 La transferencia se hace de a chunks de 25 bytes + un resto segun el valor
1048  de Mustmove_bytes.
1049 \layout Enumerate
1050
1051 Se establece como gap de referencia, al ultimo gap leido (En este caso se
1052  realiza: 
1053 \series bold 
1054 StartGap0
1055 \series default 
1056  = 
1057 \series bold 
1058 StartGap1
1059 \series default 
1060
1061 \series bold 
1062 Gap0Size = Gap1Size
1063 \series default 
1064 ) y termina el código de repetición del bucle, dando lugar a la carga del
1065  siguiente gap en el inicio del mismo.
1066 \layout Standard
1067
1068
1069 \series bold 
1070 }
1071 \layout Standard
1072
1073 Luego del primer bucle, el archivo se vera de la siguiente forma: 
1074 \begin_inset Float figure
1075 placement H
1076 wide false
1077 collapsed true
1078
1079 \layout Caption
1080
1081 NOMBRE, ARREGLAME!!!!
1082 \layout Standard
1083
1084
1085 \begin_inset Graphics
1086         filename graphics/Compact2.png
1087         width 100text%
1088
1089 \end_inset 
1090
1091
1092 \end_inset 
1093
1094
1095 \layout Standard
1096
1097 Notemos que al final de la porción de datos de los bytes movidos (donde
1098  quedo apuntando 
1099 \series bold 
1100 Destination
1101 \series default 
1102 ), hay basura que será pisada por el próximo movimiento.
1103 \layout Standard
1104
1105 En el próximo loop, el bucle levantará un nuevo gap, y utilizando el gap
1106  anterior (En esta caso el Gap anterior será 
1107 \series bold 
1108 Gap1
1109 \series default 
1110 ) como referencia, realizará los mismos cálculos, desde donde transferir
1111  y cuantos bytes mover.
1112  (El destino es solo establecido inicialmente por código, y para el resto
1113  del algoritmo es el lugar donde quedo el puntero destination luego de la
1114  última escritura).
1115 \layout Standard
1116
1117 Una vez que se salga del bucle while, se realizará un último movimiento
1118  preprogramado, donde la fuente (
1119 \series bold 
1120 Source
1121 \series default 
1122 ) será el final del ultimo gap, y la cantidad de bytes a mover será lo que
1123  se encuentre luego del mismo hasta el fin de archivo.
1124 \layout LyX-Code
1125
1126 Source = StartLastGap + SizeLastGap = EndLastGap
1127 \layout LyX-Code
1128
1129 Mustmove_bytes = Datsize - Source
1130 \layout Standard
1131
1132 Damos por terminada así, la explicación del algoritmo de compresión el cual
1133  para el caso del tipo 2, es realmente bastante sencillo.
1134 \layout Chapter
1135
1136
1137 \begin_inset LatexCommand \label{cha:tipo3}
1138
1139 \end_inset 
1140
1141 Archivo con bloques parametrizados y registros de longitud constante
1142 \layout Standard
1143
1144 Las distintas organizaciones de archivos buscan aprovechar al máximo el
1145  espacio del archivo.
1146 \layout Standard
1147
1148 En este caso veremos que sucede luego de agregar y borrar una gran cantidad
1149  de registros del archivo, lo que provoca como consecuencia directa la fragmenta
1150 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
1151  produce un desperdicio de espacio.
1152 \layout Section
1153
1154 Organización Física
1155 \layout Standard
1156
1157 Esta organización guarda los registros pertenecientes al archivo en bloques
1158  de tamaño parametrizado, de modo que intentará guardar la mayor cantidad
1159  de registros que quepan en un bloque.
1160  
1161 \layout Standard
1162
1163 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
1164  del archivo.
1165 \layout Subsection
1166
1167 Comportamiento Particular de los Archivos Auxiliares
1168 \layout Subsubsection
1169
1170 Archivo de Bloques y Registros (.idx)
1171 \layout Comment
1172
1173 buscar algun caso extraordinario.
1174 \layout Subsubsection
1175
1176 Archivo de Bloques y Espacio Libre (.fsc)
1177 \layout Subsubsection
1178
1179 Archivo de Id`s Borrados (.did)
1180 \layout Standard
1181
1182 El comportamiento de este archivo, es común para todas las organizaciones
1183  y se ha explicado en 3.3.2.
1184 \layout Section
1185
1186 Funciones Principales
1187 \layout Subsection
1188
1189 EMUFS Tipo 3
1190 \layout Standard
1191
1192 Dento de 
1193 \emph on 
1194 tipo3.h
1195 \emph default 
1196  y 
1197 \emph on 
1198 tipo3.c
1199 \emph default 
1200  se encuentran las cabeceras y la implementación de las funciones principales
1201  respectivamente, las cuales dan funcionalidad a esta organización.
1202 \layout Standard
1203
1204 A continuación se comentará la descripción de algunas acciones importantes.
1205 \layout Subsubsection
1206
1207 Leer Registro
1208 \layout Standard
1209
1210 La lectura de un registro se realiza con la ayuda del archivo .
1211 \emph on 
1212 idx
1213 \emph default 
1214  el cual contiene la información de la posición del registro dentro del
1215  archivo de datos.
1216  Una vez leida esta información, se recupera el bloque (en su totalidad)
1217  del archivo y se busca secuencialmente el registro con el 
1218 \emph on 
1219 ID
1220 \emph default 
1221  especificado.
1222 \layout Standard
1223
1224 Ver: 
1225 \family typewriter 
1226 emufs_tipo3_leer_registro()
1227 \layout Subsubsection
1228
1229 Grabar Registro
1230 \layout Standard
1231
1232 Graba un registro en un bloque donde haya espacio suficiente, y si no crea
1233  un nuevo bloque y lo agrega al final del archivo.
1234 \layout Standard
1235
1236 Luego de grabar un registro, actualiza los archivos de índice .idx y .fsc
1237  para mantener la coherencia.
1238 \layout Standard
1239
1240 Ver: 
1241 \family typewriter 
1242 emufs_tipo3_grabar_registro()
1243 \layout Subsubsection
1244
1245 Borrar Registro
1246 \layout Standard
1247
1248 Borra un registro del archivo de datos, para esto levanta el bloque al que
1249  pertenece el archivo y ajusta los demás registros justificandolos hacia
1250  la izquierda.
1251 \layout Standard
1252
1253 Cabe destacar que para dar de baja un registro no hace falta borrarlo del
1254  archivo de datos, solo es necesario borrar las entradas en los archivos
1255  de índice, pero cuando se realiza el ajuste el algoritmo toma porciones
1256  del bloque del tamaño de un registro mas su encabezado - comenzando desde
1257  el siguiente al que fue borrado - y copia (sobreescribe) sobre el anterior.
1258  De esta manera, la información correspondiente al registro borrado no estará
1259  presente en el archivo de datos.
1260  Esto es una consecuencia del ajuste al borrar un registro, pudiendo no
1261  ser así, si no se realizara el mismo.
1262 \layout Subsubsection
1263
1264 Leer Estadísticas
1265 \layout Standard
1266
1267 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
1268  cantidad de bloques, cantidad de registros, espacio libre total, espacio
1269  libre promedio, espacio libre máximo y mínimo, etc.
1270 \layout Standard
1271
1272 Esta información es el resultado de ciertos cálculos realizados tanto en
1273  el archivo de datos como en los archivos índice.
1274 \layout Standard
1275
1276 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
1277  del archivo de datos, espacio libre total, cantidad de registros, cantidad
1278  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
1279  libres, etc.
1280 \layout Standard
1281
1282 Ver: 
1283 \family typewriter 
1284 emufs_tipo3_leer_estadisticas()
1285 \layout Subsubsection
1286
1287 Compactar el Archivo
1288 \layout Standard
1289
1290 Esta función intenta reorganizar el archivo de manera que el espacio libre
1291  sea lo menor posible, recordando siempre que un registro no puede ser almacenad
1292 o en mas de un bloque excepto que el tamaño del registro sea mayor que el
1293  del bloque.
1294 \layout Standard
1295
1296 Para realizar esto, se aprovecha la funcionalidad de 
1297 \emph on 
1298 emufs_tipo3_grabar_registro() 
1299 \emph default 
1300 ya que esta tiene la capacidad de determinar una posición mas eficiente
1301  en el archivo para un registro.
1302  Por esto lo que se hace es levantar uno por uno los registros y volverlos
1303  a grabar, de ese modo todos los 
1304 \emph on 
1305 gaps 
1306 \emph default 
1307 que pudieron haberse formado por la eliminación de registros serán cubiertos
1308  por otros.
1309 \layout Standard
1310
1311 Al finalizar este proceso se verifica si existen bloques vacios para truncar
1312  el archivo.
1313  Lo mismo se debe hacer con el archivo de espacios libres .
1314 \emph on 
1315 fsc 
1316 \emph default 
1317 el cual disminuye su tamaño también.
1318 \layout Standard
1319
1320 Ver: 
1321 \family typewriter 
1322 void emufs_tipo3_compactar()
1323 \layout Section
1324
1325 Consideraciones y Políticas de Diseño
1326 \layout Comment
1327
1328 Esto para mi va en organización física.
1329 \layout Standard
1330
1331 Se han tomado ciertas consideraciones para algunos casos particulares que
1332  se pueden presentar durante el uso/ejecución de la aplicación.
1333 \layout Enumerate
1334
1335 Cada registro tiene un encabezado que indica el 
1336 \emph on 
1337 id 
1338 \emph default 
1339 del mismo.
1340 \layout Enumerate
1341
1342 Si el tamaño del registro es mayor que el tamaño del bloque el registro
1343  se particionará en la cantidad de bloques que sea necesario, pero siempre
1344  se guardará desde el comienzo de un bloque, esto quiere decir que nunca
1345  se podrá encontrar un comienzo de registro en algún lugar de un bloque
1346  que no sea el comienzo del mismo.
1347 \layout Enumerate
1348
1349 Si el registro se divide en mas de un bloque, se le coloca el id como encabezado
1350  igualmente, pero en el archivo .
1351 \emph on 
1352 idx
1353 \emph default 
1354  solo se guarda el primer bloque.
1355  En el 
1356 \emph on 
1357 .fsc
1358 \emph default 
1359  se actualizan todos los bloques con el espacio libre que realmente tienen.
1360 \layout Chapter
1361
1362 Conclusiones
1363 \layout Standard
1364
1365 Las comparaciones, pruebas, etc...
1366 \the_end