Sistemas Operativos I - Tema 5
Sistemas Operativos I - Tema 5
Sistemas Operativos I - Tema 5
5.1 Archivos
Normalmente, los archivos corresponden a programas y a datos. En general, es una seria de
bits, bytes o registros cuyo significado está definido por su autor y los usuarios.
Los archivos son nombrados y referenciados por su nombre. La forma de hacerlo varía de un
SO a otro. Por regla general son cadenas de caracteres alfanuméricos, aunque también es
normal usar caracteres especiales, como puntos, guiones o blancos.
Además del nombre, los archivos tienen otras propiedades como su tipo, la fecha y hora de su
creación, el nombre o identificador del creador, su longitud y algunos más (conocidos como
atributos).
Dependiendo del uso, los archivos tendrán una determinada estructura. El SO puede tener
conocimiento de estas distintas estructuras lógicas y considerar diferentes tipos de archivos.
Las desventajas de que el SO tenga conocimiento de los tipos de archivos se pueden resumir
en dos:
1) Mayor tamaño del SO, ya que tendrá que tener el código para soportar cada uno de los
tipos de archivos considerados.
2) Se tiene una gran rigidez. Si en algún momento se necesita crear un archivo diferente,
se entraría en conflicto con el SO.
CREATE (Crear)
Se tienen que realizar las siguientes acciones:
Gestión del sistema de archivos |2
OPEN (Abrir)
Se establece un enlace entre el programa y el archivo. Para ello se trasladan los atributos y la
lista de direcciones del archivo a la memoria principal.
SEEK (Buscar)
Se cambia la posición del apuntador para señalar al byte o registro cuya dirección lógica se
suministra en la llamada.
READ (Leer)
Por lo general, la lectura se hace en la posición actual y en la llamada se tiene que especificar
la cantidad de datos necesarios y proporcionar un buffer para su transmisión.
Gestión del sistema de archivos |3
WRITE (Escribir)
La única diferencia importante con READ es que sirve también para ampliar el archivo.
Algunos sistemas tienen una forma restringida de WRITE, con la que sólo pueden añadir datos
al final del archivo (APPEND).
CLOSE (Cerrar)
Cuando un archivo no se va a utilizar, es necesario cerrarlo, de forma que se libere la tabla con
la lista de atributos y direcciones que se mantenía en la memoria principal y que ya no es
necesaria.
Gestión del sistema de archivos |4
DELETE (Borrar)
RENAME (Renombrar)
La opción de renombrar no siempre es necesaria, ya que se puede copiar el archivo con otro
nombre y borrar el original.
COPYFILE (Copiar)
Una mejora se obtiene al considerar un directorio por usuario. Pero los usuarios que tienen
muchos archivos siguen teniendo un gran problema de organización de los mismos. La
solución es permitir una jerarquización total, creando un árbol de directorios.
Los nombres de los caminos pueden ser de dos tipos: completos o relativos.
La mayoría de los SO con estructura de directorios jerárquicos tienen dos entradas especiales
para cada directorio:
1) “.” (punto): es una entrada para el propio directorio (con un puntero a sí mismo)
2) “..” (punto-punto): es una entrada para el directorio padre (el que está por encima en la
jerarquía)
Otro problema es donde y como ubicar los directorios. Como suelen ser muy grandes, el mejor
sitio es el disco.
LINK (Enlazar)
Forma de hacer que un archivo o subdirectorio aparezca en varios directorios. Se crea un
enlace entre el camino de acceso al archivo y el archivo.
UNLINK (Desenlazar)
Operación contraria a LINK.
Gestión del sistema de archivos |6
En la asignación del espacio del disco los tres métodos más usados son:
a) Asignación contigua
b) Mediante listas enlazadas
c) Mediante índices
La cuestión clave es mantener una lista del espacio libre en el disco. Para ello, se usan
principalmente dos métodos:
a) Mapa de bits de bloques libres: Un disco con n bloques, necesitará un mapa de bits de
n bits. No ocupa mucho espacio, y es preferible este método si existe espacio
suficiente en la memoria principal para mantenerlo.
b) Lista enlazada: Manteniendo un puntero al primer bloque libre. No es muy eficiente,
porque para recorrer la lista hay que leer todos los bloques. Una modificación de éste
método es utilizar una lista enlazada de bloques, en la que cada bloque contiene tantos
números de bloques libres como pueda.
Otra cuestión es la elección del tamaño de los bloques para la asignación. Un compromiso
habitual es elegir los bloques de 512 bytes, 1 Kb o 2 Kb.
La asignación contigua de un archivo se define por la dirección del primer bloque y la longitud
del archivo. Si un archivo ocupa n bloques y comienza en el bloque b, ocupará los bloques b,
b+1, … b+n-1.
La dificultad es la asignación de espacio correcto cuando se crea el archivo. Esto se debe a
que se tiene que buscar un hueco de bloques libres en el que se pueda introducir al archivo.
Las soluciones a esto son los algoritmos de primero en ajustarse o mejor en ajustarse.
Este método tiene buen rendimiento cuando se quiere leer un archivo completo. Pero también
tiene grandes inconvenientes: no es realizable salvo que se conozca el tamaño máximo del
archivo en el momento de su creación. El problema es grave en muchas aplicaciones en las
que los archivos crecen dinámicamente. El segundo problema es la fragmentación resultante
en el disco. La solución es la compactación, pero es una operación costosa.
Se mantienen los archivos como una lista enlazada de bloques en el disco. Las entradas en el
directorio sólo tienen que guardar un puntero al primer bloque del disco asignado al archivo.
Escribir en el archivo supone coger uno de los bloques libres y añadirlo al final de la lista. Esta
técnica no causa fragmentación externa. El problema principal es el acceso aleatorio a un
archivo que es extremadamente lento.
Una alternativa a las listas enlazadas es colocar los índices a los bloques de los archivos en
una tabla de índices. El directorio contiene la dirección del bloque donde están los índices a los
bloques de datos del archivo. Todo el bloque está disponible para los datos y se soporta con la
misma eficacia el acceso aleatorio y el secuencial. Aunque presenta pérdida de espacio, hay
una solución, utilizar sistemas de indexación de varios niveles.
Gestión del sistema de archivos |7
Un sistema de archivos tiene dos problemas de diseño. Por una parte hay que definir cómo
verá el usuario al sistema de archivos. Y se tienen que crear los algoritmos y las estructuras de
datos que relacionan al sistema de archivos lógicos con el dispositivo físico de
almacenamiento.
Por otra parte, el sistema de archivos se puede considerar compuesto por varios niveles:
- El nivel más bajo consiste en los dispositivos físicos de control de las transferencias de
información entre la memoria y el disco
- El siguiente nivel es el sistema básico de archivos, que usa las características del nivel
anterior para leer y escribir bloques al y desde el disco.
- La indicación de os bloques que tiene que leer o escribir el sistema básico de archivos lo
hace un módulo de organización de archivos.
- La estructura de directorios la conoce el sistema de archivos lógicos. Los directorios se
pueden tratar como archivos de forma que el módulo de organización de éstos puede leer
y escribir los directorios.
- Por último se tendrían los programas de aplicaciones.
Mediante enlaces simbólicos. Se crea un nuevo archivo que contiene solamente la ruta de
acceso al archivo al que se quiere enlazar. Sólo el propietario verdadero del archivo tiene un
apuntador al nodo-i. Los usuarios enlazados al archivo tienen nombres de rutas de acceso y no
apuntadores al nodo-i. Cuando el propietario elimina el archivo este se destruye, y los
posteriores intentos de otros usuarios de acceder a él fracasarán. El inconveniente de los
enlaces simbólicos es su alto coste.
Uno de los algoritmos más comunes para la administración de la caché es verificar todas las
solicitudes de lectura/escritura para saber si el bloque solicitado se encuentra en la caché.
Cuando se tiene que cargar un bloque en una caché totalmente ocupada se pueden utilizar
algoritmos tipo FIFO, LRU, etc.
Una de las dificultades de uso de las cachés surge en las peticiones de escritura al disco, ya
que se si la escritura se hace en la caché y posteriormente se hace realmente en el disco, se
pueden presentar situaciones de inconsistencia o corrupción de archivos si entre ambas
escrituras se produce un fallo del sistema. En Unix se vacía la caché a intervalos periódicos
mediante una llamada al sistema (sync), que obliga a todos los bloques modificados a
actualizarse en el disco.
Otra técnica es la utilización de cachés de escritura directa, en este caso los bloques
modificados se escriben inmediatamente en el disco. Con esta solución disminuye el
rendimiento.
Gestión del sistema de archivos |8
El uso de la caché supone una gestión más compleja en el acceso a los archivos de los discos
y presenta además el peligro potencial de las inconsistencias o corrupciones indicadas, pero
estos inconvenientes quedan compensados por sus ventajas, entre las que se encuentran:
a) Mejora del tiempo efectivo de acceso al disco y del tiempo de respuesta de las
aplicaciones
b) Eliminación de algunos accesos al disco, puesto que mientras los bloques están en la
caché pueden ser leídos y escritos varias veces antes de actualizarse en el disco.
c) En la utilización de discos compartidos en red supone una gran reducción de la carga
en el servidor de archivos y en la res, ya que los archivos de los discos compartidos
pueden ser capturados en caché.
Los problemas del sistema de archivos pueden venir por el uso de bloques del disco que están
en mal estado. Se puede solventar conociendo cuales son los bloques defectuosos.
Las inconsistencias en el SO pueden ocurrir por otras causas: si el sistema falla en la mitad de
una operación de lectura, modificación y escritura de un bloque…
Suele haber utilidades del SO que las detectan y, si nos extremadamente graves, las pueden
corregir.
La forma más fácil de realizar copias de seguridad es haciendo volcados periódicos de todo el
sistema de archivos. Otra forma es mediante los volcados incrementales. Sólo se transfieren
aquellos archivos que han sido modificados desde la última vez que se hizo un volcado de
seguridad. La principal desventaja de los volcados incrementales es la cantidad de datos que
se generan y la complejidad del procedimiento de restauración.
1) El diseño del sistema debe ser público. Los algoritmos pueden ser conocidos, pero las
claves deben ser secretas.
2) El estado predefinido es el de no acceso. Los derechos de acceso deben ser
adquiridos sólo con permiso explícito.
3) Verificar la autorización actual. Cada petición de acceso a un objeto debe conllevar la
comprobación de la autorización.
4) Mínimos privilegios. Cada proceso debe utilizar el mínimo grupo de de privilegios para
completar su tarea.
5) Mecanismo simples e integrados. Un diseño tan sencillo como sea posible facilita la
verificación y corrección de las implementaciones.
6) Psicológicamente aceptable. Debe ser fácil de usar de forma que sea aplicado
correctamente y no sea rechazado por los usuarios.
Para que un usuario acceda al sistema, debe ser validado por el mismo. La validación se basa
en:
1) Posesión de un secreto (contraseña).
2) Posesión de un artefacto (tarjetas magnéticas, llaves…).
3) Uso de alguna característica fisiológica o de comportamiento del usuario (huellas
dactilares, patrones de voz…).
Un proceso sólo debe poder acceder a aquellos recursos para los cuales está autorizado y que
necesita en ese momento para completar su tarea (principio de la necesidad de saber).
Cada proceso trabaja dentro de un dominio, el cual especifica los recursos a los cuales puede
tener acceso. Cada dominio define un conjunto de objetos y las operaciones que se les pueden
aplicar.
Las relaciones entre dominios y objetos se pueden representar con una matriz (matriz de
acceso). Las filas de la matriz representan dominios y las columnas objetos.
El problema es como realizar de forma eficaz la matriz.
Generalmente es una matriz dispersa, con muchos huecos vacíos. Por ello, una forma sencilla
de realizarla es mediante una tabla global, consistente en tripletas ordenadas (dominio, objeto,
derechos). Lo malo es que la tabla suele ser grande y no se puede conservar en memoria
principal, por lo que requiere operaciones de E/S. Hay dos métodos prácticos, almacenar la
matriz por columnas (lista de accesos) o por filas (lista de capacidades).
G e s t i ó n d e l s i s t e m a d e a r c h i v o s | 10
A cada objeto se le asocia una lista ordenada con todos los dominios que pueden tener acceso
al objeto y la forma de dicho acceso.
El principal inconveniente es el retardo que se provoca con la búsqueda para verificar la
autoridad de un sujeto para acceder al objeto solicitado. Para evitar búsquedas largas, algunos
sistemas dividen a los usuarios en grupos y sólo almacenan los derechos de acceso de los
grupos.
A cada dominio se le asocia una lista de objetos a los cuales puede tener acceso, junto con
una indicación de las operaciones permitidas sobre cada objeto.
Las capacidades se propusieron como un tipo de apuntador seguro para satisfacer la
necesidad de protección de recursos en los sistemas multiprogramados.
Nunca se permite que una capacidad se mueva al espacio de direcciones accesibles por un
proceso de un usuario. Manteniendo las capacidades seguras, los objetos a los que protegen
también están seguros frente a un acceso no autorizado.
Uno de los inconvenientes es la revocación de acceso a un objeto, ya que el sistema tiene que
determinar todas las capacidades existentes para cierto objeto y eliminarlas. La forma de
invalidar la capacidad es romper el enlace entre el objeto indirecto y el real.