Introducción
Antes de
comenzar a hablar de lo que es un Sistema de gestión de archivos sería
conveniente aclarar que es un archivo y cuáles son sus utilidades:
Cuando
hablamos de archivos, habitualmente se utilizan cuatro términos: Campo,
Registro, Archivo y Base de datos. Se puede decir que estos términos forman una
estructura de datos agrupados y relacionados de alguna manera en particular
donde uno contiene al otro y que nos facilitan la manera de almacenarlos y
recuperarlos.
Un Campo es el elemento de
datos básico, como ejemplo: un campo individual contiene un valor único, como
el apellido de un empleado, una fecha o un valor leído por un sensor. Lo más
importante de un campo es su longitud (que puede ser fija o variable) y el tipo
de datos que contenga(ya sea una cadena ASCII o un dígito decimal).
Un Registro es un conjunto de
campos relacionados que pueden tratarse como una unidad por algunos programas
de aplicación. Por ejemplo: un registro de nombre “empleado” contendría campos
tales como nombre, DNI, fecha de contratación, etc. Un registro puede ser de
longitud variable en el caso de que el número de campos pueda variar, esto
dependerá de su diseño.
Un Archivo es un conjunto de
registros similares. Los usuarios y las aplicaciones se refieren a él por un
nombre que es único y que puede crearse y borrarse. Las restricciones al
control de acceso suelen aplicarse a los archivos. Es decir en un sistema
compartido, el acceso de los usuarios y los programas se garantiza o deniega a
archivos completos, en otros casos se aplica a los registros e incluso a los
campos.
Una Base de datos es un
conjunto de datos relacionados. El aspecto fundamental es que está diseñada
para ser usada por varias aplicaciones diferentes. Puede contener toda la
información relativa a una organización o proyecto.
Un Sistema de gestión de archivos es el software del sistema que proporciona servicios a usuarios y aplicaciones para el uso de archivos. Normalmente la única forma en que un usuario o aplicación puede acceder a los archivos es mediante el sistema de gestión de archivos.
Objetivos para un sistema de gestión de
archivos. [Gros86]
Cumplir con las necesidades de gestión de datos y con los requerimientos
del usuario.
Garantizar que los datos de los archivos sean válidos.
Optimizar el rendimiento en términos de productividad y tiempo de
respuesta.
Ofrecer soporte de E/S para los distintos dispositivos de
almacenamiento.
Minimizar o eliminar la posibilidad de pérdida o destrucción de datos.
Con
respecto al primer punto. Para un sistema interactivo, de propósito general,
deben cumplirse los siguientes requisitos
mínimos:
1.
Cada
usuario debe ser capaz de crear, borrar, y cambiar los archivos.
2.
Cada
usuario puede tener acceso controlado a los archivos de otros usuarios.
3.
Cada
usuario puede controlar qué tipos de acceso estarán permitidos a sus archivos.
4.
Cada
usuario debe poder reestructurar sus archivos de manera adecuada al problema.
5.
Cada
usuario debe ser capaz de mover datos entre los archivos.
6.
Cada usuario
debe ser capaz de guardar una copia de reserva y recuperar sus archivos en el
caso de que hayan sufrido algún daño.
7.
Cada
usuario debe ser capaz de acceder a sus archivos mediante un nombre simbólico.
Estos
objetivos y requerimientos deben tenerse en cuenta en todo nuestro estudio de
los sistemas de gestión de archivos.
Una manera de hacerse una idea del alcance de la gestión de archivos es observar una representación de una organización típica del software.
En el nivel más bajo se encuentran los gestores de dispositivos que se comunican directamente con los dispositivos periféricos o sus controladores o canales. En operaciones con archivos, los dispositivos típicos controlados son discos y unidades de cinta. Los gestores de dispositivos son considerados generalmente como parte del sistema operativo.
El siguiente nivel es conocido con el nombre de sistema de archivos básico o nivel de E/S física, este sistema se encarga de ubicar los bloques de datos en el dispositivo de almacenamiento secundario y además del almacenamiento intermedio de los mismos en la memoria principal. El sistema de archivos básico se considera a menudo parte del sistema operativo.
El supervisor básico de E/S es el responsable de la iniciación y terminación de toda la E/S de archivos. En este nivel se mantienen unas estructuras de control que se encargan de la E/S con los dispositivos, la planificación y el estado de los archivos. El supervisor básico de E/S es parte del sistema operativo.
La E/S lógica es la parte del sistema de archivos que permite a usuarios y aplicaciones acceder a los registros. Así, mientras el sistema de archivos básico trabaja con bloques de datos, el módulo de E/S lógica lo hace con registros.
Finalmente, el nivel del sistema de archivo más cercano al usuario es, generalmente, el método de acceso. Los diferentes métodos de acceso reflejan las distintas estructuras de archivos y las formas diferentes de acceder y procesar los datos.
Los usuarios y programas de aplicación interactúan con el sistema de archivos por medio de órdenes de creación y eliminación de archivos y realizando operaciones sobre los archivos. Antes de realizar cualquier operación, el sistema de archivos debe identificar y ubicar el archivo en cuestión. Esto requiere el uso de algún tipo de directorio que describa la ubicación de todos los archivos y sus atributos. Además, la mayoría de los sistemas compartidos aplican algún control de acceso a los usuarios. Las operaciones básicas que un usuario o aplicación puede realizar sobre un archivo tienen lugar en los registros. El usuario o la aplicación contempla al archivo como una estructura que organiza registros, como una estructura secuencial.
Mientras que los usuarios y aplicaciones se ocupan de los registros, la E/S se lleva a cavo por bloques. De esta forma, los registros de un archivo deben traducirse a bloques para la salida, y los bloques traducirse a registros después de la entrada. Debe gestionarse el almacenamiento secundario. Esto implica la asignación de archivos a los bloques disponibles del almacenamiento secundario y la gestión del espacio libre, de manera que se conozca qué bloques están disponibles para la creación de archivos nuevos y el crecimiento de los archivos existentes.
Organización y acceso a archivos
La organización de archivos es la estructuración lógica de los registros determinada por su forma de acceso.
La organización física de un archivo en el almacenamiento secundario depende de la estrategia de agrupación y de la estrategia de asignación de archivos.
Para elegir una organización de archivos se deben tener en cuenta ciertos criterios:
Si un archivo va a procesar solamente por lotes, accediendo cada vez a todos los registros, entonces el acceso rápido para la recuperación de un único registro es una preocupación mínima. Un archivo almacenado en CD-ROM nunca será actualizado, por lo que la facilidad de actualización no se considera. Para la economía de almacenamiento, debería existir una mínima redundancia de los datos, ésta redundancia es el medio fundamental para incrementar la velocidad de acceso a los datos.
La mayor parte de las estructuras de organizaciones alternativas de archivos se encuentran dentro de estas cinco categorías:
Pilas
Es
la forma más fácil de organizar un archivo. Los datos se recogen en el orden en
que llegan.
Su
objetivo es simplemente acumular una masa de datos y guardarla.
Los
registros pueden tener campos diferentes o similares en un orden distinto. Cada
campo debe ser autodescriptivo, incluyendo tanto un campo de nombre como el
valor. La longitud de cada campo debe indicarse implícitamente con
delimitadores, explícitamente incluidos como un subcampo más.
El
acceso a los registros se hace por búsquedas exhaustiva y son fáciles de
actualizar. Si se quiere encontrar un registro que contiene un campo particular
y un valor determinado, es necesario examinar cada registro de la pila hasta
encontrar el registro deseado. Si se quieren encontrar todos los registros que
contienen un campo particular o que tienen un valor determinado para ese campo,
debe buscarse el archivo entero.
Se
aplica cuando los datos se recogen o almacenan antes de procesarlos o cuando no
son fáciles de organizar. Esta clase de archivo aprovecha bien el espacio
cuando los datos almacenados varían en tamaño y estructura. Fuera de estos usos
limitados, este tipo de archivos no se adapta a la mayoría de las aplicaciones.
Archivos secuenciales
Es
la forma más común de estructura de archivos.
Se
emplea un formato fijo para los registros, son de la misma longitud y constan
del mismo número de campos de tamaño fijo con un orden determinado.
Se
necesita almacenar los valores de cada campo; el nombre del campo y la longitud
de cada uno son atributos de la estructura del archivo. Cada registro tiene un
campo clave que lo identifica (generalmente es el primero de cada registro).
Los registros se almacenan en secuencia por la clave.
Se
utilizan normalmente en aplicaciones de procesos por lotes, ya que es la única
organización de archivos que se puede guardar tanto en cintas como en discos.
Para las aplicaciones interactivas que incluyen peticiones
o actualizaciones de registros individuales, los archivos secuenciales no son
óptimos. El acceso requiere una búsqueda secuencial de correspondencias con la
clave. Si el archivo entero o gran parte de él pueden traerse a la memoria
principal de una sola vez, se podrán
aplicar técnicas de búsquedas más eficientes. Al acceder un registro de un
archivo secuencial grande, se produce un procesamiento extra y un retardo
considerable.
La organización física del archivo en una cinta o disco se
corresponde exactamente con la organización lógica del archivo, por lo tanto el
procedimiento habitual es ubicar los nuevos registros en un archivo de pila
separado, es llamado archivo de registro o archivo de transacciones.
Una
alternativa es organizar físicamente el archivo secuencial como una lista
enlazada, en cada bloque físico se
almacena uno o más registros y cada bloque del disco contiene un puntero al
bloque siguiente. La inserción de un nuevo registro implica la manipulación de
puntero, pero no requiere que el nuevo registro ocupe una posición particular
del bloque físico.
Archivos secuenciales indexados:
Los
registros se organizan en una secuencia basada en un campo clave presentando
dos características, un índice del archivo para soportar los accesos aleatorios
y un archivo de desbordamiento. El índice proporciona una capacidad de búsqueda
para llagar rápidamente al registro
deseado y el archivo de desbordamiento es similar al archivo de registros usado
en un archivo secuencial, pero está integrado de forma que los archivos de
desbordamiento se ubiquen siguiendo un puntero desde su registro predecesor.
La
estructura más simple tiene como índice un archivo secuencial simple, cada
registro del archivo índice tiene dos campos, un campo clave igual al del
archivo principal y un puntero al archivo principal. Para encontrar un campo
especifico se busca en el índice hasta encontrar el valor mayor de la clave que
es iguale o precede al valor deseado de la clave, la búsqueda continua en el
archivo principal a partir de la posición que indique el puntero.
Cada
registro del archivo principal tiene un campo adicional que es un puntero al
archivo de desbordamiento. Cuando se inserta un nuevo registro al archivo,
también se añade al archivo de desbordamiento. El registro del archivo
principal que precede inmediatamente al nuevo registro según la secuencia
lógica se actualiza con un puntero del registro nuevo en el archivo de
desbordamiento, si el registro inmediatamente anterior está también en el
archivo de desbordamiento se actualizará el puntero en el registro.
Para
procesar secuencialmente un archivo completo los registros del archivo
principal se procesarán en secuencia hasta encontrar un puntero al archivo de desbordamiento,
el acceso continua en el archivo de desbordamiento hasta que encuentra un
puntero nulo, entonces renueva el acceso donde se abandonó en el archivo
principal.
Archivos indexados:
A
los registros se accede solo a través de sus índices. No hay resticción en la
ubicación de los registros, al menos un índice contiene un puntero a cada
registro y pueden emplearse registros de longitud variable.
Se
suelen utilizar dos tipos de índices, uno exhaustivo que contiene una entrada
para cada registro del archivo principal y se organiza como un archivo
secuencial para facilitar la búsqueda, el otro índice es parcial que contiene
entrada a los registros donde esté el campo de interés.
Con
registro de longitud variable, algunos registros no contendrán todos los campos
y cuando se añade un registro al archivo principal, todos los archivos de
índices deben actualizarse.
Archivos directos o de dispersión:
Explotan
la capacidad de los discos para acceder directamente a cualquier bloque de
dirección conocida.
Se
requiere un campo clave en cada registro.
Los
archivos directos son muy usados donde se necesita un acceso muy rápido, donde
se usan registros de longitud fija y donde siempre se accede a los registros de
una vez.
Organizaciones comunes de archivo
Archivo de pila:
Registro de longitud variable. Conjunto variable de campos. Orden cronológico

