]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - doc/informeChapter5.lyx
Paso el fin de línea a formato Unix (perdon tenia que verlo para estudiar :P).
[z.facultad/75.06/emufs.git] / doc / informeChapter5.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 Chapter
28
29 Archivo sin bloques y registros de longitud variable
30 \layout Standard
31
32 Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
33  de longitud variablesin realizar su agrupación en bloques, y como veremos
34  en la siguiente sección, tambien permitirá la administración de gaps que
35  queden en el archivo luego de operaciones de baja de registros.
36 \layout Section
37
38 Organización física
39 \layout Standard
40
41 Este tipo de archivo realizará el almacenamiento de registros de longitud
42  variable en disco, su borrado y modificación sin la utilización de bloques
43  de ningún tipo.
44  Su implementación se encuentra en los archivos fuente (
45 \series bold 
46 tipo2.c
47 \series default 
48  y 
49 \series bold 
50 tipo2.h
51 \series default 
52 ).
53 \newline 
54
55 \layout Standard
56
57 Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
58  simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
59  de archivo en cuestión.
60 \newline 
61
62 \layout Standard
63
64 Para poder entender mejor la organización fisica de este tipo de archivo,
65  tomemos el caso hipotético en el que se encuentran grabados 
66 \series bold 
67 dos registros
68 \series default 
69  (comenzando desde registro 0) de 
70 \series bold 
71 30 bytes
72 \series default 
73 , y 
74 \series bold 
75 25 bytes
76 \series default 
77 , respectivamente.
78  Supongamos también que entre el registro 0 y 1 se encontraba un 
79 \series bold 
80 registro de 10 bytes
81 \series default 
82  que fue 
83 \series bold 
84 borrado
85 \series default 
86 , generando un 
87 \series bold 
88 gap
89 \series default 
90  
91 \series bold 
92 o freespace
93 \series default 
94 .
95  Si miramos al archivo de datos (.DAT) en el disco nos encontraremos con
96  lo siguiente:
97 \newline 
98
99 \newline 
100
101 \begin_inset Graphics
102         filename graphics/Example1.png
103         width 100text%
104
105 \end_inset 
106
107
108 \newline 
109
110 \newline 
111 Como se puede observar, a nivel físico cada registro grabado esta compuesto
112  por un Header cuyo tamaño total es de 8 bytes (
113 \series bold 
114 EMUFS_REG_ID
115 \series default 
116  + 
117 \series bold 
118 EMUFS_REG_SIZE
119 \series default 
120 ), y posteriormente el registro (bloque de datos) en sí.
121  Luego se encuentra el espacio libre de 18 bytes dejado por el registro
122  de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
123  el segundo registro mencionado.
124 \layout Subsection
125
126 Comportamiento Particular de los Archivos Auxiliares
127 \layout Standard
128
129 Como fue explicado al inicio de la documentación, la implementacion de cualquier
130 a de las tres organizaciones físicas de archivos presenta la necesidad de
131  poseer tres archivos auxiliares que actuarán como índice de direcciones
132  de registro (.
133 \series bold 
134 idx
135 \series default 
136 ), administrador de espacio libre (
137 \series bold 
138 .fsc
139 \series default 
140 ) y administrador de Id's liberados (
141 \series bold 
142 .did
143 \series default 
144 ) respectivamente.
145 \layout Standard
146
147 No obstante, cada tipo de organización presentara sus particularidades respecto
148  de estos tres archivos, las cuales describiremos a continuación en caso
149  de haberla.
150 \layout Subsubsection
151
152 Archivo índice o de posiciones relativas (.idx)
153 \layout Standard
154
155 El archivo indice (
156 \series bold 
157 .idx
158 \series default 
159 ), permite la localizacin de los registros en el .DAT de forma directa, mediante
160  la obtención de su offset o posición relativa respecto del inicio del 
161 \series bold 
162 .dat
163 \series default 
164  en donde se encuentra un registro dado, indicado por su ID.
165 \layout Standard
166
167 Así pues, si tomamos el ejemplo descripto al inicio de este capítudlo, tendremos
168  las siguientes entradas en el archivo indice 
169 \series bold 
170 .idx
171 \series default 
172  :
173 \newline 
174
175 \layout Standard
176
177
178 \begin_inset  Tabular
179 <lyxtabular version="3" rows="3" columns="3">
180 <features>
181 <column alignment="center" valignment="top" leftline="true" width="0">
182 <column alignment="center" valignment="top" leftline="true" width="0">
183 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
184 <row topline="true" bottomline="true">
185 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
186 \begin_inset Text
187
188 \layout Standard
189
190
191 \emph on 
192 ID_REGISTRO
193 \end_inset 
194 </cell>
195 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
196 \begin_inset Text
197
198 \layout Standard
199
200
201 \emph on 
202 OFFSET
203 \end_inset 
204 </cell>
205 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
206 \begin_inset Text
207
208 \layout Standard
209
210 \end_inset 
211 </cell>
212 </row>
213 <row topline="true">
214 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
215 \begin_inset Text
216
217 \layout Standard
218
219
220 \series bold 
221 0
222 \end_inset 
223 </cell>
224 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
225 \begin_inset Text
226
227 \layout Standard
228
229
230 \series bold 
231 4
232 \end_inset 
233 </cell>
234 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
235 \begin_inset Text
236
237 \layout Standard
238
239 El primer registro (reg0) comienza en el byte 4
240 \end_inset 
241 </cell>
242 </row>
243 <row topline="true" bottomline="true">
244 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
245 \begin_inset Text
246
247 \layout Standard
248
249 1
250 \end_inset 
251 </cell>
252 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
253 \begin_inset Text
254
255 \layout Standard
256
257
258 \series bold 
259 60
260 \end_inset 
261 </cell>
262 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
263 \begin_inset Text
264
265 \layout Standard
266
267 El segundo registro (reg1) comienza en el byte 60
268 \end_inset 
269 </cell>
270 </row>
271 </lyxtabular>
272
273 \end_inset 
274
275
276 \layout Standard
277
278
279 \series bold 
280 \emph on 
281 \SpecialChar ~
282
283 \newline 
284 Observación:
285 \series default 
286 \emph default 
287  LOCATION indica donde comienza el header del registro buscado, y por consiguien
288 te luego del header tendremos el registro en sí (los datos).
289 \layout Subsubsection
290
291 Achivo de Gaps / Espacios Libres (.fsc)
292 \layout Standard
293
294 El archivo de espacios libres o gaps (.fsc), tiene como función la administracion
295  del espacio libre o gaps (agujeros), generados por previas eliminaciones
296  de registros en el archivo de datos.
297  El mismo, nos indicará donde hay lugar para insertar un nuevo registro
298  (se podrán insertar en algún gap acorde, o bien al final del archivo).
299  Este archivo será utilizado tambien para el proceso de compactación de
300  un archivo, explicado luego.
301 \layout Standard
302
303 Así pues, si tomamos el ejemplo descripto al inicio del documento, tendremos
304  las siguientes entradas en el archivo índice 
305 \series bold 
306 .fsc
307 \series default 
308  : 
309 \newline 
310
311 \newline 
312
313 \begin_inset  Tabular
314 <lyxtabular version="3" rows="2" columns="3">
315 <features>
316 <column alignment="center" valignment="top" leftline="true" width="0">
317 <column alignment="center" valignment="top" leftline="true" width="0">
318 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
319 <row topline="true" bottomline="true">
320 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
321 \begin_inset Text
322
323 \layout Standard
324
325
326 \emph on 
327 OFFSET
328 \end_inset 
329 </cell>
330 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
331 \begin_inset Text
332
333 \layout Standard
334
335
336 \emph on 
337 FREESPACE
338 \end_inset 
339 </cell>
340 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
341 \begin_inset Text
342
343 \layout Standard
344
345 \end_inset 
346 </cell>
347 </row>
348 <row topline="true" bottomline="true">
349 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
350 \begin_inset Text
351
352 \layout Standard
353
354
355 \series bold 
356 42
357 \end_inset 
358 </cell>
359 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
360 \begin_inset Text
361
362 \layout Standard
363
364
365 \series bold 
366 18
367 \end_inset 
368 </cell>
369 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
370 \begin_inset Text
371
372 \layout Standard
373
374 18 bytes libres a partir del byte 42 del .dat
375 \end_inset 
376 </cell>
377 </row>
378 </lyxtabular>
379
380 \end_inset 
381
382
383 \layout Standard
384
385
386 \series bold 
387 \emph on 
388 \SpecialChar ~
389
390 \newline 
391 Nota:
392 \series default 
393 \emph default 
394  Por requerimiento del algoritmo de compactación, los gaps se graban en
395  forma ordenada en el (.fsc).
396  (El orden se corresponde con lo que hay en el .dat)
397 \layout Subsubsection*
398
399 GAP Merging
400 \layout Standard
401
402 Si bien la utilización concreta de los GAPS será explicada posteriormente
403  en la ALTA y BAJA de registros, debemos remarcar la funcionalidad de MERGING
404  que posee nuestro sistema FSC.
405 \layout Standard
406
407 Ante la eliminación de un registro del archivo de datos, se generara por
408  consiguiente un gap o espacio libre en alguna posición del archivo.
409  Ese gap deberá ser registrado en el archivo de gaps (.fsc).
410  Ahora bien, nuestro sistema de gaps, contemplará como es debido, la posibilidad
411  de que se haya eliminado un registro que posee un GAP por delante, un GAP
412  por detrás, o bien un GAP por delante y por detrás del mismo.
413 \layout Standard
414
415 Nuestro sistema actuará en consecuencia, realizando un merge de los espacios
416  libres, y unificándolos en una UNICA entrada en el archivo .fsc, que contendrá
417  como dato de freespace, la suma correspondiente de los espacios libres
418  antes mencionados.
419 \layout Subsubsection
420
421 Archivo de ID's liberados (.did)
422 \layout Standard
423
424 El archivo de ID's liberados no presenta ningún aspecto particular en este
425  tipo de organización.
426  Remitirse al capítulo correspondiente a los archivos auxiliares para consultar
427  su estructura y funcionamiento.
428 \layout Section
429
430 Comportamiento (funciones de la interfáz)
431 \layout Standard
432
433 Dentro de 
434 \series bold 
435 \emph on 
436 tipo2.h
437 \series default 
438 \emph default 
439  y 
440 \series bold 
441 \emph on 
442 tipo2.c
443 \series default 
444 \emph default 
445  se encuentran las cabeceras y la implementación de las funciones principales
446  respectivamente, las cuales dan funcionalidad a esta organización.
447  
448 \layout Standard
449
450 A continuación se comentará el funcionamiento algunas de las mas importantes.
451 \layout Subsection
452
453 Lectura de registros
454 \layout Standard
455
456 Como se vió al comienzo, los registros en este tipo de archivo no se encuentran
457  agrupados en bloques de ninguna índole y estan dispersos a lo largo del
458  archivo, con la particularidad de que pueden existir gaps o espacio libre,
459  entre dos registros dados.
460 \newline 
461
462 \layout Standard
463
464 Por ende la lectura de registros en este tipo de organización es muy simple
465  y dada la inexistencia de bloques, el procedimiento será el siguiente:
466 \layout Enumerate
467
468 Se determina el offset en bytes, donde comienza el registro deseado, a través
469  de su ID, buscando la misma en el archivo índice (
470 \series bold 
471 .idx
472 \series default 
473 )
474 \layout Enumerate
475
476 Ya determinada la posición física del registro dentro del archivo de datos
477  (
478 \series bold 
479 .dat
480 \series default 
481 ), nos posicionamos en la misma, y leemos el header del registro (
482 \series bold 
483 IDReg
484 \series default 
485  + 
486 \series bold 
487 RegSize
488 \series default 
489 ).
490  Contando así con el tamaño del registro, procedemos a leer el mismo (los
491  datos), dando por finalizada la lectura y devolviendo el registro pedido.
492 \layout Standard
493
494
495 \series bold 
496 \emph on 
497 ver
498 \series default 
499 : void *emufs_tipo2_modificar_registro()
500 \layout Subsection
501
502 Altas de registros
503 \layout Standard
504
505 En el proceso de alta de registros entrarán en juego dos archivos descriptos
506  en la 
507 \emph on 
508 sección de archivos auxiliares
509 \emph default 
510 , siendo estos el archivo índice (
511 \series bold 
512 .idx
513 \series default 
514 ), y el archivo de gaps / espacios libres (
515 \series bold 
516 .fsc
517 \series default 
518 ).
519  
520 \newline 
521
522 \layout Standard
523
524 Así pues, a la hora de realizar una inserción de un registro en el archivo
525  de datos, el procedimiento será el siguiente:
526 \layout Enumerate
527
528 Calculamos el espacio que necesitaremos para el registro: sizeof(
529 \series bold 
530 EMUFS_REG_ID
531 \series default 
532 ) + sizeof(
533 \series bold 
534 EMUFS_REG_SIZE
535 \series default 
536 ) + sizeof(registro).
537 \layout Enumerate
538
539 Determinamos donde debemos insertar el registro, ya sea un gap donde entre,
540  o bien al final del archivo.
541 \layout Enumerate
542
543 Insertamos el registro e información de control (
544 \series bold 
545 header
546 \series default 
547 +
548 \series bold 
549 data
550 \series default 
551 ), en la posición indicada en el paso 2.
552 \layout Enumerate
553
554 En caso de haber utilizado un GAP, actualizamos el espacio libre restante
555  en el mismo y en caso de que se haya utilizado al totalidad del GAP, se
556  lo elimina del archivo (
557 \series bold 
558 .fsc
559 \series default 
560 ).
561 \layout Enumerate
562
563 Actualizamos la entrada correspondiente al registro ingresado (determinada
564  por su RegID), en el archivo índice (
565 \series bold 
566 .idx
567 \series default 
568 ), indicando su offset donde podrá ser accedido luego.
569 \layout Standard
570
571
572 \series bold 
573 \emph on 
574 ver
575 \series default 
576 : EMUFS_REG_ID emufs_tipo2_agregar_registro()
577 \layout Subsection
578
579 Bajas de registros
580 \layout Standard
581
582 En el proceso de baja de registros entrarán en juego los tres archivos descripto
583 s en la 
584 \emph on 
585 sección de archivos auxiliares
586 \emph default 
587 , siendo estos el archivo índice (
588 \series bold 
589 .idx
590 \series default 
591 ), el archivo de gaps / espacios libres (
592 \series bold 
593 .fsc
594 \series default 
595 ) y el archivo de ID's liberados (
596 \series bold 
597 .did
598 \series default 
599 ).
600 \newline 
601
602 \layout Standard
603
604 Dado que en la implementación de este tipo de organización física contamos
605  con los gaps o espacios libres entre registros, no se eliminará fisicamente
606  el registro del archivo de datos (
607 \series bold 
608 .dat
609 \series default 
610 ), pues entonces carecería de sentido el archivo anteriormente mencionado
611  (
612 \series bold 
613 .fsc
614 \series default 
615 ).
616  En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
617  y se marca fisicamente en el archivo de datos la eliminación mediante un
618  fill de los bytes correspondientes con un caracter nulo.
619  (hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
620 \newline 
621
622 \layout Standard
623
624 El proceso de baja o eliminación de un registro constará luego de los siguientes
625  pasos:
626 \layout Enumerate
627
628 Se obtiene el offset o posición relativa en donde se encuentra grabado el
629  registro dentro del archivo de datos.
630 \layout Enumerate
631
632 Se obtiene el tamaño del registro y se realiza un dummyfill del sector del
633  archivo correspondiente al registro que se está dando de baja.
634  (Se rellena la zona correspondiente a su header+data).
635 \layout Enumerate
636
637 Se agrega el GAP generado al archivo de gaps o espacios libres, y en caso
638  de haberse generado un GAP lindante con otro GAP, se realizará un merge
639  de los mismos y se los registrará bajo una única entrada en el archivo
640  de espacios libres (.fsc).
641 \layout Enumerate
642
643 Se agrega el ID que fue liberado, al archivo de ID's liberados (
644 \series bold 
645 .did
646 \series default 
647 ), al final del mismo (
648 \emph on 
649 pila
650 \emph default 
651 ).
652 \layout Enumerate
653
654 Se marca en el archivo índice (
655 \series bold 
656 .idx
657 \series default 
658 ) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
659  al registro recién eliminado (se le cambia el valor al n-esimo registro,
660  donde N = IDReg del reg eliminado).
661 \layout Standard
662
663
664 \series bold 
665 \emph on 
666 ver
667 \series default 
668 : int emufs_tipo2_borrar_registro()
669 \layout Subsection
670
671 Modificación de registros
672 \layout Standard
673
674 Dada la naturaleza del archivo de ID's liberados, y el manejo de espacio
675  libre del que consta esta organización de archivo, el proceso de modificación
676  de un registro se limita a los siguientes pasos:
677 \layout Enumerate
678
679 Se realiza la lectura del registro, mediante el respectivo procedimiento
680  ya desarollado anteriormente.
681 \layout Enumerate
682
683 Una vez que se cuenta con los nuevos datos modificados, se procede a dar
684  de baja el registro que ha sido modificado, e inmediatamente después se
685  realiza una inserción con los nuevos datos.
686 \layout Standard
687
688
689 \series bold 
690 \emph on 
691 NOTA:
692 \series default 
693 \emph default 
694  Como fue indicado, dada la naturaleza de PILA del subsistema de administración
695  de ID liberados, es asegurado que la nueva inserción del registro modificado
696  se realizará con el mismo RegID.
697 \newline 
698
699 \layout Standard
700
701
702 \series bold 
703 \emph on 
704 ver
705 \series default 
706 : EMUFS_REG_ID emufs_tipo2_modificar_registro()
707 \layout Subsection
708
709 Obtención de estadísticas
710 \layout Standard
711
712 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
713  cantidad de bloques, cantidad de registros, espacio libre total, espacio
714  libre promedio, espacio libre máximo y mínimo, etc.
715 \layout Standard
716
717 Esta información es el resultado de ciertos cálculos realizados tanto en
718  el archivo de datos como en los archivos índice.
719 \layout Standard
720
721 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
722  del archivo de datos, espacio libre total, cantidad de registros, cantidad
723  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
724  libres, etc.
725 \newline 
726
727 \layout Standard
728
729
730 \series bold 
731 \emph on 
732 ver
733 \series default 
734 : EMUFS_Estadisticas emufs_tipo3_leer_estadisticas()
735 \layout Subsection
736
737 Compactación del archivo de datos
738 \layout Standard
739
740 Asi como los otros dos tipos de datos, el que nos compete también cuenta
741  con la posibilidad de realizar la compactación de datos cuando el usuario
742  lo desee, justificando todos los registros a izquierda, eliminando así
743  los gaps existentes y decrementando el tamaño del archivo en disco (truncandolo
744 ).
745 \layout Standard
746
747 Para poder comprender como hemos implementado el proceso de recompactación
748  en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
749  cuales iremos describiendo el proceso.
750  Notemos antes, que el proceso de compactación esta directamente ligado
751  con el archivo de gaps o espacios libres (
752 \series bold 
753 .fsc
754 \series default 
755 )
756 \newline 
757
758 \layout Standard
759
760 Comenzemos con el siguiente cuadro situacional:
761 \newline 
762
763 \newline 
764
765 \begin_inset Graphics
766         filename graphics/Compact1.png
767         width 100text%
768         keepAspectRatio
769
770 \end_inset 
771
772
773 \newline 
774
775 \layout Standard
776
777 Partiendo de esta base, el algoritmo de compactación tomará en su inicio
778  al primer gap existente dentro del archivo de datos, en este caso llamado
779  
780 \series bold 
781 Gap0
782 \series default 
783 .
784  Luego, establecerá que el 
785 \series bold 
786 Source
787 \series default 
788  a partir de donde se quieren mover datos, sera:
789 \newline 
790
791 \layout Standard
792
793
794 \series bold 
795 StartGap0
796 \series default 
797  + 
798 \series bold 
799 SizeGap0
800 \series default 
801  = 
802 \series bold 
803 EndGap0
804 \series default 
805  = 
806 \series bold 
807 Source
808 \newline 
809
810 \layout Standard
811
812 Lo cual no es nada más y nada menos que lo obvio, la fuente a partir de
813  donde se mueven los datos, sera el fin del primer gap, donde comienzan
814  datos.
815  Como destino (
816 \series bold 
817 Destination
818 \series default 
819 ) del movimiento, se establece inicialmente, el inicio del gap, o sea 
820 \series bold 
821 StartGap0 = Destination
822 \series default 
823 .
824 \layout Standard
825
826 Luego, el algoritmo entrara en un bucle while (mientras haya bucles por
827  levantar), el cual trabajara hasta el final de la compactación de la siguiente
828  manera:
829 \newline 
830
831 \layout Standard
832
833
834 \series bold 
835 Mientras haya Gaps
836 \series default 
837  {
838 \layout Enumerate
839
840 Se levanta el proximo gap al levantado en una instancia previa.
841  En este ejemplo, durante el primer loop del while, se levantará 
842 \series bold 
843 Gap1
844 \layout Enumerate
845
846 Luego, se calcula cuantos bytes hay que mover hacia el Destination de la
847  siguiente manera:
848 \layout Enumerate
849
850
851 \series bold 
852 Mustmove_bytes
853 \series default 
854  = 
855 \series bold 
856 StartGap1
857 \series default 
858  - 
859 \series bold 
860 Source
861 \series default 
862  = 
863 \series bold 
864 StartGap1
865 \series default 
866  - 
867 \series bold 
868 EndGap0 (
869 \series default 
870 Lo cual nuevamente es lógico pues querremos mover lo que se encuentra entre
871  el final del primer gap levantado y el inicio del siguiente).
872 \layout Enumerate
873
874 Se realiza el movimiento de los datos, utilizando las direcciones 
875 \series bold 
876 Source
877 \series default 
878  y 
879 \series bold 
880 Destination
881 \series default 
882 , así como la variable 
883 \series bold 
884 Mustmove_bytes
885 \series default 
886  que nos indica cuantos bytes transferir.
887  
888 \series bold 
889
890 \newline 
891  
892 \newline 
893 IMPORTANTE: 
894 \emph on 
895 La transferencia se hace de a chunks de 25 bytes + un resto segun el valor
896  de Mustmove_bytes.
897 \layout Enumerate
898
899 Se establece como gap de referencia, al ultimo gap leido (En este caso se
900  realiza: 
901 \series bold 
902 StartGap0
903 \series default 
904  = 
905 \series bold 
906 StartGap1
907 \series default 
908
909 \series bold 
910 Gap0Size = Gap1Size
911 \series default 
912 ) y termina el código de repetición del bucle, dando lugar a la carga del
913  siguiente gap en el inicio del mismo.
914 \layout Standard
915
916
917 \series bold 
918 }
919 \newline 
920
921 \layout Standard
922
923 Luego del primer bucle, el archivo se vera de la siguiente forma:
924 \newline 
925
926 \newline 
927
928 \begin_inset Graphics
929         filename graphics/Compact2.png
930         width 100text%
931
932 \end_inset 
933
934
935 \newline 
936
937 \layout Standard
938
939 Notemos que al final de la porción de datos de los bytes movidos (donde
940  quedo apuntando 
941 \series bold 
942 Destination
943 \series default 
944 ), hay basura que será pisada por el próximo movimiento.
945 \newline 
946
947 \layout Standard
948
949 En el próximo loop, el bucle levantará un nuevo gap, y utilizando el gap
950  anterior (En esta caso el Gap anterior será 
951 \series bold 
952 Gap1
953 \series default 
954 ) como referencia, realizará los mismos cálculos, desde donde transferir
955  y cuantos bytes mover.
956  (El destino es solo establecido inicialmente por código, y para el resto
957  del algoritmo es el lugar donde quedo el puntero destination luego de la
958  última escritura).
959 \layout Standard
960
961 Una vez que se salga del bucle while, se realizará un último movimiento
962  preprogramado, donde la fuente (
963 \series bold 
964 Source
965 \series default 
966 ) será el final del ultimo gap, y la cantidad de bytes a mover será lo que
967  se encuentre luego del mismo hasta el fin de archivo.
968 \newline 
969
970 \layout Standard
971
972
973 \series bold 
974 Source = StartLastGap + SizeLastGap = EndLastGap
975 \layout Standard
976
977
978 \series bold 
979 Mustmove_bytes = Datsize - Source
980 \series default 
981
982 \newline 
983
984 \layout Standard
985
986 Damos por terminada así, la explicación del algoritmo de compresión el cual
987  para el caso del tipo 2, es realmente bastante sencillo.
988 \newline 
989
990 \layout Standard
991
992
993 \series bold 
994 \emph on 
995 ver
996 \series default 
997 : void emufs_tipo2_compactar()
998 \layout Section
999
1000 Detalles de implementación (funciones internas, ver si lo ponemos o no)
1001 \the_end