]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - doc/informeChapter5.lyx
* bugfixes
[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.dsds
124 \layout Section
125
126 Comportamiento (funciones de la interfáz)
127 \layout Standard
128
129 Dentro de 
130 \series bold 
131 \emph on 
132 tipo2.h
133 \series default 
134 \emph default 
135  y 
136 \series bold 
137 \emph on 
138 tipo2.c
139 \series default 
140 \emph default 
141  se encuentran las cabeceras y la implementación de las funciones principales
142  respectivamente, las cuales dan funcionalidad a esta organización.
143  
144 \layout Standard
145
146 A continuación se comentará el funcionamiento algunas de las mas importantes.
147 \layout Subsection
148
149 Lectura de registros
150 \layout Standard
151
152 Como se vió al comienzo, los registros en este tipo de archivo no se encuentran
153  agrupados en bloques de ninguna índole y estan dispersos a lo largo del
154  archivo, con la particularidad de que pueden existir gaps o espacio libre,
155  entre dos registros dados.
156 \newline 
157
158 \layout Standard
159
160 Por ende la lectura de registros en este tipo de organización es muy simple
161  y dada la inexistencia de bloques, el procedimiento será el siguiente:
162 \layout Enumerate
163
164 Se determina el offset en bytes, donde comienza el registro deseado, a través
165  de su ID, buscando la misma en el archivo índice (
166 \series bold 
167 .idx
168 \series default 
169 )
170 \layout Enumerate
171
172 Ya determinada la posición física del registro dentro del archivo de datos
173  (
174 \series bold 
175 .dat
176 \series default 
177 ), nos posicionamos en la misma, y leemos el header del registro (
178 \series bold 
179 IDReg
180 \series default 
181  + 
182 \series bold 
183 RegSize
184 \series default 
185 ).
186  Contando así con el tamaño del registro, procedemos a leer el mismo (los
187  datos), dando por finalizada la lectura.
188 \layout Subsection
189
190 Altas de registros
191 \layout Standard
192
193 En el proceso de alta de registros entrarán en juego dos archivos descriptos
194  en la 
195 \emph on 
196 sección de archivos auxiliares
197 \emph default 
198 , siendo estos el archivo índice (
199 \series bold 
200 .idx
201 \series default 
202 ), y el archivo de gaps / espacios libres (
203 \series bold 
204 .fsc
205 \series default 
206 ).
207  
208 \newline 
209
210 \layout Standard
211
212 Así pues, a la hora de realizar una inserción de un registro en el archivo
213  de datos, el procedimiento será el siguiente:
214 \layout Enumerate
215
216 Calculamos el espacio que necesitaremos para el registro: sizeof(
217 \series bold 
218 EMUFS_REG_ID
219 \series default 
220 ) + sizeof(
221 \series bold 
222 EMUFS_REG_SIZE
223 \series default 
224 ) + sizeof(registro).
225 \layout Enumerate
226
227 Determinamos donde debemos insertar el registro, ya sea un gap donde entre,
228  o bien al final del archivo.
229 \layout Enumerate
230
231 Insertamos el registro e información de control (
232 \series bold 
233 header
234 \series default 
235 +
236 \series bold 
237 data
238 \series default 
239 ), en la posición indicada en el paso 2.
240 \layout Enumerate
241
242 En caso de haber utilizado un GAP, actualizamos el espacio libre restante
243  en el mismo y en caso de que se haya utilizado al totalidad del GAP, se
244  lo elimina del archivo (
245 \series bold 
246 .fsc
247 \series default 
248 ).
249 \layout Enumerate
250
251 Actualizamos la entrada correspondiente al registro ingresado (determinada
252  por su RegID), en el archivo índice (
253 \series bold 
254 .idx
255 \series default 
256 ), indicando su offset donde podrá ser accedido luego.
257 \layout Subsection
258
259 Bajas de registros
260 \layout Standard
261
262 En el proceso de baja de registros entrarán en juego los tres archivos descripto
263 s en la 
264 \emph on 
265 sección de archivos auxiliares
266 \emph default 
267 , siendo estos el archivo índice (
268 \series bold 
269 .idx
270 \series default 
271 ), el archivo de gaps / espacios libres (
272 \series bold 
273 .fsc
274 \series default 
275 ) y el archivo de ID's liberados (
276 \series bold 
277 .did
278 \series default 
279 ).
280 \newline 
281
282 \layout Standard
283
284 Dado que en la implementación de este tipo de organización física contamos
285  con los gaps o espacios libres entre registros, no se eliminará fisicamente
286  el registro del archivo de datos (
287 \series bold 
288 .dat
289 \series default 
290 ), pues entonces carecería de sentido el archivo anteriormente mencionado
291  (
292 \series bold 
293 .fsc
294 \series default 
295 ).
296  En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
297  y se marca fisicamente en el archivo de datos la eliminación mediante un
298  fill de los bytes correspondientes con un caracter nulo.
299  (hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
300 \newline 
301
302 \layout Standard
303
304 El proceso de baja o eliminación de un registro constará luego de los siguientes
305  pasos:
306 \layout Enumerate
307
308 Se obtiene el offset o posición relativa en donde se encuentra grabado el
309  registro dentro del archivo de datos.
310 \layout Enumerate
311
312 Se obtiene el tamaño del registro y se realiza un dummyfill del sector del
313  archivo correspondiente al registro que se está dando de baja.
314  (Se rellena la zona correspondiente a su header+data).
315 \layout Enumerate
316
317 Se agrega el GAP generado al archivo de gaps o espacios libres, y en caso
318  de haberse generado un GAP lindante con otro GAP, se realizará un merge
319  de los mismos y se los registrará bajo una única entrada en el archivo
320  de espacios libres (.fsc).
321 \layout Enumerate
322
323 Se agrega el ID que fue liberado, al archivo de ID's liberados (
324 \series bold 
325 .did
326 \series default 
327 ), al final del mismo (
328 \emph on 
329 pila
330 \emph default 
331 ).
332 \layout Enumerate
333
334 Se marca en el archivo índice (
335 \series bold 
336 .idx
337 \series default 
338 ) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
339  al registro recién eliminado (se le cambia el valor al n-esimo registro,
340  donde N = IDReg del reg eliminado).
341 \layout Subsection
342
343 Modificación de registros
344 \layout Standard
345
346 Dada la naturaleza del archivo de ID's liberados, y el manejo de espacio
347  libre del que consta esta organización de archivo, el proceso de modificación
348  de un registro se limita a los siguientes pasos:
349 \layout Enumerate
350
351 Se realiza la lectura del registro, mediante el respectivo procedimiento
352  ya desarollado anteriormente.
353 \layout Enumerate
354
355 Una vez que se cuenta con los nuevos datos modificados, se procede a dar
356  de baja el registro que ha sido modificado, e inmediatamente después se
357  realiza una inserción con los nuevos datos.
358 \layout Standard
359
360
361 \series bold 
362 \emph on 
363 NOTA:
364 \series default 
365 \emph default 
366  Como fue indicado, dada la naturaleza de PILA del subsistema de administración
367  de ID liberados, es asegurado que la nueva inserción del registro modificado
368  se realizará con el mismo RegID.
369 \layout Subsection
370
371 Obtención de estadísticas
372 \layout Subsection
373
374 Compactación del archivo de datos
375 \layout Standard
376
377 Asi como los otros dos tipos de datos, el que nos compete también cuenta
378  con la posibilidad de realizar la compactación de datos cuando el usuario
379  lo desee, justificando todos los registros a izquierda, eliminando así
380  los gaps existentes y decrementando el tamaño del archivo en disco (truncandolo
381 ).
382 \layout Standard
383
384 Para poder comprender como hemos implementado el proceso de recompactación
385  en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
386  cuales iremos describiendo el proceso.
387  Notemos antes, que el proceso de compactación esta directamente ligado
388  con el archivo de gaps o espacios libres (
389 \series bold 
390 .fsc
391 \series default 
392 )
393 \newline 
394
395 \layout Standard
396
397 Comenzemos con el siguiente cuadro situacional:
398 \newline 
399
400 \newline 
401
402 \begin_inset Graphics
403         filename graphics/Compact1.png
404         width 100text%
405         keepAspectRatio
406
407 \end_inset 
408
409
410 \newline 
411
412 \layout Standard
413
414 Partiendo de esta base, el algoritmo de compactación tomará en su inicio
415  al primer gap existente dentro del archivo de datos, en este caso llamado
416  
417 \series bold 
418 Gap0
419 \series default 
420 .
421  Luego, establecerá que el 
422 \series bold 
423 Source
424 \series default 
425  a partir de donde se quieren mover datos, sera:
426 \newline 
427
428 \layout Standard
429
430
431 \series bold 
432 StartGap0
433 \series default 
434  + 
435 \series bold 
436 SizeGap0
437 \series default 
438  = 
439 \series bold 
440 EndGap0
441 \series default 
442  = 
443 \series bold 
444 Source
445 \newline 
446
447 \layout Standard
448
449 Lo cual no es nada más y nada menos que lo obvio, la fuente a partir de
450  donde se mueven los datos, sera el fin del primer gap, donde comienzan
451  datos.
452  Como destino (
453 \series bold 
454 Destination
455 \series default 
456 ) del movimiento, se establece inicialmente, el inicio del gap, o sea 
457 \series bold 
458 StartGap0 = Destination
459 \series default 
460 .
461 \layout Standard
462
463 Luego, el algoritmo entrara en un bucle while (mientras haya bucles por
464  levantar), el cual trabajara hasta el final de la compactación de la siguiente
465  manera:
466 \newline 
467
468 \layout Standard
469
470
471 \series bold 
472 Mientras haya Gaps
473 \series default 
474  {
475 \layout Enumerate
476
477 Se levanta el proximo gap al levantado en una instancia previa.
478  En este ejemplo, durante el primer loop del while, se levantará 
479 \series bold 
480 Gap1
481 \layout Enumerate
482
483 Luego, se calcula cuantos bytes hay que mover hacia el Destination de la
484  siguiente manera:
485 \layout Enumerate
486
487
488 \series bold 
489 Mustmove_bytes
490 \series default 
491  = 
492 \series bold 
493 StartGap1
494 \series default 
495  - 
496 \series bold 
497 Source
498 \series default 
499  = 
500 \series bold 
501 StartGap1
502 \series default 
503  - 
504 \series bold 
505 EndGap0 (
506 \series default 
507 Lo cual nuevamente es lógico pues querremos mover lo que se encuentra entre
508  el final del primer gap levantado y el inicio del siguiente).
509 \layout Enumerate
510
511 Se realiza el movimiento de los datos, utilizando las direcciones 
512 \series bold 
513 Source
514 \series default 
515  y 
516 \series bold 
517 Destination
518 \series default 
519 , así como la variable 
520 \series bold 
521 Mustmove_bytes
522 \series default 
523  que nos indica cuantos bytes transferir.
524  
525 \series bold 
526
527 \newline 
528  
529 \newline 
530 IMPORTANTE: 
531 \emph on 
532 La transferencia se hace de a chunks de 25 bytes + un resto segun el valor
533  de Mustmove_bytes.
534 \layout Enumerate
535
536 Se establece como gap de referencia, al ultimo gap leido (En este caso se
537  realiza: 
538 \series bold 
539 StartGap0
540 \series default 
541  = 
542 \series bold 
543 StartGap1
544 \series default 
545
546 \series bold 
547 Gap0Size = Gap1Size
548 \series default 
549 ) y termina el código de repetición del bucle, dando lugar a la carga del
550  siguiente gap en el inicio del mismo.
551 \layout Standard
552
553
554 \series bold 
555 }
556 \newline 
557
558 \layout Standard
559
560 Luego del primer bucle, el archivo se vera de la siguiente forma:
561 \newline 
562
563 \newline 
564
565 \begin_inset Graphics
566         filename graphics/Compact2.png
567         width 100text%
568
569 \end_inset 
570
571
572 \newline 
573
574 \layout Standard
575
576 Notemos que al final de la porción de datos de los bytes movidos (donde
577  quedo apuntando 
578 \series bold 
579 Destination
580 \series default 
581 ), hay basura que será pisada por el próximo movimiento.
582 \newline 
583
584 \layout Standard
585
586 En el próximo loop, el bucle levantará un nuevo gap, y utilizando el gap
587  anterior (En esta caso el Gap anterior será 
588 \series bold 
589 Gap1
590 \series default 
591 ) como referencia, realizará los mismos cálculos, desde donde transferir
592  y cuantos bytes mover.
593  (El destino es solo establecido inicialmente por código, y para el resto
594  del algoritmo es el lugar donde quedo el puntero destination luego de la
595  última escritura).
596 \layout Standard
597
598 Una vez que se salga del bucle while, se realizará un último movimiento
599  preprogramado, donde la fuente (
600 \series bold 
601 Source
602 \series default 
603 ) será el final del ultimo gap, y la cantidad de bytes a mover será lo que
604  se encuentre luego del mismo hasta el fin de archivo.
605 \newline 
606
607 \layout Standard
608
609
610 \series bold 
611 Source = StartLastGap + SizeLastGap = EndLastGap
612 \layout Standard
613
614
615 \series bold 
616 Mustmove_bytes = Datsize - Source
617 \series default 
618
619 \newline 
620
621 \layout Standard
622
623 Damos por terminada así, la explicación del algoritmo de compresión el cual
624  para el caso del tipo 2, es realmente bastante sencillo.
625 \layout Section
626
627 Detalles de implementación (funciones internas, ver si lo ponemos o no)
628 \the_end