Archivo secuencial: Registro
de longitud fija. Conjunto fijo de campos en orden constante. Orden secuencial
por el campo clave.

Archivo secuencial indexado:

Archivo indexado:

Organización de Directorios
Asociado con cualquier sistema de gestión de archivos o cualquier conjunto de archivos suele haber un directorio de archivos. El directorio contiene información sobre los archivos, incluyendo atributos, ubicación y propietario. El directorio es propiamente un archivo poseído por el sistema operativo y accesible a través de diversas rutinas de gestión de archivos. Aunque parte de la información de los directorios está disponible para los usuarios y aplicaciones, ésta la proporcionan, generalmente de un modo indirecto, las rutinas del sistema.
Los usuarios no pueden acceder directamente al directorio, incluso en modo de sólo lectura.
Desde punto de vista del usuario, el directorio ofrece una traducción entre los nombres de archivo conocidos por usuarios y por aplicaciones y los archivos propiamente dichos. Cada entrada incluirá el nombre del archivo. Casi todos los sistemas trabajan con clases diferentes de archivos y diferentes organizaciones de archivos, por lo que también se incluye esta información. Un tipo de información importante sobre cada archivo es aquella relativa a su almacenamiento, incluyendo su ubicación y tamaño. En los sistemas compartidos, también es importante ofrecer información para controlar el acceso del archivo.
Un usuario será el propietario del archivo y podrá otorgar ciertos privilegios de acceso a otros usuarios, luego se necesita información para gestionar la utilización actual del archivo y guardar un historial sobre su uso.
Elementos de información que se almacena normalmente en el directorio para cada archivo del sistema:
Información
básica
*Nombre del archivo: nombre elegido por el creador ( usuario o programa). Debe ser único en un directorio específico.
*Tipo de archivo: por
ejemplo: texto, binario, módulo de carga, etc.
*Organización de archivo: para sistemas que soportan varias organizaciones.
Información
de dirección
*Volumen: indica el dispositivo donde se almacena el archivo.
*Dirección de comienzo: dirección física de inicio de la memoria secundaria (cilindro, pista y número de bloque en disco).
*Tamaño usado: tamaño actual del archivo en bytes, palabras o bloques.
*Tamaño asignado: tamaño máximo del archivo.
Información
de control de acceso
*Propietario: usuario con control sobre el archivo. El propietario puede otorgar o denegar acceso a otros usuarios y cambiar estos privilegios.
*Información de acceso: una versión simple de este elemento incluye el nombre del usuario y la contraseña para cada usuario autorizado.
*Acciones permitidas: controla la lectura, escritura, ejecución y transmisión por una red.
Información
de uso
*Fecha de creación: cuándo se añadió el archivo al directorio.
*Identidad del creador: normalmente, pero no siempre, el propietario.
*Fecha de última lectura: fecha de la última vez que se leyó un registro.
*Identidad del último lector: usuario que hizo la lectura.
*Fecha de última modificación: fecha de la última actualización, inserción o borrado.
*Identidad del último modificador: usuario que hizo la modificación.
*Fecha de la última copia de reserva: fecha de la última vez que el archivo fue copiado en otro medio de almacenamiento.
*Utilización actual: información sobre la actividad actual del archivo, como el (los) proceso(s) que tiene abierto el archivo, si está bloqueado por un proceso y si el archivo ha sido actualizado en la memoria principal, pero aún no en el disco.
Parte de la información puede guardarse en un registro de cabecera asociado al archivo; esto reduce la cantidad de espacio necesario para el directorio, haciendo más fácil mantener todo el directorio o parte en la memoria principal para mejorar la velocidad. Por supuesto, algunos elementos clave deben permanecer en el directorio; normalmente, estos incluyen el nombre, dirección, tamaño y organización.
La forma más simple de estructuración de un directorio es una lista de entradas, una para cada archivo, puede representarse con un simple archivo secuencial, con el nombre del archivo haciendo las veces de clave, no es adecuada cuando múltiples usuarios comparten el sistema e incluso para un solo usuario con muchos archivos.
Para comprender los requisitos de una estructura de archivo, merece la pena considerar los tipos de operaciones que pueden realizarse con un directorio:
Buscar:
cuando un usuario o aplicación hace referencia a un archivo, debe buscarse en
el directorio la entrada correspondiente al archivo.
Crear
archivo: al crear un nuevo archivo, debe añadirse una entrada al
directorio.
Borrar
archivo: al borrar un archivo, debe
eliminarse una entrada del directorio.
Enumerar
directorio: puede solicitarse todo el directorio o una parte. Generalmente,
esta petición la hace un usuario y el resultado es una lista de todos los
archivos poseídos por dicho usuario, junto a algunos de los atributos de cada
archivo(tipo, información de control de acceso; información de uso).
Actualizar
directorio: cuando algunos atributos del archivo se almacenan en el
directorio, un cambio en alguno de estos atributos requiere un cambio en la
entrada del directorio correspondiente.
El usuario puede tener muchos tipos de archivos, incluyendo documentos de texto, archivos gráficos, hojas de cálculo, etc. El usuario puede querer tenerlos organizados por proyecto, tipo o de otra manera conveniente. Si el directorio es una simple lista secuencial, no ofrecerá ayuda alguna en la organización de los archivos y obligará al usuario a tener cuidado de no usar el mismo nombre para dos tipos diferentes de archivo.
El problema es mucho peor en un sistema compartido. Los nombres únicos se convierten en un problema serio. Además, es difícil ocultar a los usuarios determinadas partes del directorio global cuando no hay una estructura inherente en el mismo.
Para resolver estos problemas podría ser acudir a un esquema de dos niveles . En este caso, existe un directorio para cada usuario y un directorio maestro. El directorio maestro dispone de una entrada para cada directorio de usuario, incluyendo una dirección e información de control de acceso. Cada directorio de usuario es una simple lista de los archivos del usuario. Esta disposición significa que los nombres deben ser únicos sólo dentro del conjunto de archivos de cada usuario y que el sistema de archivos puede hacer cumplir fácilmente unas restricciones de acceso a los directorios, todavía no ofrece a los usuarios ayuda alguna para estructurar sus conjuntos de archivos.
Un método más potente y flexible, adoptado casi universalmente, es el directorio jerárquico o estructurado en árbol, eso quiere decir que existe un directorio maestro que contiene un número determinado de directorios de usuario, cada uno de estos directorios puede tener a su vez subdirectorios y archivos como entradas. Esto se cumple en cualquier nivel, es decir en cualquier nivel un directorio puede constar de entradas para subdirectorios o entradas para archivos.
Queda comentar cómo se organiza cada directorio y subdirectorio. El método más simple es, por supuesto, almacenar cada directorio como un archivo secuencial, cuando los directorios contengan un número muy grande de entradas, tal organización puede conducir a tiempos de búsqueda innecesariamente grandes, en tal caso se prefiere una estructura de dispersión.
Cada archivo del sistema debe tener un nombre único para que las referencias al archivo no sean ambiguas. Por otra parte, proporcionar nombres únicos es una carga inaceptable para los usuarios, especialmente en un sistema compartido.
Cualquier archivo del sistema puede ser localizado siguiendo un camino desde el directorio raíz o maestro, descendiendo por varias ramas hasta que se alcance el archivo. La serie de nombres de directorios, terminados con el propio nombre del archivo, constituye el nombre de camino del archivo, por ejemplo, un archivo que tiene el nombre de camino /UsuarioB/Textos/Tema1/ABC. La barra oblicua se utiliza para delimitar los nombres en la secuencia. El nombre del directorio maestro queda implícito porque todos los caminos comienzan en tal directorio. Es perfectamente aceptable tener varios archivos con el mismo nombre de archivo mientras tengan nombres de camino únicos. De esta forma, puede haber otro archivo en el sistema con el nombre ABC, pero su nombre de camino es /UsuarioB/Dibujos/ABC.
Aunque el nombre del camino facilita la elección de los nombres de archivo, para un usuario sería incómodo tener que deletrear el nombre del camino entero cada vez que haga una referencia a un archivo. Cada usuario interactivo o proceso tiene asociado un directorio actual, conocido a menudo como directorio de trabajo. Las referencias a los archivos son entonces relativas al directorio de trabajo, por ejemplo, si el directorio de trabajo del usuario B es “Textos” entonces el nombre de camino es Tema1/ABC. Cuando un usuario interactivo se conecte o cuando se cree un proceso, el valor por defecto para el directorio de trabajo será el directorio del usuario. Durante la ejecución, el usuario puede navegar por el árbol y así definir directorios de trabajo diferentes.
Compartimiento de Archivos
En un sistema
multiusuario, casi siempre existe la necesidad de permitir a los usuarios
compartir archivos. Se presentan entonces dos cuestiones: los derechos de
acceso y la gestión a los accesos simultáneos.
Derechos de acceso
El sistema de
archivos debe ofrecer una herramienta flexible que permita el compartimento
general de archivos entre los usuarios, así como un conjunto de opciones para
poder controlar el acceso a cada archivo
en particular.
Generalmente, los usuarios o grupos de usuarios obtienen ciertos derechos de
acceso a cada archivo.
La lista que se
presenta a continuación representa los derechos de acceso que pueden asignarse
a un usuario particular para un archivo específico.
Ninguno: el usuario no puede conocer la existencia del archivo ni acceder al
mismo. Para aplicar esta restricción, no se permite al usuario leer el
directorio de usuario que incluya al archivo.
Conocimiento: el usuario puede determinar que el archivo existe y quién es su
propietario. El usuario puede solicitar derechos de acceso adicionales al
propietario.
Ejecución: el usuario puede cargar y ejecutar un programa pero no puede copiarlo.
Lectura: el usuario puede leer el archivo para cualquier propósito, incluyendo
copia y ejecución. Hay sistemas que distinguen entre visualizar y copiar. En el
primero, el contenido del archivo puede mostrarse al usuario, pero no se lo
puede copiar.
Adición: el usuario
puede añadir datos al archivo pero no puede modificar o borrar el contenido del
mismo.
Actualización: el usuario puede modificar, borrar y añadir datos al archivo. Incluye
la escritura del archivo al principio, la reestructuración por completo o en
parte y la eliminación de todos los datos o parte de ellos.
Cambio de
protección: el usuario puede cambiar los
derechos de acceso otorgados a otros usuarios. En algunos sistemas el
propietario puede otorgar este derecho a los usuarios. Para frenar el abuso de
este mecanismo, el propietario del archivo específica que derechos pueden ser
cambiados.
Borrado: el usuario
puede borrar el archivo del sistema de archivos.
Estos derechos
constituyen una jerarquía, es decir, si un usuario particular adquiere el
derecho de actualización para un archivo determinado, también habrá adquirido
los derechos de: conocimiento,
ejecución, lectura
y adición.
Un usuario es
designado como propietario de un archivo dado, generalmente es la persona que
crea el archivo al principio. El propietario cuenta con todos los derechos de
acceso citados anteriormente y puede otorgar derechos a los otros.
El propietario
puede ofrecer acceso a las siguientes clases de usuarios:
Usuario específico: usuarios individuales designados por su ID de usuario.
Grupos de usuarios: no definidos individualmente. El sistema debe disponer de algún medio
para constatar la militancia de estos grupos.
Todos: todos los
usuarios que tengan acceso al sistema. Estos serán archivos públicos.
Accesos simultáneos
Al otorgar acceso
para añadir o actualizar un archivo a más de un usuario, el sistema operativo o
el sistema de gestión de archivo debe hacer cumplir una disciplina. Un método
consiste en permitir a los usuarios bloquear el archivo entero cuando lo
actualicen. Un mejor control es bloquear los registros individuales durante la
actualización. Al diseñar la posibilidad de accesos compartidos ,se deben
abordar aspectos de exclusión mutua e interbloqueo.
Agrupación
de Registros
Registro: unidad lógica de acceso a los
archivos.
Bloques: unidad de E/S para
almacenamiento secundario.
Para
realizar E/S los registros deben organizarse en bloques.
Hay aspectos a considerar:
1.
Bloques
de Longitud Fija o Variable
En muchos sistemas los bloques son de
longitud fija, lo que simplifica la E/S, la asignación de buffers, y la
organización de los bloques en la memoria secundaria.
2.
Tamaño
relativo de bloque en relación al tamaño medio de registro
Cuando más grande sea el bloque, más
registros se transferirán por operación de E/S. Si el archivo se procesa
secuencialmente, es una ventaja pues minimiza la E/S usando bloques más
grandes. Si se accede aleatoriamente a los registros sin cercanía entre las
referencias de los mismos, es una desventaja pues en la E/S se transfieren
muchos registros que nunca serán usados.
Una
combinación de la frecuencia de operaciones secuenciales con la posibilidad de
cercanía de referencias, implicaría reducción de E/S usando bloques mayores. El
inconveniente es que bloques grandes resultan en buffers de E/S grandes y
difíciles de gestionar.
Métodos de Agrupación en
Bloques
Conclusiones sobre los
métodos
*Los
bloques de tamaño fijo son el modo más común de archivos secuenciales con
registros de longitud variable.
*Los bloques de longitud variable con tramos
son eficaces y no limitan el tamaño de registro, pero son difíciles de
implementar: los registros que ocupan dos bloques requieren dos operaciones de
E/S, los archivos se hacen difíciles de actualizar y la organización es
compleja.
*Los bloques de longitud variable sin tramos
desperdician espacio y limitan el tamaño de registro al tamaño del bloque.
Comentarios sobre memoria
virtual y agrupación de registros
La técnica de agrupación de registros podría
colaborar con el hardware de la memoria virtual, para ello es deseable que la
unidad básica de transferencia sea la página, si estas son pequeñas es poco práctico
tratarlas como bloques sin tramos por ello algunos sistemas combinan varias
páginas para formar un bloque (mayor), para la E/S de archivos. Por ejemplo en
archivos VSAM de máquinas IBM.
Gestión de Almacenamiento
Secundario
La
Memoria es el lugar donde se almacenan todos los datos como las instrucciones,
existen dos tipos básicos de memoria, diferenciados principalmente por su
velocidad:
La
Memoria Principal, interna o central: es la que actúa con mayor velocidad y
esta ligada directamente a las unidades mas rápidas de la computadora (unidad de control y unidad
aritmetico_logica).
Para
que un programa se ejecute debe estar almacenado en la Memoria Principal; esta
se divide en dos zonas: en la de solo lectura (Memoria RAM) la cual es permanente,
y otra en donde se puede leer y escribir (Memoria ROM) la que es volátil.
A
diferencia de la Memoria Principal la Memoria Secundaria, auxiliar, masiva,
externa no es tan veloz pero tiene gran capacidad para almacenar información en
dispositivos tales como discos, cintas magnéticas, discos ópticos.
Frecuentemente los datos y programas se graban en la Memoria Secundaria, de
esta forma, cuando se ejecuta varias veces un programa o se utilicen
repetidamente unos datos, no es necesario darlos de nuevo a través del
dispositivo de entrada.
En la
Memoria Secundaria un archivo consta de un conjunto de bloques (correspondiente
a la cantidad de información que se transfiere físicamente en cada operación de
acceso (lectura o escritura).
El
Sistema Operativo o Sistema de Gestión de Archivos es el encargado de la
asignación de bloques a archivos, de lo que surgen dos cuestiones, en primer
lugar, debe asignarle el espacio de Memoria Secundaria a los archivos y, en
segundo lugar, es necesario guardar constancia del espacio disponible para
asignar.
En la asignación de archivos surgen varios planteos:
¿Al crearse un archivo, el
espacio que necesita se le asigna el máximo de una vez o no?
¿Qué tamaño de sección debería
usarse para asignar archivos?. Entendiéndose por sección al espacio que se
asigna a un archivo en forma de una o mas unidades contiguas, el tamaño de la
sección puede variar desde un único bloque a un archivo entero.
¿Que tipo de estructura de datos
o tabla se usara para guardar constancia de las secciones asignadas a un
archivo?. Esta tabla se conoce como tabla
de asignación de archivos (FAT
File Allocation Table).
El
primer planteo es el de la asignación
previa frente a asignación dinámica:
La asignación previa requeriría que el tamaño se declarase en el momento de crearlo, esto es difícil de estimar de manera fiable, ya que al asignar el espacio máximo al archivo se puede sobrestimar el tamaño de la asignación de forma que no falte espacio, esto es un derroche desde el punto de vista de la asignación de Memoria Secundaria, por lo que existen ventajas en el uso de la asignación dinámica, que asigna espacio a los archivos en secciones a medida que se necesitan.
Otro
planteo es el del tamaño de sección:
Se puede asignar una sección suficientemente grande como para guardar el archivo entero, o asignar el espacio en disco bloque en bloque.
Se debe tener en cuenta los siguientes elementos:
La
contigüidad aumenta el rendimiento, especialmente para las operaciones de
Recupere_Siguiente y, para ejecutar las transacciones de un sistema orientado a
transacciones.
Disponer
de un gran numero de secciones pequeñas aumenta el tamaño de las tablas
necesarias para gestionar las asignación de información.
Disponer
de secciones de tamaño fijo (bloques) simplifica la resignación del espacio.
Disponer
de secciones de tamaño variable o secciones pequeñas de tamaño fijo minimiza la
perdida de espacio no usado provocada por la sobreasignación.
Estos elementos interactuan entre si por lo que se deben considerar en conjunto:
Secciones contiguas variables y grandes:
esta opción ofrecerá un rendimiento mejor. El tamaño variable evitara la
perdida y las tablas de asignación de archivos serán pequeñas. Sin embargo el
espacio es difícil de reutilizar.
Bloques: las secciones fijas y pequeñas
ofrecen una flexibilidad mayor. Se pueden necesitar tablas grandes o
estructuras complejas para su asignación. La contigüidad se abandona, los
bloques se asignan a medida que se necesitan.
Las opciones anteriormente redactadas son compatibles con la asignación previa o con la asignación dinámica. Para la primera se asigna previamente a los archivos un grupo contiguo de bloques. Esto elimina la necesidad de una tabla de asignación de archivos; lo único que se necesita es un puntero al primer bloque y el numero de bloques asignados. En el segundo caso, todas las secciones necesarias son asignadas de una vez. Esto significa que la tabla de asignación del archivo permanecerá con un tamaño fijo.
Con secciones de tamaño variable, hay que preocuparse por la fragmentación del espacio libre, se pueden utilizar las siguientes estrategias:
Primer ajuste (first fit): elegir el
primer grupo de bloques sin usar de tamaño suficiente.
Mejor ajuste (best fit): elegir el
grupo mas pequeño sin usar que tenga de tamaño suficiente.
Ajuste mas cercano (nearest fit):
elegir el grupo sin usar de tamaño suficiente que esta mas cerca al asignado
previamente al archivo para aumentar la cercanía.
Métodos de asignación de
archivos:
Existen tres métodos de asignación: el contiguo, encadenado e indexado.
El contiguo: cuando se crea un archivo
se le asigna un único conjunto contiguo de bloques, esta es un estrategia de
asignación previa que emplea secciones de tamaño variable. La tabla de
asignación de archivos necesita solo una entrada por cada archivo y que muestre
el bloque de comienzo y la longitud del archivo. La asignación contigua es la
mejor para un archivo secuencial.
La asignación contigua presenta algunos problemas, como la fragmentación externa. Lo que hace difícil encontrar bloques contiguos de espacio de tamaño suficiente., lo que lleva a ejecutar un algoritmo de compactación para libera el espacio adicional en el disco.
La asignación encadenada: la asignación se hace con bloques
individuales, cada bloque contendrá un puntero al siguiente bloque de la
cadena. La tabla de asignación de archivos necesita una sola entrada por cada
archivo que muestre el bloque de comienzo y la longitud del mismo, cualquier
bloque puede añadirse a la cadena. No hay que preocuparse por la fragmentación
externa porque solo se necesita un bloque cada vez.
Una consecuencia del encadenamiento es que no hay cabida para el principio de cercanía, si es necesario traer varios bloques de un archivo al mismo tiempo, se necesita una serie de accesos a partes diferentes del disco por lo que se debe ejecutar un algoritmo de compactación para liberar el espacio adicional en el disco.
La
asignación indexada: en esta asignación la tabla de asignación de archivos
contiene un índice separado de un nivel para cada archivo: el índice posee una
entrada para cada sección asignada al archivo. Normalmente, los índices no
están almacenados físicamente como parte de la tabla de asignación de archivos.
Mas exactamente el indice de archivo se guardara en un bloque aparte y la
entrada del archivo en la entrada de asignación apuntara a dicho bloque. La
asignación puede hacerse por bloques de tamaño fijo, O en secciones de tamaño variable.
La asignación por bloques elimina la fragmentación externa, mientras que la
asignación por secciones de tamaño variable mejora la cercanía. En cualquier
caso, los archivos pueden concentrarse en zonas cercanas de cuando en cuando.
La concentración reduce el tamaño del índice en el caso de secciones de tamaño
variable, pero no en el caso de asignación por bloques. La asignación indexada
soporta tanto el acceso secuencial como el acceso directo a los archivos y por
ello se ha convertido en la forma mas popular de asignación de archivos.
Gestión del espacio libre
Se debe
gestionar el espacio que no está asignado a ningún archivo. Para esto es
necesario saber qué bloques están disponibles, entonces hace falta una tabla de
asignación e discos. Se utilizan tres técnicas de uso común: las tablas de
asignación de bits, las secciones libres encadenadas y la indexación.
Tablas de
bits:
Utiliza un
vector que contiene un bit por cada bloque del disco. Cada entrada igual a 0 es
un bloque libre, si es un 1 corresponde a un bloque en uso. Tienen la ventaja de que es fácil encontrar un
bloque libre o un grupo de bloques libres.
La cantidad
de memoria requerida para un mapa de
bits en bloques se puede calcular:
Tamaño
del disco en bytes 8*tamaño
del bloque en el sistema de archivos
Es
recomendable ubicar la tabla de bits en la memoria, aún cuando la tabla de bits
esté en la memoria, una búsqueda exhaustiva de la tabla puede reducir considerablemente
el rendimiento del sistema de archivos. Esto es especialmente cierto cuando el
disco está casi lleno y hay pocos bloques libres. De acuerdo con esto la mayor
parte de los sistemas que utilizan tablas de bits mantiene estructuras de datos
auxiliares que resumen el contenido de subrangos de las tablas de bits. Esta
tabla resumen podría incluir por cada subrango, el número de bloques libres y
el máximo tamaño de números de bloques libres contiguos.
Secciones libres encadenadas:
Pueden encadenarse
juntas mediante un puntero y un valor de longitud en cada sección libre. No
tiene necesidad de una tabla de asignación de disco, sino un puntero al
comienzo de la cadena y la longitud de la primera sección.
Este método
sirve para todas las técnicas de asignación de archivos, si la asignación se
realiza por bloques sólo hay que elegir el bloque libre del principio de la
cadena y retocar el primer puntero o el valor de la longitud. Si la asignación
se hace por secciones de longitud variable, puede usarse el algoritmo el primer
ajuste.
Este método
tiene sus propios problemas, después de un tiempo de uso el disco llegará a
estar fragmentado y muchas secciones serán de un solo bloque. Cada vez que
asigna un bloque es necesario leer
antes el bloque para recuperar el puntero al nuevo primer bloque libre antes de
escribir datos sobre ese bloque,
entonces se ralentizará mucho la creación del archivo.
Indexación:
Trata al
espacio libre como si fuera un archivo y utiliza una tabla índice como la
descrita en la asignación de archivos. Por eficiencia el índice debe trabajar
con secciones de tamaño variables mejor que con bloques. De este modo habrá una
entrada en la tabla para cada sección libre del disco. Este procedimiento
ofrece un soporte eficaz para todos los métodos de asignación de archivos.
Lista de bloques libres:
Cada bloque
tiene asignado un número secuencial y la lista de números de todos los bloques
libres mantenidos en una sección reservada del disco. Considérense los
siguientes puntos:
1- El espacio en disco dedicado a la
lista de bloques libres es menor que el 1% del espacio total del disco. Si se
utiliza un número de bloque de 32 bits, entonces el espacio penalizado es de 4
bytes por cada bloque de 512 bytes.
2- Aunque la lista de bloques libres sea
demasiado grande para almacenar en la
memoria principal, existen dos técnicas efectivas para almacenar una pequeña
parte de la lista en la memoria principal.
a)
La
lista puede traerse como una pila con los primeros miles de elementos de la
pila guardados en la memoria principal. Cuando se asigna un bloque nuevo, se
retira de la cima de la pila, y
b)
cuando
se desasigna uno se lo apila dentro de la pila, solo hay una transferencia
entre el disco y la memoria principal, cuando la sección que está en la memoria
de la pila está llena o vacía.
c)
La
lista puede tratarse como una cola
FIFO, con unas pocas miles entradas entre el principio y el final de la
cola en la memoria. Un bloque se asigna tomando la primera entrada de la cabeza
de la cola y se desasigna añadiéndolo
al final de la cola. Solo existen transferencias entre el disco y la memoria
principal, cuando la sección que en la memoria del principio de la cola está
vacía o la sección en la memoria del final de la cola está llena.
En cada uno
de los puntos anteriores, un hilo puede e segundo plano puede clasificar en la
memoria una lista para facilitar la asignación contigua.
FIABILIDAD:
Considerar:
El usuario A solicita una asignación para añadir datos a un archivo
existente.
La petición se atiende y se actualizan en la memoria principal las
tablas de asignación de disco y archivos, pero aún no en el disco.
El sistema se hunde y a continuación se reinicia.
El usuario B solicita una asignación y se le otorga un espacio en el
disco que se solapa con la última asignación hecha al usuario A.
El usuario A accede a la sección solapada mediante una referencia que
está almacenada en el archivo de A.
Esto sucede
debido a que el sistema por eficiencia el sistema mantiene copias de la tabla
de asignación de disco y de la tabla de asignación de archivos en la memoria
principal. Para evitar esta clase de errores pueden darse los siguientes pasos
cuando se solicite una asignación:
Bloquear en el disco la tabla de asignación de disco. Lo que impedirá a
otro usuario alterar la tabla hasta que la asignación de archivos actual se
complete.
Buscar espacio disponible en la tabla de asignación de disco. Se supone
que mantiene siempre en la memoria principal una copia de la tabla de asignación
de disco. Si no fuese así, primero debe leerse ésta del disco.
Asignar el espacio, actualizar la
tabla de asignación de disco y actualizar el disco. Actualizar el disco implica
volcar de nuevo al disco la tabla de asignación de disco. Con asignación encadenada,
también se necesita actualizar algunos punteros del disco.
Actualizar la tabla de asignación e
archivos y actualizar el disco.
Desbloquear la tabla de asignación
de disco.
Esta
técnica impedirá los errores, pero cuando se asignan pequeñas secciones de
manera frecuente, el impacto en el rendimiento será sustancial. Para reducir
este gasto, puede usarse un esquema de asignación por lotes, en cuyo caso se
obtienen lotes de secciones libres del disco para asignación. Las secciones
correspondientes del disco se marcarán como en uso. La asignación por lotes
puede llevarse a cabo en la memoria principal.
Gestión
de archivos en Unix
Para un
kernel Unix todos los archivos son flujos de bytes, cualquier estructura lógica
interna será especificada por la aplicación, pero sí está contemplada
estructura física de los archivos.
Tipos de archivos
Ordinarios:
contienen información creada por usuarios, aplicaciones o el sistema operativo.
Directorios: son listas de nombres de archivo y punteros a nodos-i asociados.
Están organizados jerárquicamente. Son realmente archivos ordinarios con
privilegio especial de protección para que solo el sistema de archivos pueda
escribir en ellos (programas de usuario tienen permiso de lectura).
Especiales:
se usan para acceder a dispositivos periféricos como impresoras, cada
dispositivo de E/S tiene asociado un archivo especial.
Nombrados: pipes (tuberías) con nombre.
Nodos-i
Todos
los tipos de archivos son administrados por Unix por medio de nodos-i. Éste es
una estructura de control que contiene información (permisos, atributos,
información de control, etc.), de un archivo necesaria para el sistema
operativo.
Puede
asociarse varios nombres de archivo a un mismo nodo-i, pero un nodo-i activo se
puede asociar con un único archivo (cada uno es controlado por un solo nodo-i).
Asignación de Archivos
Los
archivos se asignan en bloques dinámicamente según sea necesario, por ello no
hay asignación previa. Por esto los bloques pueden no ser contiguos, y se usa
un método de indexación para “formar” un archivo: un índice en parte guardado
en el nodo-i, 39 bytes de información de dirección, organizada como 13
direcciones; las primeras 10 direcciones apuntan los primeros 10 bloques de
datos del archivo, si éste es más grande que 10 bloques se usan más niveles de
indexación llamados “indirectos”. A considerar:
El
número total de bloques de un archivo depende de la capacidad de los bloques de
tamaño fijo del sistema. Por ejemplo: en Unix SV la longitud de bloque es de
1KB y cada uno puede guardar 256 direcciones de bloques, por lo tanto el tamaño
máximo de archivo sería cercano a 16 GB.
Ventajas de los nodos-i
Sistema de archivos en Windows 2000
Los diseñadores de Windows 2000 diseñaron un nuevo sistema de archivos, el sistema de archivos de W2K (NTFS), que cumple requisitos de estaciones de trabajo y servidores.
Algunas aplicaciones de alto nivel pueden ser :
Aplicaciones Cliente/ Servidor tales como servidores de archivos, de
procesamiento y de base de datos.
Ingeniería de recursos intensivos y
aplicaciones científicas.
Aplicaciones de redes para grandes
sistemas corporativos.
NTFS es un sistema de archivos potente y flexible construido sobre un modelo de sistema de archivos simple y refinado, estas son sus características mas importantes:
Recuperabilidad: Ante las
caídas del sistema y fallos del disco, NTFS es capas de reconstruir los
volúmenes de disco y devolverlos a un estado consistente.
Seguridad: NTFS utiliza el
modelo de objetos de W2K para imponer la seguridad. Un archivo abierto se
implementa como un objeto archivo con un descriptor de seguridad que define sus
atributos de seguridad.
Discos grandes y archivos grandes:
NTFS soporta discos muy grandes y archivos muy grandes mas eficientemente que
la mayoría de los sistemas de archivos, incluyendo FAT.
Serie de datos múltiples: el
contenido de un archivo se trata como una serie de bytes, en NTFS es posible
definir múltiples series de datos para un solo archivo.
Capacidad de indexación general:
NTFS asocia un conjunto de atributos con cada archivo. El conjunto de
descripciones de archivo en un sistema de gestión de archivos se organiza como
una base de datos relacional, así los archivos de pueden indexar por cualquier
atributo.
NTFS hace uso de los siguientes conceptos de almacenamiento en disco:
Sector: la unidad de
almacenamiento físico mas pequeña sobre el disco. El tamaño de los datos en
bytes es una potencia de 2 y es casi siempre de 512 bytes.
Agrupamiento (cluster): uno o
mas sectores contiguos , siguientes uno al otro en la misma pista. El tamaño
del agrupamiento en sectores es una potencia 2.
64
Volumen: una partición lógica
sobre el disco, que consta de uno o mas agrupamientos y que el sistema de
archivos utiliza para asignar el espacio. En un instante dado, un volumen
consta de la información del sistema de archivos, un conjunto de archivos y
cualquier espacio libre adicional en el resto del volumen que se pueda asignar a los archivos. Un volumen puede ser
todo o una parte de un único disco o
puede extenderse a través de múltiples discos. El tamaño máximo de volumen para
NTFS es de 2
El uso de agrupamientos par asignación hace independiente a NTFS del tamaño del sector físico. Esto permite a NTFS soportar fácilmente discos no estándar que no tienen sectores de 512 bytes, y soportar eficientemente archivos muy grande mediante el uso de tamaño de agrupamiento mas grande. La eficiencia viene del hecho de que el sistema de archivos debe guardar la pista de cada agrupamiento asignado a cada archivo; con agrupamientos mas grandes, hay menos campos para gestionar.
Disposición de un volumen NTFS
Esta disposición esta formado por cuatro regiones.
1) Los primeros sectores de un volumen están ocupados por la partición del sector de arranque (puede tener hasta 16 sectores de longitud) que contiene información acerca de la disposición de un volumen y de las estructuras del sistema de archivos, así como la información y el código de arranque.
2) A continuación esta la “Tabla Maestra de Archivos” (MFT), contiene información acerca de todos los archivos y carpetas de este volumen NTFS, así como la información de espacio disponible.
3) La (MTT), es una lista de todos los contenidos de este volumen NTFS organizada como un conjunto de filas en una estructura de base de datos relacional.
4) Región que contiene los archivos del sistema, normalmente alrededor de 1Mbytes.
(1) MFT2: un espejo de las tres primeras filas de la MFT, utilizado para garantizar el acceso a la MFT en el caso de un fallo de ese sector.
(2) Archivo de registro: una lista de los pasos de transacciones utilizados para la recuperabilidad de NTFS.
(3) Mapa de bits de agrupamiento: es una representación del volumen, mostrando qué agrupamientos están en uso.
(4) Tabla de definición de atributos: define los tipos de atributos soportados en este volumen e indican si se pueden indexar y si se pueden recuperar mediante una operación de recuperación del sistema.
Tabla maestra de archivos:
Está organizada como una tabla de filas de longitud variable, denominados registros. Cada fila describe un archivo o carpeta en este volumen, incluyendo a la propia MFT, que se trata como a otro archivo.
Disposición de un volumen NTFS.
Cada registro en la (MFT) consta de un conjunto de atributos que caracteriza al archivo o carpeta y el contenido del archivo.
Tipos de atributos
Información estándar: atributos de acceso, marcas de tiempo, contador
de enlaces, etc.
Lista de atributos: describe al archivo y la referencia al
registro de la MFT. Se lo utiliza cuando todos los atributos no caven en un
solo registro de la MFT.
Nombre de archivo:
Descriptor de seguridad: quién es el propietario del archivo y
quien puede accederla.
Datos: son el contenido del
archivo.
Raíz de índices: usada para
implementar carpetas.
Asignación de índices: usada
para implementar carpetas.
Volumen de información: información relativa al volumen, versión y nombre.
Mapa de bits: representa a los
registros en uso en la MFT o carpeta.
Recuperabilidad: los elementos clave son los siguientes:
Gestor de Entrada/Salida: Incluye controlador NTFS, que gestiona las funciones básicas, tales
como: Apertura – Cierre – Lectura y Escritura.
Servicio de archivos de registro:
mantiene un registro de escrituras al disco.
Se lo utiliza para recuperar un volumen con formato NTFS en caso de
fallo en el sistema.
Gestor de Caché: responsable de leer y escribir los archivos
situados en la caché. Optimiza la E/S a
disco utilizando técnicas de escritura retardada y confirmación retardada.
Gestor de memoria virtual: accede a la caché de archivos NTFS mediante
la traducción de referencias al archivo a referencias a la memoria virtual, y ,
lecturas y escrituras en la memoria virtual.
La esencia de recuperación, está en el registro. Cada operación que modifica el sistema de archivos se trata como una transacción, se registra en un archivo de registro. Por medio del registro, una transacción parcialmente completada en el momento de la caída del sistema, puede rehacerse o deshacerse mas tarde, cuando se recupere el sistema.
Pasos
a dar para asegurar la recuperabilidad:
NTFS primero lleva al registro del sistema de
archivo para grabar en el archivo de registro de la caché, cualquier
transacción que modifique la estructura del volumen.
NTFS modifica el volumen (en la caché).
El
gestor de caché llama al registro del sistema de archivos para indicarle que
lleve el archivo de registro al disco.
Una
ves que el archivo de registro actualizado está seguro en el disco, el gestor
de caché lleva los cambios del volumen al disco.
Conclusión
Un sistema de gestión de archivos es un sistema que proporciona servicios a
usuarios y aplicaciones para el uso de archivos, conservación de directorios y
control de acceso. Generalmente el sistema de gestión de archivos se contempla
como un servicio del sistema que se sirve a su vez del sistema operativo, más
que como una parte del propio sistema operativo. Sin embargo, al menos una
parte e las funciones de gestión de archivos las realiza el mismo sistema
operativo.
Un archivo es una colección de registros, y la
organización lógica, también física en el disco; en algún punto, de estos
registros está determinada por la forma en la que se accede a ellos
Si un archivo va a ser procesado en su
totalidad, la organización secuencial es la más simple y adecuada.
Si el acceso es secuencial, pero también se
desea el acceso aleatorio al archivo, entonces es útil una organización
secuencial indexada, que podría dar el mejor rendimiento.
Cuando el tipo de acceso es básicamente
aleatorio, sería más apropiado un archivo aleatorio o de dispersión.
Más allá de la estructura es indispensable un
sistema de directorios para una organización jerárquica. Esto es útil para que
los usuarios sigan la pista de los archivos y para que el sistema de gestión de
archivos proporcione a los usuarios un control de acceso junto a otros
servicios.
Los registros no se ajustan al tamaño del
bloque del disco, ni siquiera los de tamaño fijo, entonces se utiliza una
estrategia de agrupación, la cual quedará determinada por un equilibrio entre
la complejidad, el rendimiento y el aprovechamiento del espacio.
Una función clave de cualquier sistema de
gestión de archivos es la gestión del espacio en disco. Una parte de esta
función s la estrategia de asignación de bloques en disco a los archivos, se
han utilizado una amplia variedad de métodos y de estructuras de datos para
guardar constancia de la ubicación de cada archivo. Hay que tener en cuenta que
también debe gestionarse el espacio en disco que no ha sido asignado. Esta
última función consiste en mantener una tabla de asignación de discos que
indique los bloques que están libres.
Bibliografia:
Sistemas Operativos Stallines Cuarta edición
![]()
Número de visitantes actuales disponible desde el 14/07/2002:
Autor: lrmdavid@exa.unne.edu.ar
Ó FACENA - http://exa.unne.edu.ar
Servicios WEB: webmaster@exa.unne.edu.ar