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