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