]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - doc/informe.lyx
pequeña introduccion para que no quede vacio ese campo
[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 Standard
47
48 Esta es la documentación correspondiente a las API`s para el manejo de tres
49  organizaciones de archivo diferentes.
50  A continuación se describe cada una de ellas y su modo de funcionamiento
51  y sus características principales.
52  De la correcta elección de la organización, dependerá la eficiencia de
53  la aplicación que la utilice.
54  
55 \layout Chapter
56
57 Estructura común
58 \layout Section
59
60 Tipos
61 \layout Standard
62
63 Se detallan a continuación los tipos de datos definidos y utilizados en
64  las distintas implementaciones que conforman nuestro sistema, siendo el
65  más importante de ellos, la estructura 
66 \family typewriter 
67 EMUFS
68 \family default 
69  que actúa como interfaz común para el manejo de cualquier tipo de archivo
70  (no importa que tipo de organización física posea un archivo, esta estructura
71  prooverá una interfaz (funciones) para su manejo).
72 \layout Subsection
73
74 Tipos Comunes
75 \layout Standard
76
77 En la implementación de cada tipo de organización física, así como tambien
78  en las API de los archivos auxiliares comunes a ellas, se da la utilización
79  de tipo definidos para una clara interfaz entre las mismas, los cuales
80  son brevemente descriptos a continuación y pueden ser hallados en el archivo
81  
82 \series bold 
83 emufs.h
84 \series default 
85 :
86 \layout Itemize
87
88
89 \family typewriter 
90 EMUFS_REG_ID
91 \family default 
92 : usado para representar un 
93 \emph on 
94 Id
95 \emph default 
96  de un registro.
97 \layout Itemize
98
99
100 \family typewriter 
101 EMUFS_REG_SIZE
102 \family default 
103 : usado para representar el tamaño en bytes de un registro.
104 \layout Itemize
105
106
107 \family typewriter 
108 EMUFS_BLOCK_ID
109 \family default 
110 : usado para representar un número de bloque.
111 \layout Itemize
112
113
114 \family typewriter 
115 EMUFS_BLOCK_SIZE
116 \family default 
117 : usado para representar el tamaño en bytes de un bloque.
118 \layout Itemize
119
120
121 \family typewriter 
122 EMUFS_FREE
123 \family default 
124 : usado para representar espacio libre en bytes.
125 \layout Itemize
126
127
128 \family typewriter 
129 EMUFS_OFFSET
130 \family default 
131 : usado para representar un offset.
132 \layout Standard
133
134 Todos son del tipo 
135 \family typewriter 
136 unsigned long
137 \family default 
138 .
139 \layout Subsection
140
141 EMUFS
142 \layout Standard
143
144
145 \family typewriter 
146 EMUFS
147 \family default 
148 \emph on 
149  
150 \emph default 
151 es la estuctura principal que encapsula todas las funciones para el manejo
152  de un archivo de datos.
153  Posee punteros a funciones que dependiendo de la organización fisica por
154  la cual se opte dentro del sistema, serán asignados de acorde.
155  
156 \layout Standard
157
158 Su declaración puede ser observada en el archivo 
159 \series bold 
160 emufs.h 
161 \series default 
162 y la misma cuenta con los siguiente campos:
163 \layout Itemize
164
165
166 \family typewriter 
167 EMUFS_Tipo
168 \family default 
169  que es un tipo enumerado que indica cual es la organización.
170 \layout Itemize
171
172
173 \family typewriter 
174 EMUFS_BLOCK_SIZE
175 \family default 
176  indica el tamaño del bloque para los tipos 1 y 3.
177 \layout Itemize
178
179
180 \family typewriter 
181 EMUFS_REG_SIZE
182 \family default 
183  indica el tamaño del registro, para el tipo 3 que posee tamaño constante.
184 \layout Itemize
185
186
187 \family typewriter 
188 void **leer_bloque() 
189 \family default 
190 puntero a la función para leer un bloque.
191 \layout Itemize
192
193
194 \family typewriter 
195 void *leer_bloque_raw()
196 \family default 
197  puntero a la función para leer un bloque, el anterior y el siguiente.
198 \layout Itemize
199
200
201 \family typewriter 
202 void **leer_registro()
203 \family default 
204  puntero a la función para leer un registro.
205 \layout Itemize
206
207
208 \family typewriter 
209 void **leer_registro_raw()
210 \family default 
211  puntero a la función para leer un registro con su encabezado.
212 \layout Itemize
213
214
215 \family typewriter 
216 EMUFS_REG_ID *grabar_registro()
217 \family default 
218  puntero a la función para grabar un registro.
219 \layout Itemize
220
221
222 \family typewriter 
223 EMUFS_REG_ID *modificar_registro() 
224 \family default 
225 puntero a la función para modificar un registro.
226 \layout Itemize
227
228
229 \family typewriter 
230 int *borrar_registro()
231 \family default 
232  puntero a la función para borrar un registro.
233 \layout Itemize
234
235
236 \family typewriter 
237 EMUFS_Estadisticas *leer_estadisticas()
238 \family default 
239  puntero a la función para cargar una estructura con las estadísticas.
240 \layout Itemize
241
242
243 \family typewriter 
244 void *compactar()
245 \family default 
246  puntero a la función para compactar un archivo.
247 \layout Itemize
248
249
250 \family typewriter 
251 char *nombre
252 \family default 
253  almacena el nombre del archivo sin extensión.
254 \layout Standard
255
256 Esta estructura define los valores de sus punteros según el tipo de organización
257  que se desee manejar y esto se realiza a través del API emufs, implementado
258  en 
259 \series bold 
260 emufs.c
261 \series default 
262 , que se describirá posteriormente.
263 \layout Standard
264
265 Por ejemplo si se desea crear un archivo de nombre 
266 \begin_inset Quotes eld
267 \end_inset 
268
269 facturas
270 \begin_inset Quotes erd
271 \end_inset 
272
273  organizado de la forma 3, se invoca a la función:
274 \layout Standard
275
276
277 \family typewriter 
278 emufs_crear(filename,tipo,tam_bloque,tam_reg), 
279 \family default 
280 donde
281 \family typewriter 
282  filename 
283 \family default 
284 es el nombre que tendrán los archivos de datos e índice, 
285 \family typewriter 
286 tipo
287 \family default 
288  es el tipo de organización - bloques parametrizados y registros constantes
289  en este caso-, 
290 \family typewriter 
291 tam_bloque
292 \family default 
293  es el tamaño del bloque, y 
294 \family typewriter 
295 tam_reg
296 \family default 
297  es el tamaño del registro.
298 \layout Standard
299
300 Para las diferentes organizaciones puede ser que alguno de estos 2 últimos
301  valores no tengan sentido almacenarlas y tomaran un valor por defecto igual
302  a cero.
303 \layout Standard
304
305 Según el tipo de organización, se inicializan los punteros a las funciones.
306  Para el ejemplo 
307 \family typewriter 
308 leer_bloque
309 \family default 
310  se igualará a 
311 \family typewriter 
312 emufs_tipo3_leer_bloque()
313 \family default 
314 , y lo mismo sucede con los demás.
315 \layout Subsection
316
317 EMUFS_Tipo
318 \layout Standard
319
320
321 \family typewriter 
322 EMUFS_Tipo
323 \family default 
324  es un tipo de dato enum, el cual será utilizado en la cabecera de todo
325  archivo de datos (
326 \series bold 
327 .dat
328 \series default 
329 ), para indicar los distintos tipos de organización física.
330  Su declaración puede verse en el archivo 
331 \series bold 
332 emufs.h.
333 \layout Standard
334
335 A saberse los valores y significado correspondiente que puede tomar este
336  tipo de dato son:
337 \layout Itemize
338
339
340 \series bold 
341 T1
342 \series default 
343  : Archivos con registros de longitud variable y bloques parametrizables.
344 \layout Itemize
345
346
347 \series bold 
348 T2
349 \series default 
350  : Archivos con registros de longitud variable sin bloques.
351 \layout Itemize
352
353
354 \series bold 
355 T3
356 \series default 
357  : Archivos con registros de longitud fija y bloques parametrizables.
358 \layout Subsection
359
360 EMUFS_Estadisticas
361 \layout Standard
362
363
364 \family typewriter 
365 EMUFS_Estadisticas
366 \family default 
367  es una estructura que almacenará los datos pertinentes a las estadísticas
368  de un archivo dado, y será utilizada para visualizar dichas observaciones
369  a través de la GUI.
370 \layout Standard
371
372 Su declaración puede ser observada en el archivo 
373 \series bold 
374 emufs.h 
375 \series default 
376 y la misma cuenta con los siguiente campos:
377 \layout Itemize
378
379
380 \family typewriter 
381 unsigned long
382 \family default 
383  
384 \family typewriter 
385 tam_archivo
386 \family default 
387 : indica el tamaño del archivo de datos (.dat) en bytes.
388 \layout Itemize
389
390
391 \family typewriter 
392 unsigned long
393 \family default 
394  
395 \family typewriter 
396 tam_archivos_aux
397 \family default 
398 : indica el tamaño de los archivos auxiliares sumados en bytes.
399 \layout Itemize
400
401
402 \family typewriter 
403 unsigned long
404 \family default 
405  
406 \family typewriter 
407 tam_info_control_dat
408 \family default 
409 : indica la cantidad de bytes en información de control utilizados para
410  el archivo.
411 \layout Itemize
412
413
414 \family typewriter 
415 unsigned long
416 \family default 
417  
418 \family typewriter 
419 media_fs
420 \family default 
421 : promedio de espacio libre en el archivo de datos (por bloque o gap promedio
422  segun la org)
423 \layout Itemize
424
425
426 \family typewriter 
427 unsigned long
428 \family default 
429  
430 \family typewriter 
431 total_fs
432 \family default 
433 : total de espacio libre en el archivo de datos.
434 \layout Itemize
435
436
437 \family typewriter 
438 unsigned long
439 \family default 
440  
441 \family typewriter 
442 max_fs
443 \family default 
444 : máximo espacio libre en el archivo de datos (en un bloque o máximo gap
445  segun la org).
446 \layout Itemize
447
448
449 \family typewriter 
450 unsigned long
451 \family default 
452  
453 \family typewriter 
454 min_fs
455 \family default 
456 : idem pero mínimo.
457 \layout Itemize
458
459
460 \family typewriter 
461 unsigned long
462 \family default 
463  
464 \family typewriter 
465 cant_bloques
466 \family default 
467 : cantidad de bloques en el archivo de datos (.
468 \series bold 
469 dat
470 \series default 
471 )
472 \layout Itemize
473
474
475 \family typewriter 
476 unsigned long
477 \family default 
478  
479 \family typewriter 
480 cant_registros
481 \family default 
482 : cantidad de registros en el archivo de datos (
483 \series bold 
484 .dat
485 \series default 
486 )
487 \layout Standard
488
489 En base a la estructura descripta anteriormente y mediante la utilización
490  de la función de lectura de estadísticas l
491 \family typewriter 
492 emufs_leer_estadisticas()
493 \family default 
494  disponible en la estructura común 
495 \family typewriter 
496 EMUFS
497 \family default 
498  handler de cualquier tipo de archivo, podremos obtener una serie de estadística
499 s que pasamos a detallar (más alla de los datos básicos como cant registros,
500  cant bloques, tam archivo, etc):
501 \layout Itemize
502
503 Relación entre espacio libre y el tamaño del archivo de datos (
504 \series bold 
505 .dat
506 \series default 
507 )
508 \layout Itemize
509
510 Relación entre el espacio ocupado por información de control y el tamaño
511  del archivo de datos (
512 \series bold 
513 .dat
514 \series default 
515 )
516 \layout Itemize
517
518 Cantidad promedio de espacio libre (en bloque o gap promedio)
519 \layout Itemize
520
521 Desviaciones extremas de espacio libre (máximo/mínimo espacio libre en bloque
522  o mayor/menor gap)
523 \layout Section
524
525
526 \begin_inset LatexCommand \label{sec:cabecera_gral}
527
528 \end_inset 
529
530 Organización física general de un archivo E
531 \begin_inset Formula $\mu$
532 \end_inset 
533
534 FS
535 \layout Standard
536
537 Todo archivo E
538 \begin_inset Formula $\mu$
539 \end_inset 
540
541 FS está compuesto por 4 archivos a nivel de sistema operativo: archivo de
542  datos (con 3 formatos posibles, ver páginas 
543 \begin_inset LatexCommand \pageref{cha:tipo1}
544
545 \end_inset 
546
547
548 \begin_inset LatexCommand \pageref{cha:tipo2}
549
550 \end_inset 
551
552  y 
553 \begin_inset LatexCommand \pageref{cha:tipo3}
554
555 \end_inset 
556
557 ), archivo de índice (ver página 
558 \begin_inset LatexCommand \pageref{sec:idx}
559
560 \end_inset 
561
562 ), archivo de control de espacio libre (ver página 
563 \begin_inset LatexCommand \pageref{sec:fsc}
564
565 \end_inset 
566
567 ) y archivo de índices recuperables (ver página 
568 \begin_inset LatexCommand \pageref{sec:did}
569
570 \end_inset 
571
572 ).
573 \layout Standard
574
575 El archivo de datos está compuesto por:
576 \layout Itemize
577
578 Una 
579 \emph on 
580 cabecera general
581 \emph default 
582  compuesta por un 
583 \family typewriter 
584 int
585 \family default 
586  (4 bytes en plataformas Linux de 32 bits) que representa el tipo de archivo.
587 \layout Itemize
588
589 Datos dependientes del tipo de archivo.
590 \layout Standard
591
592 La 
593 \emph on 
594 cabecera general
595 \emph default 
596  es utilizada para poder detectar el formato de un archivo al abrirlo.
597  Los datos dependientes del tipo de archivo serán explicados en sus secciones
598  correspondientes.
599 \layout LyX-Code
600
601 archivo
602 \layout LyX-Code
603
604 +-----------+--------------------------------------------//-+
605 \layout LyX-Code
606
607 |    tipo   | Datos dependientes del tipo de archivo ...
608  
609 \backslash 
610
611 \backslash 
612  |
613 \layout LyX-Code
614
615 +-----------+--------------------------------------------//-+
616 \layout LyX-Code
617
618 /- 4 bytes -/
619 \layout Section
620
621 Uso de la estructura EMUFS
622 \layout Standard
623
624 Como fue mencionado anteriormente en la descripción de la estructura EMUFS,
625  la misma proporciona al usuario una interfaz a través de la cual puede
626  realizar el manejo de archivos en forma genérica, abstrayéndose del tipo
627  de organización física en particular que dicho archivo posea.
628  Se la declara en 
629 \series bold 
630 emufs.h
631 \series default 
632  y las funciones que inicializan la estructura se encuentran en 
633 \series bold 
634 emufs.c
635 \layout Standard
636
637 Es decir que a traves de esta estructura, podemos manejar cualquier tipo
638  de archivo, mediante una misma interfaz en común.
639  La estructura 
640 \family typewriter 
641 EMUFS 
642 \family default 
643 posee además de ciertos datos que describen la organización física de un
644  archivo dado como por ejemplo 
645 \series bold 
646 \emph on 
647 tamaño de registro
648 \series default 
649 \emph default 
650
651 \series bold 
652 \emph on 
653 tamaño de bloque
654 \series default 
655 \emph default 
656  y 
657 \series bold 
658 \emph on 
659 nombre del archivo
660 \series default 
661 \emph default 
662 , una serie de punteros a funciones para el manejo del archivo del cual
663  es handler:
664 \layout Standard
665
666 Entre dichos funciones se encuentran: 
667 \family typewriter 
668 leer_registro()
669 \family default 
670
671 \family typewriter 
672 leer_bloque(), borrar_registro()
673 \family default 
674
675 \family typewriter 
676 agregar_registro()
677 \family default 
678
679 \family typewriter 
680 modificar_registro, leer_estadisticas()
681 \family default 
682
683 \family typewriter 
684 compactar().
685 \layout Standard
686
687 Para entender mejor el uso de esta estructura para el manejo de los archivos,
688  mostraremos un ejemplo concreto.
689  Supongamos que tenemos el siguiente código:
690 \layout LyX-Code
691
692 EMUFS *efs = emufs_crear(¨articulos.dat¨,T3,200,50);
693 \layout Standard
694
695 Esto hará que se cree el archivo de datos 
696 \series bold 
697 articulos.dat
698 \series default 
699 , con la organización física tipo 3 con registros de longitud fija de 50
700  bytes y bloques de 200 bytes (si el archivo ya existiaera, puede ser abierto
701  con la función 
702 \family typewriter 
703 emufs_abrir()
704 \family default 
705 , pasando como parámetro sólo el nombre de archivo, la función autodetecta
706  el tipo de archivo y sus datos adicionales).
707  Al mismo tiempo, los se asginarán valores a los punteros a funciones que
708  posee dicha estructura, la cual de ahora en más estará en condiciones de
709  manejar un archivo del tipo 3.
710  Gráficamente lo que sucede es:
711 \layout Standard
712
713
714 \begin_inset Float figure
715 placement H
716 wide false
717 collapsed false
718
719 \layout Caption
720
721 Inicialización de estructura EMUFS para un caso Archivo Tipo 3
722 \layout Standard
723 \align center 
724
725 \begin_inset Graphics
726         filename graphics/Emufsinit.png
727         scale 80
728
729 \end_inset 
730
731
732 \end_inset 
733
734
735 \layout Standard
736
737 Así pues, cuando se utilize la estructura para por ejemplo leer un registro,
738  sucedera lo siguiente:
739 \layout LyX-Code
740
741 efs->leer_registro(params) -- llama a -->  emufs_tipo3_leer_registro(params)
742 \layout Standard
743
744 Como se puede observar, la estructura 
745 \family typewriter 
746 EMUFS
747 \family default 
748  permitirá el manejo de cualquier tipo de archivo, a través del mismo código,
749  dandole gran flexibilidad a nuestro sistema, que podrá expandirse a más
750  tipos de archivos de ser necesario.
751 \layout Standard
752
753 Finalmente hay otra función estática que sirve para destruir la estructura,
754  liberando su memoria: 
755 \family typewriter 
756 emufs_destruir()
757 \layout Chapter
758
759 Archivos Auxiliares
760 \layout Standard
761
762 Acompañando al archivo de datos (
763 \series bold 
764 .dat
765 \series default 
766 ) el cual es responsable de la contención de los registros, tendremos tres
767  archivos auxiliares (
768 \series bold 
769 .idx
770 \series default 
771
772 \series bold 
773 .fsc
774 \series default 
775  y 
776 \series bold 
777 .did
778 \series default 
779 ) cuya funcionalidad y propósito pasamos a describir a continuación, sin
780  antes remarcar que los tres archivos poseen una sola implementación para
781  las distintas formas de organización física que hemos implementado (tres
782  para ser mas exactos).
783 \layout Standard
784
785 Entre las ventajas de poseer la misma implementación se encuentra el tener
786  un API común entre los tres tipos para el manejo de la localización de
787  sus registros, administración de espacio libre e Id's liberados, sin necesidad
788  de realizar n-implementaciones para un mismo objetivo final.
789 \layout Standard
790
791 Además, la obtención de ciertos datos estadísticos como espacio libre, o
792  cantidad de registros, se realiza a través de la misma interfaz, y también
793  se ha facilitado en cierto grado la re-organización física de un archivo
794  (pasar de un tipo a otro), dado el uso de estos tres archivos auxiliares
795  en común para funciones tan predominantes como índexación, administración
796  de espacio libre y recuperación de Id's.
797 \layout Section
798
799
800 \begin_inset LatexCommand \label{sec:idx}
801
802 \end_inset 
803
804 Archivo índice
805 \layout Standard
806
807 El archivo índice (.idx), permite la localización de los registros en el
808  .DAT de forma directa, mediante la obtención de su offset respecto del inicio
809  del .dat, o nro bloque (segun el tipo de organización física) en donde se
810  encuentra un registro dado, indicado por su 
811 \emph on 
812 id_reg.
813 \layout Standard
814
815 Los registros de este archivo se encuentran representados una estructura
816  que indica un número de registro y el bloque u offset en donde se encuentra
817  el mísmo.
818 \layout Standard
819
820 Es necesario que este archivo esté ordenado por 
821 \emph on 
822 id_reg
823 \emph default 
824 , ya que esto permitirá el acceso directo al mismo, para la rápida obtención
825  del nro de bloque u offset y posterior búsqueda de un registro en el archivo
826  de datos.
827 \layout Subsection
828
829 Organización física
830 \layout Standard
831
832 Los registros de este archivo se encuentran representados a nivel codigo
833  por el siguiente tipo de dato interno (
834 \family typewriter 
835 EMUFS_IDX
836 \family default 
837 ):
838 \layout LyX-Code
839
840 typedef struct emufs_idx_t { 
841 \layout LyX-Code
842
843   EMUFS_REG_ID id_reg;
844 \layout LyX-Code
845
846   EMUFS_OFFSET location;
847 \layout LyX-Code
848
849 } EMUFS_IDX;
850 \layout Standard
851
852
853 \begin_inset Float table
854 placement H
855 wide false
856 collapsed true
857
858 \layout Caption
859
860 Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
861  Tipo 1 y 3
862 \layout Standard
863
864
865 \begin_inset  Tabular
866 <lyxtabular version="3" rows="2" columns="3">
867 <features>
868 <column alignment="center" valignment="top" leftline="true" width="0">
869 <column alignment="center" valignment="top" leftline="true" width="0">
870 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
871 <row topline="true" bottomline="true">
872 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
873 \begin_inset Text
874
875 \layout Standard
876
877 id_reg
878 \end_inset 
879 </cell>
880 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
881 \begin_inset Text
882
883 \layout Standard
884
885 nro_bloque
886 \end_inset 
887 </cell>
888 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
889 \begin_inset Text
890
891 \layout Standard
892
893 \end_inset 
894 </cell>
895 </row>
896 <row topline="true" bottomline="true">
897 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
898 \begin_inset Text
899
900 \layout Standard
901
902 5
903 \end_inset 
904 </cell>
905 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
906 \begin_inset Text
907
908 \layout Standard
909
910 54
911 \end_inset 
912 </cell>
913 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
914 \begin_inset Text
915
916 \layout Standard
917
918 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
919 \end_inset 
920 </cell>
921 </row>
922 </lyxtabular>
923
924 \end_inset 
925
926
927 \end_inset 
928
929  
930 \begin_inset Float table
931 placement H
932 wide false
933 collapsed true
934
935 \layout Caption
936
937 Ejemplo de registro en archivo índice (.idx), para un archivo de organizacion
938  Tipo 2
939 \layout Standard
940
941
942 \begin_inset  Tabular
943 <lyxtabular version="3" rows="2" columns="3">
944 <features>
945 <column alignment="center" valignment="top" leftline="true" width="0">
946 <column alignment="center" valignment="top" leftline="true" width="0">
947 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
948 <row topline="true" bottomline="true">
949 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
950 \begin_inset Text
951
952 \layout Standard
953
954 id_reg
955 \end_inset 
956 </cell>
957 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
958 \begin_inset Text
959
960 \layout Standard
961
962 nro_bloque
963 \end_inset 
964 </cell>
965 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
966 \begin_inset Text
967
968 \layout Standard
969
970 \end_inset 
971 </cell>
972 </row>
973 <row topline="true" bottomline="true">
974 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
975 \begin_inset Text
976
977 \layout Standard
978
979 5
980 \end_inset 
981 </cell>
982 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
983 \begin_inset Text
984
985 \layout Standard
986
987 54
988 \end_inset 
989 </cell>
990 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
991 \begin_inset Text
992
993 \layout Standard
994
995 Indica que el registro de id_reg = 5, se encuentra en el bloque 54
996 \end_inset 
997 </cell>
998 </row>
999 </lyxtabular>
1000
1001 \end_inset 
1002
1003
1004 \end_inset 
1005
1006
1007 \layout Standard
1008
1009
1010 \series bold 
1011 \emph on 
1012 Nota: 
1013 \series default 
1014 \emph default 
1015 Como se puede observar, para distintas organizaciones el significado de
1016  los registros en este archivo es diferente y se utilizará de distinta manera
1017  en consecuencia.
1018 \layout Subsection
1019
1020 Comportamiento
1021 \layout Standard
1022
1023 Las declaraciones e implementación se pueden encontrar en 
1024 \series bold 
1025 \emph on 
1026 idx.h
1027 \series default 
1028 \emph default 
1029  y 
1030 \series bold 
1031 \emph on 
1032 idx.c
1033 \series default 
1034 \emph default 
1035  respectivamente:
1036 \layout List
1037 \labelwidthstring 00.00.0000
1038
1039
1040 \series bold 
1041 \emph on 
1042 Búsqueda:
1043 \series default 
1044 \emph default 
1045  Los registros del archivo indice (
1046 \series bold 
1047 .idx
1048 \series default 
1049 ), poseen una correspondencia 1 a 1, con los Id's de los registros en el
1050  archivo de datos (
1051 \series bold 
1052 .dat
1053 \series default 
1054 ).
1055  Con esto, queremos decir que el N-ésimo registro del archivo índice, será
1056  aquél que posea la información para localizar al registro cuyo 
1057 \family typewriter 
1058 id_reg
1059 \family default 
1060  es N, dentro del archivo de datos (
1061 \series bold 
1062 .dat
1063 \series default 
1064 ).
1065 \newline 
1066
1067 \series bold 
1068 NOTA:
1069 \series default 
1070  Cabe aclarar que por si bien el indice se encuentra ordenado por 
1071 \family typewriter 
1072 id_reg
1073 \family default 
1074 , los registros en el archivo de datos, por lo general no lo estarán.
1075  (ordenados por id).
1076  
1077 \newline 
1078 Ver: 
1079 \family typewriter 
1080 emufs_idx_buscar_registro()
1081 \layout List
1082 \labelwidthstring 00.00.0000
1083
1084
1085 \series bold 
1086 Alta:
1087 \series default 
1088  Ante la alta de un registro en el archivo de datos, se insetará un nuevo
1089  registro en el archivo índice, con el id_reg del registro en cuestion,
1090  y el offset u bloque donde se lo haya grabado en disco.
1091 \newline 
1092 Ver: 
1093 \family typewriter 
1094 emufs_idx_agregar()
1095 \layout List
1096 \labelwidthstring 00.00.0000
1097
1098
1099 \series bold 
1100 Baja:
1101 \series default 
1102  Ante el borrado de un registro del archivo de datos, se accederá el registro
1103  correspondiente en el índice, y se actualizara su LOCATION, estableciendolo
1104  en el valor especial 
1105 \family typewriter 
1106 EMUFS_NOT_FOUND
1107 \family default 
1108 , el cual indica que ese registro ha sido eliminado y por ende no se lo
1109  podrá localizar en el futuro.
1110  Como se verá mas adelante, según el tipo de organización física, el registro
1111  puede ser borrado concretamente del .
1112 \series bold 
1113 dat
1114 \series default 
1115  o nó.
1116  
1117 \newline 
1118 Ver: 
1119 \family typewriter 
1120 emufs_idx_borrar()
1121 \layout List
1122 \labelwidthstring 00.00.0000
1123
1124
1125 \series bold 
1126 Modificación:
1127 \series default 
1128  Ante la modificación en la posición física de un registro dentro del archivo
1129  de datos (por ejemplo luego del proceso de recompactación, se realizará
1130  la modificación respectiva del campo 
1131 \family typewriter 
1132 location
1133 \family default 
1134 .
1135 \newline 
1136 Ver: 
1137 \family typewriter 
1138 emufs_idx_actualizar()
1139 \layout Section
1140
1141
1142 \begin_inset LatexCommand \label{sec:fsc}
1143
1144 \end_inset 
1145
1146 Archivo de control de espacio libre
1147 \layout Standard
1148
1149 El archivo de espacio libre (
1150 \series bold 
1151 .fsc
1152 \series default 
1153 ) (espacio por bloque o gaps en archivo, según el tipo de organización física),
1154  tiene como función la administración del espacio libre, generado por previas
1155  eliminaciones de registros en el archivo de datos.
1156  El mismo, nos indicará donde hay lugar para insertar un nuevo registro.
1157 \layout Standard
1158
1159 Para el caso de una organización por bloque, nos dirá en que bloque o si
1160  se debe generar un nuevo bloque.
1161  En el caso de la organización sin bloques, nos indicará en que gap o si
1162  al final del archivo.
1163 \layout Standard
1164
1165 Los registros de este archivo se encuentran representados una estructura
1166  que indica un número de bloque u offset y el espacio libre disponible en
1167  el mismo (o apartir del mismo en el caso del offset).
1168 \layout Standard
1169
1170
1171 \series bold 
1172 Nota
1173 \series default 
1174 : Por requerimiento del algoritmo de compactación el tipo de organización
1175  física con reg long var, sin bloques, los gaps se graban en forma ordenada
1176  en el (.fsc).
1177  (El orden se corresponde con lo que hay en el .dat).
1178 \layout Subsection
1179
1180 Organización Física
1181 \layout Standard
1182
1183 Los registros de este archivo se encuentran representados a nivel codigo
1184  por el siguiente tipo de dato interno (
1185 \family typewriter 
1186 EMUFS_FSC
1187 \family default 
1188 ):
1189 \layout LyX-Code
1190
1191 typedef struct emufs_fsc_t { 
1192 \layout LyX-Code
1193
1194   EMUFS_BLOCK_ID marker;
1195 \layout LyX-Code
1196
1197   EMUFS_FREE freespace;
1198 \layout LyX-Code
1199
1200 } EMUFS_FSC;
1201 \layout Standard
1202
1203
1204 \series bold 
1205 \emph on 
1206
1207 \begin_inset Float table
1208 placement H
1209 wide false
1210 collapsed true
1211
1212 \layout Caption
1213
1214 Ejemplo de registro en archivo de control de espacio libre para un archivo
1215  con bloques
1216 \layout Standard
1217
1218
1219 \begin_inset  Tabular
1220 <lyxtabular version="3" rows="2" columns="3">
1221 <features>
1222 <column alignment="center" valignment="top" leftline="true" width="0">
1223 <column alignment="center" valignment="top" leftline="true" width="0">
1224 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1225 <row topline="true" bottomline="true">
1226 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1227 \begin_inset Text
1228
1229 \layout Standard
1230
1231 nro_bloque
1232 \end_inset 
1233 </cell>
1234 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1235 \begin_inset Text
1236
1237 \layout Standard
1238
1239 freespace
1240 \end_inset 
1241 </cell>
1242 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1243 \begin_inset Text
1244
1245 \layout Standard
1246
1247 \end_inset 
1248 </cell>
1249 </row>
1250 <row topline="true" bottomline="true">
1251 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1252 \begin_inset Text
1253
1254 \layout Standard
1255
1256 12
1257 \end_inset 
1258 </cell>
1259 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1260 \begin_inset Text
1261
1262 \layout Standard
1263
1264 120
1265 \end_inset 
1266 </cell>
1267 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1268 \begin_inset Text
1269
1270 \layout Standard
1271
1272 Indica que en el bloque 12, hay 120 bytes libres al final del mismo.
1273 \end_inset 
1274 </cell>
1275 </row>
1276 </lyxtabular>
1277
1278 \end_inset 
1279
1280
1281 \end_inset 
1282
1283  
1284 \begin_inset Float table
1285 placement H
1286 wide false
1287 collapsed true
1288
1289 \layout Caption
1290
1291 Ejemplo de registro en archivo de 
1292 \emph on 
1293 gaps
1294 \emph default 
1295  para un archivo sin bloques
1296 \layout Standard
1297
1298
1299 \begin_inset  Tabular
1300 <lyxtabular version="3" rows="2" columns="3">
1301 <features>
1302 <column alignment="center" valignment="top" leftline="true" width="0">
1303 <column alignment="center" valignment="top" leftline="true" width="0">
1304 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
1305 <row topline="true" bottomline="true">
1306 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1307 \begin_inset Text
1308
1309 \layout Standard
1310
1311 offset
1312 \end_inset 
1313 </cell>
1314 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1315 \begin_inset Text
1316
1317 \layout Standard
1318
1319 freespace
1320 \end_inset 
1321 </cell>
1322 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1323 \begin_inset Text
1324
1325 \layout Standard
1326
1327 \end_inset 
1328 </cell>
1329 </row>
1330 <row topline="true" bottomline="true">
1331 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1332 \begin_inset Text
1333
1334 \layout Standard
1335
1336 12
1337 \end_inset 
1338 </cell>
1339 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
1340 \begin_inset Text
1341
1342 \layout Standard
1343
1344 120
1345 \end_inset 
1346 </cell>
1347 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
1348 \begin_inset Text
1349
1350 \layout Standard
1351
1352 Indica que a partir del byte 12 del archivo de datos, hay 120 bytes libres.
1353 \end_inset 
1354 </cell>
1355 </row>
1356 </lyxtabular>
1357
1358 \end_inset 
1359
1360
1361 \end_inset 
1362
1363
1364 \layout Standard
1365
1366
1367 \series bold 
1368 \emph on 
1369 Nota: 
1370 \series default 
1371 \emph default 
1372 Como se puede observar, para distintas organizaciones el significado de
1373  los registros en este archivo es diferente y se utilizará de distinta manera
1374  en consecuencia.
1375 \layout Subsection
1376
1377 Funciones principales
1378 \layout Standard
1379
1380 Las declaraciones e implementación se pueden encontrar en 
1381 \series bold 
1382 \emph on 
1383 fsc.h
1384 \series default 
1385 \emph default 
1386  y 
1387 \series bold 
1388 \emph on 
1389 fsc.c
1390 \series default 
1391 \emph default 
1392  respectivamente:
1393 \layout List
1394 \labelwidthstring 00.00.0000
1395
1396
1397 \series bold 
1398 Búsqueda:
1399 \series default 
1400  Ante la operación de alta de un registro en el archivo de datos, se realizará
1401  la búsqueda de espacio libre donde este podrá ser insertado.
1402  En el caso de organizaciones con bloques, se buscará en que 
1403 \family typewriter 
1404 nro_bloque
1405 \family default 
1406  se posee espacio suficiente para albergar el nuevo registro.
1407  En el caso de organizacion sin bloque, se buscará un gap o espacio libre
1408  en el archivo, obteniéndose en consecuencia, el 
1409 \family typewriter 
1410 offset
1411 \family default 
1412  hasta el mismo.
1413 \newline 
1414 Ver: 
1415 \family typewriter 
1416 emufs_fsc_buscar_lugar()
1417 \layout List
1418 \labelwidthstring 00.00.0000
1419
1420
1421 \series bold 
1422 Alta/Mod:
1423 \series default 
1424  Luego de una operación de baja o alta de un registro en el archivo de datos
1425  (
1426 \series bold 
1427 .dat
1428 \series default 
1429 ), incrementará o decrementará respectivamente el espacio libre en el archivo
1430  de datos, y esto deberá ser registrado, agregando un nuevo registro en
1431  el archivo de espacios libres (
1432 \series bold 
1433 .fsc
1434 \series default 
1435 ) o bien modificandoló.
1436 \newline 
1437
1438 \newline 
1439 En el caso de organizaciónes con bloques, se actualizará el valor del espacio
1440  libre 
1441 \family typewriter 
1442 freespace
1443 \family default 
1444  en el bloque (ya sea incrementandoló o decrementandoló) o bien se insertará
1445  un nuevo registro en caso de que se esté creando un nuevo bloque en el
1446  archivo de datos (en este caso no será debido a un alta o baja de registro
1447  como se mencionó al principio).
1448 \newline 
1449
1450 \newline 
1451 Para el caso de organización sin bloques, en el caso de baja de un registro
1452  de datos (
1453 \series bold 
1454 .dat
1455 \series default 
1456 ) se insertará un nuevo registro en el 
1457 \series bold 
1458 .fsc
1459 \series default 
1460  dando cuenta de la aparición de un nuevo gap en el archivo de datos (
1461 \series bold 
1462 .dat
1463 \series default 
1464 ), y en caso de estar este lindante con otro gap, se realizará el merge
1465  pertinente.
1466  (esto esta explicado más en profundidad en los casos particulares de organizaci
1467 ón fisica, registros variables sin bloques).
1468  Para el caso de una alta en el archivo de datos (
1469 \series bold 
1470 .dat
1471 \series default 
1472 ), el valor del gap donde se haya insertado se actualizará.
1473  
1474 \newline 
1475 Ver: 
1476 \family typewriter 
1477 emufs_fsc_agregar(), emufs_fsc_agregar_gap(), emufs_fsc_actualizar(), emufs_fsc_
1478 actualizar_gap().
1479 \layout List
1480 \labelwidthstring 00.00.0000
1481
1482
1483 \series bold 
1484 Baja
1485 \series default 
1486 : Unicamente para el caso de una organización que presente gaps en el archivo,
1487  se podrá dar a lugar la eliminación de un registro del archivo de espacios
1488  libres (
1489 \series bold 
1490 .fsc)
1491 \series default 
1492 .
1493  Esta situación tendrá efecto cuando se inserte un registro que entre perfecto
1494  en un gap disponible, y por ende el gap desaparecerá.
1495 \newline 
1496 Ver: 
1497 \family typewriter 
1498 emufs_fsc_borrar_gap()
1499 \layout Section
1500
1501
1502 \begin_inset LatexCommand \label{sec:did}
1503
1504 \end_inset 
1505
1506 Archivo de id's recuperables
1507 \layout Standard
1508
1509 El archivo de Id's liberado (
1510 \series bold 
1511 .did
1512 \series default 
1513 ) llevará cuenta de aquellos Id's de registros (
1514 \family typewriter 
1515 id_reg
1516 \family default 
1517 ) que ya no se encuentran siendo utilizados y fueron liberados por registros
1518  eliminados previamente.
1519  A través del mismo, se podrá realizar la reutilización de Id's ante la
1520  alta de nuevos registros.
1521 \layout Standard
1522
1523 A nivel físico, este archivo poseerá una secuencia de datos del tipo EMUFS_REG_I
1524 D, y el comportamiento del sistema de recuperación de Id's será el de una
1525  pila.
1526  Es decir, ante el requerimiento de un 
1527 \family typewriter 
1528 reg_id
1529 \family default 
1530  libre por una función del sistema como por ejemplo la alta de un nuevo
1531  registro, el API del archivo (
1532 \series bold 
1533 .did
1534 \series default 
1535 ), obtendrá el último dato del mismo (el 
1536 \emph on 
1537 Id
1538 \emph default 
1539  que fue liberado mas recientemente), y truncará el archivo eliminando el
1540  
1541 \emph on 
1542 Id
1543 \emph default 
1544  recuperado de la tabla.
1545  (LIFO, Last in First Out).
1546 \layout Subsection
1547
1548 Organización Física
1549 \layout Standard
1550
1551 Este archivo tiene registros de un solo campo, 
1552 \family typewriter 
1553 EMUFS_REG_ID
1554 \family default 
1555  el cual simboliza al id que fue liberado en un proceso de baja de registros.
1556 \layout Subsection
1557
1558 Funciones principales
1559 \layout Standard
1560
1561 Las declaraciones e implementación se pueden encontrar en 
1562 \series bold 
1563 \emph on 
1564 did.h
1565 \series default 
1566 \emph default 
1567  y 
1568 \series bold 
1569 \emph on 
1570 did.c
1571 \series default 
1572 \emph default 
1573  respectivamente
1574 \layout List
1575 \labelwidthstring 00.00.0000
1576
1577
1578 \series bold 
1579 Alta: 
1580 \series default 
1581 Ante la eliminación de un registro del archivo de datos (
1582 \series bold 
1583 .dat
1584 \series default 
1585 ) se procederá al agregado del correspondiente 
1586 \family typewriter 
1587 id_reg
1588 \family default 
1589  que fue liberado por dicha operación, al archivo 
1590 \series bold 
1591 .did
1592 \series default 
1593 .
1594 \family typewriter 
1595
1596 \newline 
1597
1598 \family default 
1599 Ver: 
1600 \family typewriter 
1601 emufs_did_agregar()
1602 \layout List
1603 \labelwidthstring 00.00.0000
1604
1605
1606 \series bold 
1607 Baja
1608 \series default 
1609  Cuando el sistema desee grabar un nuevo registro en el archivo de datos,
1610  este pedirá un 
1611 \family typewriter 
1612 id_reg
1613 \family default 
1614  disponible para el mismo.
1615  El sistema de administración de Id's libres, obtendrá el último 
1616 \emph on 
1617 id
1618 \emph default 
1619  que se guardó en el archivo (o se eliminó del archivo de datos), y truncará
1620  el archivo eliminandolo.
1621 \family typewriter 
1622
1623 \newline 
1624
1625 \family default 
1626 Ver: 
1627 \family typewriter 
1628 emufs_did_get_last()
1629 \layout Chapter
1630
1631
1632 \begin_inset LatexCommand \label{cha:tipo1}
1633
1634 \end_inset 
1635
1636 Archivo con bloques parametrizados y registros de longitud variable
1637 \layout Standard
1638
1639 Este tipo de archivo tiene varias complicaciones, al tratarse de un punto
1640  intermedio entre el 
1641 \begin_inset LatexCommand \ref{cha:tipo2}
1642
1643 \end_inset 
1644
1645  y el 
1646 \begin_inset LatexCommand \ref{cha:tipo3}
1647
1648 \end_inset 
1649
1650  (cuenta tanto con bloques como con registros variables), hereda los inconvenien
1651 tes (y ventajas) de ambos, más los propios.
1652  Al implementar este tipo de archivo se puso enfásis en la eficiencia mientras
1653  esta no comprometa la mantenibilidad del código, es por esto que en algunas
1654  circunstancias no se hace un uso óptimo del espacio.
1655 \layout Standard
1656
1657 La implementación de este tipo de archivo puede ser encontrada en 
1658 \family typewriter 
1659 emufs/tipo1.c
1660 \family default 
1661  mientras que su interfaz pública está disponible en 
1662 \family typewriter 
1663 emufs/tipo1.h
1664 \family default 
1665 .
1666 \layout Section
1667
1668 Organización física
1669 \layout Standard
1670
1671 El archivo está compuesto por la 
1672 \emph on 
1673 cabecera general
1674 \emph default 
1675  (ver página 
1676 \begin_inset LatexCommand \pageref{sec:cabecera_gral}
1677
1678 \end_inset 
1679
1680 ).
1681  El valor que toma en este tipo de archivo es 0 (o el valor simbólico 
1682 \family typewriter 
1683 T1
1684 \family default 
1685  del tipo 
1686 \family typewriter 
1687 EMUFS_Tipo
1688 \family default 
1689 ).
1690  Luego le sigue una cabecera propia del archivo (un 
1691 \family typewriter 
1692 EMUFS_BLOCK_SIZE
1693 \family default 
1694 , 4 bytes) que almacena el tamaño del bloque que usa el archivo.
1695  De esta menera, al abrir un archivo de este tipo no se necesita tener ninguna
1696  información sobre él.
1697  A esta cabecera le siguen cero o más bloques del tamaño fijo especificado
1698  en la cabecera antes mencionada.
1699 \layout LyX-Code
1700
1701 archivo
1702 \layout LyX-Code
1703
1704 +-----------+-----------+------------------------//-+
1705 \layout LyX-Code
1706
1707 |    tipo   | tam bloque| Cero o más bloques ...
1708  
1709 \backslash 
1710
1711 \backslash 
1712  |
1713 \layout LyX-Code
1714
1715 +-----------+-----------+------------------------//-+
1716 \layout LyX-Code
1717
1718 /- 4 bytes -/- 4 bytes -/
1719 \layout Subsection
1720
1721 Organización física de un bloque
1722 \layout Standard
1723
1724 Cada bloque no guarda información en sí, sólo se comporta como un contenedor
1725  de registros.
1726  Esto no significa que un bloque no tenga utilidad, el bloque es utilizado
1727  para proveer un acceso semi-aleatorio a los registros.
1728  Para esto se utiliza el archivo de índice (ver página 
1729 \begin_inset LatexCommand \ref{sec:idx}
1730
1731 \end_inset 
1732
1733 ), que almacena pares [identificador de registro, número de bloque].
1734  Para que sea suficiente este único índice para hallar un registro (siendo
1735  que puede haber más de un registro por bloque), es necesario 
1736 \emph on 
1737 alinear los registros a izquierda
1738 \emph default 
1739 .
1740  Esto significa que hay que asegurar que siempre los registros en un bloque
1741  se presenten de forma consecutiva, jamás permitiendo que haya un espacio
1742  libre entre registros (en un mismo bloque).
1743 \layout Standard
1744
1745 Podemos ver un ejemplo de esto en forma gráfica:
1746 \layout LyX-Code
1747
1748 bloque N-1 | bloque N                                | bloque N+1
1749 \layout LyX-Code
1750
1751 /----------+------------+------------+---------------+-----------/
1752 \layout LyX-Code
1753
1754
1755 \backslash 
1756           | registro 1 | registro 2 | espacio libre |           
1757 \backslash 
1758
1759 \layout LyX-Code
1760
1761 /----------+------------+------------+---------------+-----------/
1762 \layout LyX-Code
1763
1764            /------------- tamaño del bloque ---------/
1765 \layout Standard
1766
1767 De esta forma, una vez obtenido el número de bloque, se pueda recorrer secuencia
1768 lmente hasta encontrar el registro deseado.
1769  A fin de llevar el conteo de espacio libre se utiliza el archivo de control
1770  de espacio libre (ver página 
1771 \begin_inset LatexCommand \ref{sec:fsc}
1772
1773 \end_inset 
1774
1775 ), de forma tal que no sea necesario recorrer secuencialmente en busca de
1776  espacio libre al hacer una inserción.
1777 \layout Standard
1778
1779 Puede darse un caso excepcional en el que un registro sea más grande que
1780  un bloque, en este caso el registro se almacenará en N bloques consecutivos
1781  (siendo N la cantidad de bloques que necesita el registro), ocupando completos
1782  los todos los bloques a excepción del último, en el que posteriormente
1783  se pueden agregar más registros.
1784 \layout Subsubsection
1785
1786
1787 \begin_inset LatexCommand \label{sub:tipo1_reg}
1788
1789 \end_inset 
1790
1791 Organización física de un registro.
1792 \layout Standard
1793
1794 El registro es el que representa al dato realmente que se quiere almacenar.
1795  Para representar ese dato se necesita una determinada información de control,
1796  tanto para poder identificar el registro en un bloque (en búsquedas secuenciale
1797 s dentro del bloque) como para saber su longitud (dado que este tipo de
1798  archivo utiliza registros de tamaño variable).
1799 \layout Standard
1800
1801 Siguiendo la metodología general de E
1802 \begin_inset Formula $\mu$
1803 \end_inset 
1804
1805 FS, se optó por incluir esta información de control como una cabecera al
1806  comienzo del registro, siguiendo a esta los datos en sí.
1807  La cabecera está compuesta por un identificador (
1808 \family typewriter 
1809 id
1810 \family default 
1811 ) de registro (EMUFS_REG_ID, 4 bytes) seguido por el tamaño (
1812 \family typewriter 
1813 tamaño
1814 \family default 
1815 ) del registros (EMUFS_REG_SIZE, 4 bytes).
1816  Podemos ver gráficamente como se se compone un registro:
1817 \layout LyX-Code
1818
1819 registro id
1820 \layout LyX-Code
1821
1822 +-----------+-----------+------------------+
1823 \layout LyX-Code
1824
1825 |     id    |   tamaño  |   datos ...
1826       |
1827 \layout LyX-Code
1828
1829 +-----------+-----------+------------------+
1830 \layout LyX-Code
1831
1832 /- 4 bytes -/- 4 bytes -/- [tamaño] bytes -/
1833 \layout Subsubsection
1834
1835
1836 \begin_inset LatexCommand \label{sub:tipo1_reg_multi}
1837
1838 \end_inset 
1839
1840 Organización física de un registro más grande que un bloque (registro 
1841 \emph on 
1842 multibloque
1843 \emph default 
1844 ).
1845 \layout Standard
1846
1847 Puede darse el caso excepcional en que un registro sea de mayor longitud
1848  que un bloque.
1849  Al ser una situación excepcional, no siempre se resuelve de la forma más
1850  eficiente ni se mínimiza el espacio ocupado por datos de control (como
1851  se dijo anteriormente, se prefirió conservar la simpleza del código, adoptando
1852  algoritmos generales aunque no sea de la forma más eficiente o maximizando
1853  el uso del espacio para no perjudicar la mantenibilidad).
1854 \layout Standard
1855
1856 Para menejar un registro 
1857 \emph on 
1858 multibloque 
1859 \emph default 
1860 se optó por limitarlo a la siguiente estructura (suponiendo que el registro
1861  ocupa N bloques, con N > 1 y que un 
1862 \emph on 
1863 fragmento
1864 \emph default 
1865  es una porción del registro que entra en un bloque):
1866 \layout Itemize
1867
1868 Los primeros N-1 
1869 \emph on 
1870 fragmentos
1871 \emph default 
1872  se almacenan en bloques completos consecutivos.
1873 \layout Itemize
1874
1875 El último fragmento se almacena al comienzo del bloque inmediatamente posterior
1876  al penúltimo.
1877 \layout Itemize
1878
1879 Cada framento posee las cabeceras mencionadas en la sección 
1880 \begin_inset LatexCommand \ref{sub:tipo1_reg}
1881
1882 \end_inset 
1883
1884 , cuyo contenido es el siguiente:
1885 \begin_deeper 
1886 \layout Itemize
1887
1888 En 
1889 \family typewriter 
1890 id
1891 \family default 
1892  se almacena el identificador único obtenido al hacer el alta.
1893 \layout Itemize
1894
1895 En 
1896 \family typewriter 
1897 tamaño
1898 \family default 
1899  se almacena el tamaño del 
1900 \emph on 
1901 fragmento
1902 \emph default 
1903  actual más los tamaños de los 
1904 \emph on 
1905 fragmentos
1906 \emph default 
1907  posteriores, quedando en el primer 
1908 \emph on 
1909 fragmento
1910 \emph default 
1911  el tamaño completo del registro y en el último sólo el tamaño del 
1912 \emph on 
1913 fragmento
1914 \emph default 
1915  final.
1916 \end_deeper 
1917 \layout Standard
1918
1919 Como puede observarse, la información de control en los 
1920 \emph on 
1921 fragmentos
1922 \emph default 
1923  intermedios puede ser redundante, pero se conserva para poder realizar
1924  algoritmos genéricos (que se basan en que al principio de un bloque, si
1925  no está vacío, hay una cabecera de un registro) y para facilitar chequeos
1926  de integridad del archivo.
1927 \layout Standard
1928
1929 A continuación se presenta un ejemplo gráfico de un registro multibloque
1930  de 10 bytes (de contenido 
1931 \begin_inset Quotes eld
1932 \end_inset 
1933
1934 1234567890
1935 \begin_inset Quotes erd
1936 \end_inset 
1937
1938 ) almacenado en un archivo con bloques de 4 bytes:
1939 \layout LyX-Code
1940
1941 | bloque 0          | bloque 1          | bloque 2
1942 \layout LyX-Code
1943
1944 +-------------------+-------------------+-------------------+-//-+
1945 \layout LyX-Code
1946
1947 | registro 0 - 1/3  | registro 0 - 2/3  | registro 0 - 3/3..| 
1948 \backslash 
1949
1950 \backslash 
1951  |
1952 \layout LyX-Code
1953
1954 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
1955 \layout LyX-Code
1956
1957 || id | tam | datos||| id | tam | datos||| id | tam |dato|..| 
1958 \backslash 
1959
1960 \backslash 
1961  |
1962 \layout LyX-Code
1963
1964 ||----+-----+------+||----+-----+------+||----+-----+----+..| // |
1965 \layout LyX-Code
1966
1967 ||  0 |  10 | 1234 |||  0 |  6  | 5678 |||  0 |  2  | 90 |..| 
1968 \backslash 
1969
1970 \backslash 
1971  |
1972 \layout LyX-Code
1973
1974 |+----+-----+------+|+----+-----+------+|+----+-----+----+..| // |
1975 \layout LyX-Code
1976
1977 +-------------------+-------------------+-------------------+-
1978 \backslash 
1979
1980 \backslash 
1981 -+
1982 \layout Section
1983
1984 Funciones principales
1985 \layout Standard
1986
1987 Las funciones principales son las necesarias para completar la estructura
1988  EMUFS (ver página 
1989 \begin_inset LatexCommand \pageref{sub:EMUFS}
1990
1991 \end_inset 
1992
1993 ).
1994 \layout Subsection
1995
1996 Lectura de registros
1997 \layout Standard
1998
1999 Para leer un registro se hace uso del archivo de índice (ver página 
2000 \begin_inset LatexCommand \pageref{sec:idx}
2001
2002 \end_inset 
2003
2004 ), obteniéndose el número de bloque en donde está almacenado el registro
2005  a buscar.
2006  Una vez obtenido, se carga en memoria el bloque entero y se busca secuencialmen
2007 te en él (leyendo la cabecera de cada registro y salteando los datos) hasta
2008  encontrar el registro pedido.
2009  Una vez encontrado se lo copia y devuelve.
2010 \layout Standard
2011
2012 Si se tratara de un registro 
2013 \emph on 
2014 multibloque
2015 \emph default 
2016  (ver sección 
2017 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2018
2019 \end_inset 
2020
2021 ), se procede forma similar, sólo que se cargan en memoria uno a uno los
2022  bloques que componen el registro y se van copiando (y uniendo) los 
2023 \emph on 
2024 fragmentos
2025 \emph default 
2026  hasta completarlo.
2027 \layout Standard
2028
2029 Ver: 
2030 \family typewriter 
2031 emufs_tipo1_leer_registro()
2032 \layout Subsection
2033
2034 Altas de registros
2035 \layout Standard
2036
2037 Para realizar el alta de un registro, lo primero que se obtiene es un identifica
2038 dor, buscando primero en el archivo de identificadores recuperables (pág.
2039  
2040 \begin_inset LatexCommand \ref{sec:did}
2041
2042 \end_inset 
2043
2044 ) y de no haber ninguno, buscando el mayor identificador presente en el
2045  archivo de índice (pág.
2046  
2047 \begin_inset LatexCommand \ref{sec:idx}
2048
2049 \end_inset 
2050
2051 ) y sumándole uno.
2052  El paso siguiente es buscar un bloque con espacio libre suficiente como
2053  para almacenar el registro (y su cabecera) en el archivo de control de
2054  espacio libre (pág.
2055  
2056 \begin_inset LatexCommand \ref{sec:fsc}
2057
2058 \end_inset 
2059
2060 ) y cargarlo completo en memoria.
2061  De no encontrarse, se crea un bloque nuevo al final de archivo.
2062  En el bloque cargado en memoria, se agrega el registro nuevo (con su cabecera)
2063  al comienzo del espacio libre (calculado a partir del tamaño del bloque
2064  y el espacio libre en bloque) y se lo graba en disco.
2065  Finalmente se agrega (o actualiza) el identificador al archivo índice y
2066  el espacio libre en el bloque.
2067 \layout Standard
2068
2069 Si el registro ocupara más de un bloque (ver sección 
2070 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2071
2072 \end_inset 
2073
2074 ), se buscan N bloques consecutivos (todos los que necesite el registro)
2075  absolutamente libres
2076 \begin_inset Foot
2077 collapsed true
2078
2079 \layout Standard
2080
2081 Incluso el último bloque debe estar absolutamente libre para cumplir con
2082  las condiciones presentadas en la sección 
2083 \begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
2084
2085 \end_inset 
2086
2087 .
2088 \end_inset 
2089
2090  y graba bloque a bloque cada 
2091 \emph on 
2092 fragmento
2093 \emph default 
2094  del registro (con sus cabeceras intermedias), al último 
2095 \emph on 
2096 fragmento
2097 \emph default 
2098  se lo trata de forma análoga a un registro 
2099 \emph on 
2100 simple
2101 \emph default 
2102 .
2103  Por cada bloque utilizado se actualiza el archivo de control de espacio
2104  libre.
2105 \layout Standard
2106
2107 Ver: 
2108 \family typewriter 
2109 emufs_tipo1_agregar_registro()
2110 \layout Subsection
2111
2112 Bajas de registros
2113 \layout Standard
2114
2115 Al eliminar un registro lo primero que se hace es actualizar los archivos
2116  de índice y de indentificadores recuperables, poniendo como número de bloque
2117  el valor especial 
2118 \family typewriter 
2119 EMUFS_NOT_FOUND
2120 \family default 
2121  y agregando el identificador del registro a borrar respectivamente.
2122  También se actualiza el archivo de control de espacio libre por cada bloque
2123  (en caso de ser más de uno, en registros 
2124 \emph on 
2125 multibloque
2126 \emph default 
2127 , se actualizan todos los bloques) y se carga el bloque en memoria para
2128  
2129 \emph on 
2130 alinear los datos a izquierda
2131 \emph default 
2132  (en caso de ser un registro 
2133 \emph on 
2134 multibloque
2135 \emph default 
2136 , esto se realiza sólo para el último bloque).
2137  Para alinear los datos, se recorre secuencialmente en bloque (leyendo la
2138  cabecera de cada registro y salteando los datos) hasta encontrar el registro
2139  a borrar.
2140  Encontrado el registro, se copian todos los bytes que se encuentran entre
2141  el fin del registro a borrar y el fin del bloque, en el comienzo del bloque
2142  borrado.
2143 \layout Standard
2144
2145 Ver: 
2146 \family typewriter 
2147 emufs_tipo1_borrar_registro()
2148 \layout Subsection
2149
2150 Modificación de registros
2151 \layout Standard
2152
2153 Se optó por un algoritmo simple y general, que usa las funciones de alto
2154  nivel mencionadas hasta ahora.
2155  Simplemento borra el registro y vuelve a crearlo.
2156  Al recuperar el último identificador de registro borrado, nos aseguramos
2157  de que se mantenga el identificador del registro.
2158 \layout Standard
2159
2160 Ver: 
2161 \family typewriter 
2162 emufs_tipo1_modificar_registro()
2163 \layout Subsection
2164
2165 Obtención de estadísticas
2166 \layout Standard
2167
2168 Es una función bastante simple, con una única complicación que mencionaremos
2169  más adelante.
2170 \layout Standard
2171
2172 Para obtener las máximas desviaciones, cantidad total de espacio libre,
2173  cantidad de registros y tamaño de los archivos auxiliares se utilizan las
2174  funciones apropiadas de los archivos auxiliares (ver secciones 
2175 \begin_inset LatexCommand \ref{sec:idx}
2176
2177 \end_inset 
2178
2179
2180 \begin_inset LatexCommand \ref{sec:fsc}
2181
2182 \end_inset 
2183
2184  y 
2185 \begin_inset LatexCommand \ref{sec:did}
2186
2187 \end_inset 
2188
2189 ).
2190 \layout Standard
2191
2192 Para obtener la cantidad de bloques se hace el siguiente calculo:
2193 \layout LyX-Code
2194
2195 cant_bloques = (tamaño_archivo_datos - tamaño_cabecera_archivo_datos)
2196 \layout LyX-Code
2197
2198                / tamaño_bloque;
2199 \layout Standard
2200
2201 Hasta aquí no hay mayores inconvenientes.
2202  El problema se presenta para calcular el tamaño de la información de control
2203  utilizada por el archivo de datos; se utiliza el siguiente cálculo:
2204 \layout LyX-Code
2205
2206 tam_info_control_datos = tamaño_cabecera_archivo_datos
2207 \layout LyX-Code
2208
2209                          + cant_registros * tamaño_cabecera_registro;
2210 \layout Standard
2211
2212 Aunque a simple vista esto parece acertado, no contempla el caso de los
2213  registros 
2214 \emph on 
2215 multibloque
2216 \emph default 
2217  (pág 
2218 \begin_inset LatexCommand \pageref{sub:tipo1_reg_multi}
2219
2220 \end_inset 
2221
2222 ), estos registros almacenan 
2223 \family typewriter 
2224 tamaño_cabecera_registro * N
2225 \family default 
2226 , donde 
2227 \family typewriter 
2228 N
2229 \family default 
2230  es la cantidad de bloques que ocupan.
2231  Salvar este caso sería muy costoso, porque habría que recorrer el archivo
2232  registro a registro, 
2233 \emph on 
2234 fragmento
2235 \emph default 
2236  a 
2237 \emph on 
2238 fragmento
2239 \emph default 
2240  e ir contando todas las cabeceras de registro que aparecen (similar a lo
2241  que se hace en la compactación, ver sección 
2242 \begin_inset LatexCommand \ref{sub:tipo1_compact}
2243
2244 \end_inset 
2245
2246 ).
2247  Al tratarse este de un caso excepcional, se optó por mantener la función
2248  simple ya que funciona bien en la mayoría de los casos.
2249 \layout Standard
2250
2251 Ver: 
2252 \family typewriter 
2253 emufs_tipo1_leer_estadisticas()
2254 \layout Subsection
2255
2256
2257 \begin_inset LatexCommand \label{sub:tipo1_compact}
2258
2259 \end_inset 
2260
2261 Compactación del archivo de datos
2262 \layout Standard
2263
2264 Esta función es una de las más simples, porque se limita a un algoritmo
2265  muy simple que utiliza las funciones de 
2266 \emph on 
2267 alto nivel
2268 \emph default 
2269  antes nombradas para realizar su tarea.
2270  Básicamente recorre el archivo de índices de registros, de comienzo a fin,
2271  leyendo el registro, borrándolo y volviéndolo a insertar.
2272  Si había espacio libre en un bloque anterior al que estaba, será insertado
2273  en él, si no volverá a grabarse en el lugar en que estaba.
2274  De esta forma se aprovechan todos los espacios libres intermedios, concluyendo
2275  con un archivo igual o más pequeño que el original.
2276 \layout Standard
2277
2278 Esta implementación no es la más eficiente, pero siendo que esta es una
2279  operación costosa y excepcional por naturaleza, se optó por mantener el
2280  algoritmo simple a costo de un poco de eficiencia.
2281 \layout Standard
2282
2283 Ver:
2284 \family typewriter 
2285  emufs_tipo1_compactar()
2286 \layout Chapter
2287
2288
2289 \begin_inset LatexCommand \label{cha:tipo2}
2290
2291 \end_inset 
2292
2293 Archivo sin bloques y registros de longitud variable
2294 \layout Standard
2295
2296 Este tipo de archivo nos traerá a la mesa la particularidad de grabar registros
2297  de longitud variable sin realizar su agrupación en bloques, y como veremos
2298  en la siguiente sección, tambien permitirá la administración de gaps que
2299  queden en el archivo luego de operaciones de baja de registros.
2300 \layout Section
2301
2302 Organización física
2303 \layout Standard
2304
2305 Este tipo de archivo realizará el almacenamiento de registros de longitud
2306  variable en disco, su borrado y modificación sin la utilización de bloques
2307  de ningún tipo.
2308  Su implementación se encuentra en los archivos fuente (
2309 \series bold 
2310 tipo2.c
2311 \series default 
2312  y 
2313 \series bold 
2314 tipo2.h
2315 \series default 
2316 ).
2317 \layout Standard
2318
2319 Los archivos del tipo 2, presentarán al comienzo del mismo un header compuesto
2320  simplemente por un dato del tipo EMUFS_Tipo (int) el cual indicará el tipo
2321  de archivo en cuestión.
2322 \layout Standard
2323
2324 Para poder entender mejor la organización fisica de este tipo de archivo,
2325  tomemos el caso hipotético en el que se encuentran grabados 
2326 \series bold 
2327 dos registros
2328 \series default 
2329  (comenzando desde registro 0) de 
2330 \series bold 
2331 30 bytes
2332 \series default 
2333 , y 
2334 \series bold 
2335 25 bytes
2336 \series default 
2337 , respectivamente.
2338  Supongamos también que entre el registro 0 y 1 se encontraba un 
2339 \series bold 
2340 registro de 10 bytes
2341 \series default 
2342  que fue 
2343 \series bold 
2344 borrado
2345 \series default 
2346 , generando un 
2347 \series bold 
2348 gap
2349 \series default 
2350  
2351 \series bold 
2352 o freespace
2353 \series default 
2354 .
2355  Si miramos al archivo de datos (.dat) en el disco nos encontraremos con
2356  lo siguiente: 
2357 \begin_inset Float figure
2358 placement H
2359 wide false
2360 collapsed true
2361
2362 \layout Caption
2363
2364 Organización física de los registros en disco
2365 \layout Standard
2366
2367
2368 \begin_inset Graphics
2369         filename graphics/Example1.png
2370         width 100text%
2371
2372 \end_inset 
2373
2374
2375 \end_inset 
2376
2377
2378 \layout Standard
2379
2380 Como se puede observar, a nivel físico cada registro grabado esta compuesto
2381  por un Header cuyo tamaño total es de 8 bytes (
2382 \series bold 
2383 EMUFS_REG_ID
2384 \series default 
2385  + 
2386 \series bold 
2387 EMUFS_REG_SIZE
2388 \series default 
2389 ), y posteriormente el registro (bloque de datos) en sí.
2390  Luego se encuentra el espacio libre de 18 bytes dejado por el registro
2391  de 10 bytes eliminado (10 bytes de datos + header de 8 bytes) y finalmente
2392  el segundo registro mencionado.dsds
2393 \layout Subsection
2394
2395 Comportamiento Particular de los Archivos Auxiliares
2396 \layout Standard
2397
2398 Como fue explicado al inicio de la documentación, la implementación de cualquier
2399 a de las tres organizaciones físicas de archivos presenta la necesidad de
2400  poseer tres archivos auxiliares que actuarán como índice de direcciones
2401  de registro (.
2402 \series bold 
2403 idx
2404 \series default 
2405 ), administrador de espacio libre (
2406 \series bold 
2407 .fsc
2408 \series default 
2409 ) y administrador de Id's liberados (
2410 \series bold 
2411 .did
2412 \series default 
2413 ) respectivamente.
2414 \layout Standard
2415
2416 No obstante, cada tipo de organización presentara sus particularidades respecto
2417  de estos tres archivos, las cuales describiremos a continuación en caso
2418  de haberla.
2419 \layout Subsubsection
2420
2421 Archivo índice o de posiciones relativas (.idx)
2422 \layout Standard
2423
2424 El archivo indice (
2425 \series bold 
2426 .idx
2427 \series default 
2428 ), permite la localización de los registros en el .DAT de forma directa,
2429  mediante la obtención de su offset o posición relativa respecto del inicio
2430  del 
2431 \series bold 
2432 .dat
2433 \series default 
2434  en donde se encuentra un registro dado, indicado por su ID.
2435 \layout Standard
2436
2437 Así pues, si tomamos el ejemplo descripto al inicio de este capítulo, tendremos
2438  las siguientes entradas en el archivo índice 
2439 \series bold 
2440 .idx
2441 \series default 
2442
2443 \begin_inset Float table
2444 placement H
2445 wide false
2446 collapsed true
2447
2448 \layout Caption
2449
2450 Organización física del archivo de índice o posiciones relativas.
2451 \layout Standard
2452
2453
2454 \begin_inset  Tabular
2455 <lyxtabular version="3" rows="3" columns="3">
2456 <features>
2457 <column alignment="center" valignment="top" leftline="true" width="0">
2458 <column alignment="center" valignment="top" leftline="true" width="0">
2459 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2460 <row topline="true" bottomline="true">
2461 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2462 \begin_inset Text
2463
2464 \layout Standard
2465
2466
2467 \emph on 
2468 ID_REGISTRO
2469 \end_inset 
2470 </cell>
2471 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2472 \begin_inset Text
2473
2474 \layout Standard
2475
2476
2477 \emph on 
2478 OFFSET
2479 \end_inset 
2480 </cell>
2481 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2482 \begin_inset Text
2483
2484 \layout Standard
2485
2486 \end_inset 
2487 </cell>
2488 </row>
2489 <row topline="true">
2490 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2491 \begin_inset Text
2492
2493 \layout Standard
2494
2495
2496 \series bold 
2497 0
2498 \end_inset 
2499 </cell>
2500 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2501 \begin_inset Text
2502
2503 \layout Standard
2504
2505
2506 \series bold 
2507 4
2508 \end_inset 
2509 </cell>
2510 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2511 \begin_inset Text
2512
2513 \layout Standard
2514
2515 El primer registro (reg0) comienza en el byte 4
2516 \end_inset 
2517 </cell>
2518 </row>
2519 <row topline="true" bottomline="true">
2520 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2521 \begin_inset Text
2522
2523 \layout Standard
2524
2525 1
2526 \end_inset 
2527 </cell>
2528 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2529 \begin_inset Text
2530
2531 \layout Standard
2532
2533
2534 \series bold 
2535 60
2536 \end_inset 
2537 </cell>
2538 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2539 \begin_inset Text
2540
2541 \layout Standard
2542
2543 El segundo registro (reg1) comienza en el byte 60
2544 \end_inset 
2545 </cell>
2546 </row>
2547 </lyxtabular>
2548
2549 \end_inset 
2550
2551
2552 \end_inset 
2553
2554
2555 \layout Standard
2556
2557
2558 \series bold 
2559 \emph on 
2560 Observación:
2561 \series default 
2562 \emph default 
2563  LOCATION indica donde comienza el header del registro buscado, y por consiguien
2564 te luego del header tendremos el registro en sí (los datos).
2565 \layout Subsubsection
2566
2567 Achivo de Gaps / Espacios Libres (.fsc)
2568 \layout Standard
2569
2570 El archivo de espacios libres o gaps (.fsc), tiene como función la administración
2571  del espacio libre o gaps (agujeros), generados por previas eliminaciones
2572  de registros en el archivo de datos.
2573  El mismo, nos indicará donde hay lugar para insertar un nuevo registro
2574  (se podrán insertar en algún gap acorde, o bien al final del archivo).
2575  Este archivo será utilizado tambien para el proceso de compactación de
2576  un archivo, explicado luego.
2577 \layout Standard
2578
2579 Así pues, si tomamos el ejemplo descripto al inicio del documento, tendremos
2580  las siguientes entradas en el archivo índice 
2581 \series bold 
2582 .fsc
2583 \series default 
2584
2585 \begin_inset Float table
2586 placement H
2587 wide false
2588 collapsed true
2589
2590 \layout Caption
2591
2592 Organización física del archivo de 
2593 \emph on 
2594 gaps 
2595 \emph default 
2596 o control de espacio libre.
2597 \layout Standard
2598
2599
2600 \begin_inset  Tabular
2601 <lyxtabular version="3" rows="2" columns="3">
2602 <features>
2603 <column alignment="center" valignment="top" leftline="true" width="0">
2604 <column alignment="center" valignment="top" leftline="true" width="0">
2605 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
2606 <row topline="true" bottomline="true">
2607 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2608 \begin_inset Text
2609
2610 \layout Standard
2611
2612
2613 \emph on 
2614 OFFSET
2615 \end_inset 
2616 </cell>
2617 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2618 \begin_inset Text
2619
2620 \layout Standard
2621
2622
2623 \emph on 
2624 FREESPACE
2625 \end_inset 
2626 </cell>
2627 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2628 \begin_inset Text
2629
2630 \layout Standard
2631
2632 \end_inset 
2633 </cell>
2634 </row>
2635 <row topline="true" bottomline="true">
2636 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2637 \begin_inset Text
2638
2639 \layout Standard
2640
2641
2642 \series bold 
2643 42
2644 \end_inset 
2645 </cell>
2646 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
2647 \begin_inset Text
2648
2649 \layout Standard
2650
2651
2652 \series bold 
2653 18
2654 \end_inset 
2655 </cell>
2656 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
2657 \begin_inset Text
2658
2659 \layout Standard
2660
2661 18 bytes libres a partir del byte 42 del .dat
2662 \end_inset 
2663 </cell>
2664 </row>
2665 </lyxtabular>
2666
2667 \end_inset 
2668
2669
2670 \end_inset 
2671
2672
2673 \layout Standard
2674
2675
2676 \series bold 
2677 \emph on 
2678 Nota:
2679 \series default 
2680 \emph default 
2681  Por requerimiento del algoritmo de compactación, los gaps se graban en
2682  forma ordenada en el (.fsc).
2683  (El orden se corresponde con lo que hay en el 
2684 \series bold 
2685 .dat
2686 \series default 
2687 .
2688 \layout Subsubsection*
2689
2690 GAP Merging
2691 \layout Standard
2692
2693 Si bien la utilización concreta de los GAPS será explicada posteriormente
2694  en la ALTA y BAJA de registros, debemos remarcar la funcionalidad de MERGING
2695  que posee nuestro sistema FSC.
2696 \layout Standard
2697
2698 Ante la eliminación de un registro del archivo de datos, se generara por
2699  consiguiente un gap o espacio libre en alguna posición del archivo.
2700  Ese gap deberá ser registrado en el archivo de gaps (.fsc).
2701  Ahora bien, nuestro sistema de gaps, contemplará como es debido, la posibilidad
2702  de que se haya eliminado un registro que posee un GAP por delante, un GAP
2703  por detrás, o bien un GAP por delante y por detrás del mismo.
2704 \layout Standard
2705
2706 Nuestro sistema actuará en consecuencia, realizando un merge de los espacios
2707  libres, y unificándolos en una UNICA entrada en el archivo .fsc, que contendrá
2708  como dato de freespace, la suma correspondiente de los espacios libres
2709  antes mencionados.
2710 \layout Subsubsection
2711
2712 Archivo de ID's liberados (.did)
2713 \layout Standard
2714
2715 El archivo de ID's liberados no presenta ningún aspecto particular en este
2716  tipo de organización.
2717  Remitirse al capítulo correspondiente a los archivos auxiliares para consultar
2718  su estructura y funcionamiento.
2719 \layout Section
2720
2721 Funciones Principales
2722 \layout Standard
2723
2724 Dentro de 
2725 \series bold 
2726 \emph on 
2727 tipo2.h
2728 \series default 
2729 \emph default 
2730  y 
2731 \series bold 
2732 \emph on 
2733 tipo2.c
2734 \series default 
2735 \emph default 
2736  se encuentran las cabeceras y la implementación de las funciones principales
2737  respectivamente, las cuales dan funcionalidad a esta organización.
2738  
2739 \layout Standard
2740
2741 A continuación se comentará el funcionamiento algunas de las mas importantes.
2742 \layout Subsection
2743
2744 Lectura de registros
2745 \layout Standard
2746
2747 Como se vió al comienzo, los registros en este tipo de archivo no se encuentran
2748  agrupados en bloques de ninguna índole y estan dispersos a lo largo del
2749  archivo, con la particularidad de que pueden existir gaps o espacio libre,
2750  entre dos registros dados.
2751 \layout Standard
2752
2753 Por ende la lectura de registros en este tipo de organización es muy simple
2754  y dada la inexistencia de bloques, el procedimiento será el siguiente:
2755 \layout Enumerate
2756
2757 Se determina el offset en bytes, donde comienza el registro deseado, a través
2758  de su ID, buscando la misma en el archivo índice (
2759 \series bold 
2760 .idx
2761 \series default 
2762 )
2763 \layout Enumerate
2764
2765 Ya determinada la posición física del registro dentro del archivo de datos
2766  (
2767 \series bold 
2768 .dat
2769 \series default 
2770 ), nos posicionamos en la misma, y leemos el header del registro (
2771 \series bold 
2772 IDReg
2773 \series default 
2774  + 
2775 \series bold 
2776 RegSize
2777 \series default 
2778 ).
2779  Contando así con el tamaño del registro, procedemos a leer el mismo (los
2780  datos), dando por finalizada la lectura.
2781 \layout Standard
2782
2783 Ver: 
2784 \family typewriter 
2785 emufs_tipo2_leer_registro()
2786 \layout Subsection
2787
2788 Altas de registros
2789 \layout Standard
2790
2791 En el proceso de alta de registros entrarán en juego dos archivos descriptos
2792  en la 
2793 \emph on 
2794 sección de archivos auxiliares
2795 \emph default 
2796 , siendo estos el archivo índice (
2797 \series bold 
2798 .idx
2799 \series default 
2800 ), y el archivo de gaps / espacios libres (
2801 \series bold 
2802 .fsc
2803 \series default 
2804 ).
2805 \layout Standard
2806
2807 Así pues, a la hora de realizar una inserción de un registro en el archivo
2808  de datos, el procedimiento será el siguiente:
2809 \layout Enumerate
2810
2811 Calculamos el espacio que necesitaremos para el registro: sizeof(
2812 \series bold 
2813 EMUFS_REG_ID
2814 \series default 
2815 ) + sizeof(
2816 \series bold 
2817 EMUFS_REG_SIZE
2818 \series default 
2819 ) + sizeof(registro).
2820 \layout Enumerate
2821
2822 Determinamos donde debemos insertar el registro, ya sea un gap donde entre,
2823  o bien al final del archivo.
2824 \layout Enumerate
2825
2826 Insertamos el registro e información de control (
2827 \series bold 
2828 header
2829 \series default 
2830 +
2831 \series bold 
2832 data
2833 \series default 
2834 ), en la posición indicada en el paso 2.
2835 \layout Enumerate
2836
2837 En caso de haber utilizado un GAP, actualizamos el espacio libre restante
2838  en el mismo y en caso de que se haya utilizado al totalidad del GAP, se
2839  lo elimina del archivo (
2840 \series bold 
2841 .fsc
2842 \series default 
2843 ).
2844 \layout Enumerate
2845
2846 Actualizamos la entrada correspondiente al registro ingresado (determinada
2847  por su RegID), en el archivo índice (
2848 \series bold 
2849 .idx
2850 \series default 
2851 ), indicando su offset donde podrá ser accedido luego.
2852 \layout Standard
2853
2854 Ver: 
2855 \family typewriter 
2856 emufs_tipo2_agregar_registro()
2857 \layout Subsection
2858
2859 Bajas de registros
2860 \layout Standard
2861
2862 En el proceso de baja de registros entrarán en juego los tres archivos descripto
2863 s en la 
2864 \emph on 
2865 sección de archivos auxiliares
2866 \emph default 
2867 , siendo estos el archivo índice (
2868 \series bold 
2869 .idx
2870 \series default 
2871 ), el archivo de gaps / espacios libres (
2872 \series bold 
2873 .fsc
2874 \series default 
2875 ) y el archivo de ID's liberados (
2876 \series bold 
2877 .did
2878 \series default 
2879 ).
2880 \layout Standard
2881
2882 Dado que en la implementación de este tipo de organización física contamos
2883  con los gaps o espacios libres entre registros, no se eliminará fisicamente
2884  el registro del archivo de datos (
2885 \series bold 
2886 .dat
2887 \series default 
2888 ), pues entonces carecería de sentido el archivo anteriormente mencionado
2889  (
2890 \series bold 
2891 .fsc
2892 \series default 
2893 ).
2894  En cambio, se agrega el gap dejado por la eliminación a dicho archivo,
2895  y se marca fisicamente en el archivo de datos la eliminación mediante un
2896  fill de los bytes correspondientes con un caracter nulo.
2897  (hexa 00 y con el propósito de probar fehacientemente que el sistema funciona).
2898 \layout Standard
2899
2900 El proceso de baja o eliminación de un registro constará luego de los siguientes
2901  pasos:
2902 \layout Enumerate
2903
2904 Se obtiene el offset o posición relativa en donde se encuentra grabado el
2905  registro dentro del archivo de datos.
2906 \layout Enumerate
2907
2908 Se obtiene el tamaño del registro y se realiza un dummyfill del sector del
2909  archivo correspondiente al registro que se está dando de baja.
2910  (Se rellena la zona correspondiente a su header+data).
2911 \layout Enumerate
2912
2913 Se agrega el GAP generado al archivo de gaps o espacios libres, y en caso
2914  de haberse generado un GAP lindante con otro GAP, se realizará un merge
2915  de los mismos y se los registrará bajo una única entrada en el archivo
2916  de espacios libres (.fsc).
2917 \layout Enumerate
2918
2919 Se agrega el ID que fue liberado, al archivo de ID's liberados (
2920 \series bold 
2921 .did
2922 \series default 
2923 ), al final del mismo (
2924 \emph on 
2925 pila
2926 \emph default 
2927 ).
2928 \layout Enumerate
2929
2930 Se marca en el archivo índice (
2931 \series bold 
2932 .idx
2933 \series default 
2934 ) la eliminación, mediante el valor ¨-1¨ en el registro correspondiente
2935  al registro recién eliminado (se le cambia el valor al n-esimo registro,
2936  donde N = IDReg del reg eliminado).
2937 \layout Standard
2938
2939 Ver: 
2940 \family typewriter 
2941 emufs_tipo2_borrar_registro()
2942 \layout Subsection
2943
2944 Modificación de registros
2945 \layout Standard
2946
2947 Dada la naturaleza del archivo de ID's liberados, y el manejo de espacio
2948  libre del que consta esta organización de archivo, el proceso de modificación
2949  de un registro se limita a los siguientes pasos:
2950 \layout Enumerate
2951
2952 Se realiza la lectura del registro, mediante el respectivo procedimiento
2953  ya desarollado anteriormente.
2954 \layout Enumerate
2955
2956 Una vez que se cuenta con los nuevos datos modificados, se procede a dar
2957  de baja el registro que ha sido modificado, e inmediatamente después se
2958  realiza una inserción con los nuevos datos.
2959 \layout Standard
2960
2961
2962 \series bold 
2963 \emph on 
2964 NOTA:
2965 \series default 
2966 \emph default 
2967  Como fue indicado, dada la naturaleza de PILA del subsistema de administración
2968  de ID liberados, es asegurado que la nueva inserción del registro modificado
2969  se realizará con el mismo RegID.
2970 \layout Standard
2971
2972 Ver: 
2973 \family typewriter 
2974 emufs_tipo2_modificar_registro()
2975 \layout Subsection
2976
2977 Obtención de estadísticas
2978 \layout Standard
2979
2980 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
2981  cantidad de bloques, cantidad de registros, espacio libre total, espacio
2982  libre promedio, espacio libre máximo y mínimo, etc.
2983 \layout Standard
2984
2985 Esta información es el resultado de ciertos cálculos realizados tanto en
2986  el archivo de datos como en los archivos índice.
2987 \layout Standard
2988
2989 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
2990  del archivo de datos, espacio libre total, cantidad de registros, cantidad
2991  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
2992  libres, etc.
2993 \layout Standard
2994
2995 Ver: 
2996 \family typewriter 
2997 emufs_tipo2_leer_estadisticas()
2998 \layout Subsection
2999
3000 Compactación del archivo de datos
3001 \layout Standard
3002
3003 Asi como los otros dos tipos de datos, el que nos compete también cuenta
3004  con la posibilidad de realizar la compactación de datos cuando el usuario
3005  lo desee, justificando todos los registros a izquierda, eliminando así
3006  los gaps existentes y decrementando el tamaño del archivo en disco (truncandolo
3007 ).
3008 \layout Standard
3009
3010 Para poder comprender como hemos implementado el proceso de recompactación
3011  en nuestro tipo de archivo 2, nos ayudaremos de esquemas a través de los
3012  cuales iremos describiendo el proceso.
3013  Notemos antes, que el proceso de compactación esta directamente ligado
3014  con el archivo de gaps o espacios libres (
3015 \series bold 
3016 .fsc
3017 \series default 
3018 ).
3019 \layout Standard
3020
3021 Comenzemos con el siguiente cuadro situacional: 
3022 \begin_inset Float figure
3023 placement H
3024 wide false
3025 collapsed true
3026
3027 \layout Caption
3028
3029 Archivo con gaps entre registros previo a compactación
3030 \layout Standard
3031
3032
3033 \begin_inset Graphics
3034         filename graphics/Compact1.png
3035         width 100text%
3036         keepAspectRatio
3037
3038 \end_inset 
3039
3040
3041 \end_inset 
3042
3043
3044 \layout Standard
3045
3046 Partiendo de esta base, el algoritmo de compactación tomará en su inicio
3047  al primer gap existente dentro del archivo de datos, en este caso llamado
3048  
3049 \series bold 
3050 Gap0
3051 \series default 
3052 .
3053  Luego, establecerá que el 
3054 \series bold 
3055 Source
3056 \series default 
3057  a partir de donde se quieren mover datos, sera:
3058 \layout LyX-Code
3059
3060 StartGap0 + SizeGap0 = EndGap0 = Source
3061 \layout Standard
3062
3063 Lo cual no es nada más y nada menos que lo obvio, la fuente a partir de
3064  donde se mueven los datos, sera el fin del primer gap, donde comienzan
3065  datos.
3066  Como destino (
3067 \series bold 
3068 Destination
3069 \series default 
3070 ) del movimiento, se establece inicialmente, el inicio del gap, o sea 
3071 \series bold 
3072 StartGap0 = Destination
3073 \series default 
3074 .
3075 \layout Standard
3076
3077 Luego, el algoritmo entrara en un bucle while (mientras haya bucles por
3078  levantar), el cual trabajara hasta el final de la compactación de la siguiente
3079  manera:
3080 \layout Standard
3081
3082
3083 \series bold 
3084 Mientras haya Gaps
3085 \series default 
3086  {
3087 \layout Enumerate
3088
3089 Se levanta el proximo gap al levantado en una instancia previa.
3090  En este ejemplo, durante el primer loop del while, se levantará 
3091 \series bold 
3092 Gap1
3093 \layout Enumerate
3094
3095 Luego, se calcula cuantos bytes hay que mover hacia el Destination de la
3096  siguiente manera:
3097 \layout Enumerate
3098
3099
3100 \series bold 
3101 Mustmove_bytes
3102 \series default 
3103  = 
3104 \series bold 
3105 StartGap1
3106 \series default 
3107  - 
3108 \series bold 
3109 Source
3110 \series default 
3111  = 
3112 \series bold 
3113 StartGap1
3114 \series default 
3115  - 
3116 \series bold 
3117 EndGap0 (
3118 \series default 
3119 Lo cual nuevamente es lógico pues querremos mover lo que se encuentra entre
3120  el final del primer gap levantado y el inicio del siguiente).
3121 \layout Enumerate
3122
3123 Se realiza el movimiento de los datos, utilizando las direcciones 
3124 \series bold 
3125 Source
3126 \series default 
3127  y 
3128 \series bold 
3129 Destination
3130 \series default 
3131 , así como la variable 
3132 \series bold 
3133 Mustmove_bytes
3134 \series default 
3135  que nos indica cuantos bytes transferir.
3136 \series bold 
3137
3138 \newline 
3139 IMPORTANTE: 
3140 \emph on 
3141 La transferencia se hace de a chunks de 25 bytes + un resto segun el valor
3142  de Mustmove_bytes.
3143 \layout Enumerate
3144
3145 Se establece como gap de referencia, al ultimo gap leido (En este caso se
3146  realiza: 
3147 \series bold 
3148 StartGap0
3149 \series default 
3150  = 
3151 \series bold 
3152 StartGap1
3153 \series default 
3154
3155 \series bold 
3156 Gap0Size = Gap1Size
3157 \series default 
3158 ) y termina el código de repetición del bucle, dando lugar a la carga del
3159  siguiente gap en el inicio del mismo.
3160 \layout Standard
3161
3162
3163 \series bold 
3164 }
3165 \layout Standard
3166
3167 Luego del primer bucle, el archivo se vera de la siguiente forma: 
3168 \begin_inset Float figure
3169 placement H
3170 wide false
3171 collapsed true
3172
3173 \layout Caption
3174
3175 Archivo con gaps en disco luego del primer bucle de compactación
3176 \layout Standard
3177
3178
3179 \begin_inset Graphics
3180         filename graphics/Compact2.png
3181         width 100text%
3182
3183 \end_inset 
3184
3185
3186 \end_inset 
3187
3188
3189 \layout Standard
3190
3191 Notemos que al final de la porción de datos de los bytes movidos (donde
3192  quedo apuntando 
3193 \series bold 
3194 Destination
3195 \series default 
3196 ), hay basura que será pisada por el próximo movimiento.
3197 \layout Standard
3198
3199 En el próximo loop, el bucle levantará un nuevo gap, y utilizando el gap
3200  anterior (En esta caso el Gap anterior será 
3201 \series bold 
3202 Gap1
3203 \series default 
3204 ) como referencia, realizará los mismos cálculos, desde donde transferir
3205  y cuantos bytes mover.
3206  (El destino es solo establecido inicialmente por código, y para el resto
3207  del algoritmo es el lugar donde quedo el puntero destination luego de la
3208  última escritura).
3209 \layout Standard
3210
3211 Una vez que se salga del bucle while, se realizará un último movimiento
3212  preprogramado, donde la fuente (
3213 \series bold 
3214 Source
3215 \series default 
3216 ) será el final del ultimo gap, y la cantidad de bytes a mover será lo que
3217  se encuentre luego del mismo hasta el fin de archivo.
3218 \layout LyX-Code
3219
3220 Source = StartLastGap + SizeLastGap = EndLastGap
3221 \layout LyX-Code
3222
3223 Mustmove_bytes = Datsize - Source
3224 \layout Standard
3225
3226 Damos por terminada así, la explicación del algoritmo de compresión el cual
3227  para el caso del tipo 2, es realmente bastante sencillo.
3228 \layout Standard
3229
3230 Ver:
3231 \family typewriter 
3232  emufs_tipo2_compactar()
3233 \layout Section
3234
3235 Consideraciones y Políticas de Diseño
3236 \layout Standard
3237
3238 Se han tomado ciertas consideraciones para algunos casos particulares que
3239  se pueden presentar durante el uso/ejecución de la aplicación, así como
3240  tambien politicas respecto del diseño e implementación del sistema:
3241 \layout Itemize
3242
3243 En la organización física tipo 2 para los registros que se graban en disco
3244  hemos decidido utilizar como encabezado de cada uno de ellos, los datos
3245  [ID_REG][REG_SIZE], los cuales fueron detallados previamente.
3246  Si bien se podría haber descartado el grabado del ID del registro en el
3247  archivo de datos y puede parecer redundante, dado que poseemos el archivo
3248  índice con el offset directo, el mismo se lo graba por distintos motivos:
3249 \newline 
3250
3251 \newline 
3252 A) En caso de la corrupción del archivo índice (.idx), podremos gracias a
3253  que poseemos en el archivo de datos, el ID de cada registro, recrear dicho
3254  índice, ayudándonos del archivo de espacios libres (
3255 \series bold 
3256 .fsc
3257 \series default 
3258 ), para poder saltear los espacios libres y e ir recorriendo secuencialmente
3259  los registros, reconstruyendo así el índice en cuestión.
3260  (esta función de reconstrucción no pudo ser implementada para esta entrega,
3261  pero es una posibilidad real).
3262 \newline 
3263
3264 \newline 
3265 B) Luego de un proceso de recompactación, los espacios libres que pudieron
3266  haber existido en el archivo de datos (
3267 \series bold 
3268 .dat
3269 \series default 
3270 ), son eliminados y los registros han cambiado de posición.
3271  Por ello, recorriendo secuencialmente por única vez el archivo de datos,
3272  se procede a la actualización / reconstrucción del índice de direcciones
3273  u offsets (.
3274 \series bold 
3275 idx
3276 \series default 
3277 )
3278 \layout Itemize
3279
3280 Si se desea insertar un registro y no se puede hayar un gap o espacio libre
3281  donde quepa, se los inserta al final del archivo.
3282 \layout Itemize
3283
3284 Ante una operación de baja de un registro, el mismo no es físicamente borrado
3285  del archivo de datos (
3286 \series bold 
3287 .dat
3288 \series default 
3289 ), simplemente los bytes que ocupa son llenados con hexa (00).
3290  Paralelamente, se procede a actualiza el archivo índice, insertando como
3291  valor de OFFSET para el registro eliminado, el valor ¨-1¨, indicando así
3292  la inexistencia del registro para el futuro, y por otro lado se genera
3293  la entrada de espacio libre en el archivo de gaps (
3294 \series bold 
3295 .fsc
3296 \series default 
3297 ).
3298 \layout Itemize
3299
3300 La reutilización de ID's liberados por previas operaciones de baja de registros,
3301  se ve implementada por el archivo de ID liberados (.did), y su comportamiento
3302  es el de una pila por lo que el último ID liberado, sera el próximo a ser
3303  reutilizado (LIFO).
3304 \layout Itemize
3305
3306 Como fue explicado en la implementación del archivo índice, existe una correspon
3307 dencia 1 a 1 entre los registros allí presentes (en el .idx) y los ID's de
3308  los registros, por lo cual el registro N-ésimo del archivo índice, será
3309  el correspondiente al registro de datos cuyo ID es igual a N.
3310 \layout Itemize
3311
3312 El proceso de compactación de archivos, realiza los movimientos de información
3313  requeridos para dicho propósito de a chunks de 25 bytes por vez.
3314  Este valor es fijo, pero se lo podría hacer parametrizable mediante la
3315  GUI en próximas entregas.
3316 \layout Chapter
3317
3318
3319 \begin_inset LatexCommand \label{cha:tipo3}
3320
3321 \end_inset 
3322
3323 Archivo con bloques parametrizados y registros de longitud constante
3324 \layout Standard
3325
3326 Las distintas organizaciones de archivos buscan aprovechar al máximo el
3327  espacio del archivo.
3328 \layout Standard
3329
3330 En este caso veremos que sucede luego de agregar y borrar una gran cantidad
3331  de registros del archivo, lo que provoca como consecuencia directa la fragmenta
3332 ción del archivo, es decir, quedan huecos entre un registro y otro, lo que
3333  produce un desperdicio de espacio.
3334 \layout Standard
3335
3336 La implementación de este tipo de archivo puede ser encontrada en 
3337 \family typewriter 
3338 emufs/tipo3.c
3339 \family default 
3340  mientras que su interfaz pública está disponible en 
3341 \family typewriter 
3342 emufs/tipo3.h
3343 \family default 
3344 .
3345 \layout Section
3346
3347 Organización Física
3348 \layout Standard
3349
3350 Esta organización guarda los registros pertenecientes al archivo en bloques
3351  de tamaño parametrizado, de modo que intentará guardar la mayor cantidad
3352  de registros que quepan en un bloque.
3353  
3354 \layout Standard
3355
3356 Así como los graba, también tendrá la posibilidad de leer registros y borrarlos
3357  del archivo.
3358 \layout Standard
3359
3360 El archivo estara compuesto por una cabecera que da información sobre el
3361  tipo de organización, el tamaño de los bloques y el tamaño de los registros.
3362 \layout Subsection
3363
3364 Organización Física de un Bloque
3365 \layout Standard
3366
3367 Cada bloque será capaz de contener la cantidad de registros enteros que
3368  quepan en él.
3369  De esta manera un registro que no entre completamente en el bloque deberá
3370  almacenarce en un bloque diferente.
3371 \layout Standard
3372
3373 Los bloques no contienen ninguna información adicional, solo se conoce su
3374  tamaño y se usa para delimitar 
3375 \begin_inset Quotes eld
3376 \end_inset 
3377
3378 virtualmente
3379 \begin_inset Quotes erd
3380 \end_inset 
3381
3382  zonas en el archivo.
3383 \layout Subsection
3384
3385 Organizacion Física de Registros
3386 \layout Standard
3387
3388 Cada registro se almacena en un bloque, y contiene una cabecera que indica
3389  su 
3390 \emph on 
3391 ID, 
3392 \emph default 
3393 por este motivo al realizar la busqueda de espacio en un bloque se lo hará
3394  preguntando por el tamaño del registro más 
3395 \family typewriter 
3396 sizeof(EMUFS_REG_ID).
3397  
3398 \layout Subsection
3399
3400 Organización Física de Registros Multibloque
3401 \layout Standard
3402
3403 Al ser los registros de longitud constante, se ha adoptado que un registro
3404  multibloque nunca podra estar almacenado en algún lugar que no sea el comienzo
3405  de un bloque.
3406  De esta manera se puede calcular cuantos bloques ocupará un registro y
3407  se podrá solicitar lugar para almacenarlo con la ayuda de la función 
3408 \family typewriter 
3409 emufs_fsc_buscar_n_lugares(), 
3410 \family default 
3411 que es muy importante para evitar el solapamiento de registros.
3412  Esta consideración acarrea como consecuencia directa un alto costo en términos
3413  del espacio desperdiciado.
3414 \layout Section
3415
3416 Funciones Principales
3417 \layout Standard
3418
3419 Dento de 
3420 \emph on 
3421 tipo3.h
3422 \emph default 
3423  y 
3424 \emph on 
3425 tipo3.c
3426 \emph default 
3427  se encuentran las cabeceras y la implementación de las funciones principales
3428  respectivamente, las cuales dan funcionalidad a esta organización.
3429 \layout Standard
3430
3431 A continuación se comentará la descripción de algunas acciones importantes.
3432 \layout Subsection
3433
3434 Leer Registro
3435 \layout Standard
3436
3437 La lectura de un registro se realiza con la ayuda del archivo .
3438 \emph on 
3439 idx
3440 \emph default 
3441  el cual contiene la información de la posición del registro dentro del
3442  archivo de datos.
3443  Una vez leida esta información, se recupera el bloque (en su totalidad)
3444  del archivo y se busca secuencialmente el registro con el 
3445 \emph on 
3446 ID
3447 \emph default 
3448  especificado.
3449 \layout Standard
3450
3451 Ver: 
3452 \family typewriter 
3453 emufs_tipo3_leer_registro()
3454 \layout Subsection
3455
3456 Grabar Registro
3457 \layout Standard
3458
3459 Graba un registro en un bloque donde haya espacio suficiente, y si no crea
3460  un nuevo bloque y lo agrega al final del archivo.
3461 \layout Standard
3462
3463 Luego de grabar un registro, actualiza los archivos de índice .idx y .fsc
3464  para mantener la coherencia.
3465 \layout Standard
3466
3467 Ver: 
3468 \family typewriter 
3469 emufs_tipo3_grabar_registro()
3470 \layout Subsection
3471
3472 Borrar Registro
3473 \layout Standard
3474
3475 Borra un registro del archivo de datos, para esto levanta el bloque al que
3476  pertenece el archivo y ajusta los demás registros justificandolos hacia
3477  la izquierda.
3478 \layout Standard
3479
3480 Cabe destacar que para dar de baja un registro no hace falta borrarlo del
3481  archivo de datos, solo es necesario borrar las entradas en los archivos
3482  de índice, pero cuando se realiza el ajuste el algoritmo toma porciones
3483  del bloque del tamaño de un registro mas su encabezado - comenzando desde
3484  el siguiente al que fue borrado - y copia (sobreescribe) sobre el anterior.
3485  De esta manera, la información correspondiente al registro borrado no estará
3486  presente en el archivo de datos.
3487  Esto es una consecuencia del ajuste al borrar un registro, pudiendo no
3488  ser así, si no se realizara el mismo.
3489 \layout Standard
3490
3491 Ver: 
3492 \family typewriter 
3493 emufs_tipo3_borrar_registro()
3494 \layout Subsection
3495
3496 Leer Estadísticas
3497 \layout Standard
3498
3499 Se puede tener acceso a las estadísticas generales del archivo, por ejemplo,
3500  cantidad de bloques, cantidad de registros, espacio libre total, espacio
3501  libre promedio, espacio libre máximo y mínimo, etc.
3502 \layout Standard
3503
3504 Esta información es el resultado de ciertos cálculos realizados tanto en
3505  el archivo de datos como en los archivos índice.
3506 \layout Standard
3507
3508 Completa una estructura del tipo EMUFS_Estadisticas con las estadísticas
3509  del archivo de datos, espacio libre total, cantidad de registros, cantidad
3510  de bloques, tamaño del archivo en bytes, relaciones entre tamaños y espacios
3511  libres, etc.
3512 \layout Standard
3513
3514 Ver: 
3515 \family typewriter 
3516 emufs_tipo3_leer_estadisticas()
3517 \layout Subsection
3518
3519 Compactar el Archivo
3520 \layout Standard
3521
3522 Esta función intenta reorganizar el archivo de manera que el espacio libre
3523  sea lo menor posible, recordando siempre que un registro no puede ser almacenad
3524 o en mas de un bloque excepto que el tamaño del registro sea mayor que el
3525  del bloque.
3526 \layout Standard
3527
3528 Para realizar esto, se aprovecha la funcionalidad de 
3529 \emph on 
3530 emufs_tipo3_grabar_registro() 
3531 \emph default 
3532 ya que esta tiene la capacidad de determinar una posición mas eficiente
3533  en el archivo para un registro.
3534  Por esto lo que se hace es levantar uno por uno los registros y volverlos
3535  a grabar, de ese modo todos los 
3536 \emph on 
3537 gaps 
3538 \emph default 
3539 que pudieron haberse formado por la eliminación de registros serán cubiertos
3540  por otros.
3541 \layout Standard
3542
3543 Al estar utilizando recuperación de 
3544 \emph on 
3545 id`s
3546 \emph default 
3547  borrados, esto me asegura que el registro borrado-guardado conservará el
3548  id al grabarse.
3549 \layout Standard
3550
3551 Al finalizar este proceso se verifica si existen bloques vacios para truncar
3552  el archivo.
3553  Lo mismo se debe hacer con el archivo de espacios libres .
3554 \emph on 
3555 fsc 
3556 \emph default 
3557 el cual disminuye su tamaño también.
3558 \layout Standard
3559
3560 Ver: 
3561 \family typewriter 
3562 void emufs_tipo3_compactar()
3563 \layout Section
3564
3565 Consideraciones y Políticas de Diseño
3566 \layout Standard
3567
3568 Se han tomado ciertas consideraciones para algunos casos particulares que
3569  se pueden presentar durante el uso/ejecución de la aplicación.
3570 \layout Enumerate
3571
3572 Cada registro tiene un encabezado que indica el 
3573 \emph on 
3574 id 
3575 \emph default 
3576 del mismo.
3577 \layout Enumerate
3578
3579 Si el tamaño del registro es mayor que el tamaño del bloque el registro
3580  se particionará en la cantidad de bloques que sea necesario, pero siempre
3581  se guardará desde el comienzo de un bloque, esto quiere decir que nunca
3582  se podrá encontrar un comienzo de registro en algún lugar de un bloque
3583  que no sea el comienzo del mismo.
3584 \layout Enumerate
3585
3586 Si el registro se divide en mas de un bloque, se le coloca el id como encabezado
3587  igualmente, pero en el archivo .
3588 \emph on 
3589 idx
3590 \emph default 
3591  solo se guarda el primer bloque.
3592  En el 
3593 \emph on 
3594 .fsc
3595 \emph default 
3596  se actualizan todos los bloques con el espacio libre que realmente tienen.
3597 \layout Chapter
3598
3599 Conclusiones
3600 \layout Standard
3601
3602 Las comparaciones, pruebas, etc...
3603 \the_end