• No se han encontrado resultados

Estructura del directorio

In document Conceptos de Sistemas Operativos (página 147-156)

El sistema de archivo de las computadoras puede ser extenso. Algunos sistemas almacenan miles de archivos sobre cientos de gigabytes de disco. Para administrar estos datos se los necesita tener organizados. Esta organización se hace en dos partes. Primero, el sistema de archivos se divide en

Acceso secuencial Implementación para acceso directo.

reset cp := 0;

read next cp := cp + 1; read cp;

write next write cp;

cp := cp + 1;

Figura 10.4 Simulación de un acceso secuencial en un archivo de acceso directo.

particiones. Típicamente, cada disco contiene al menos una partición, el cual es una estructura de bajo nivel en el cual residen los archivos y los directorios.

Segundo, cada partición contiene información sobre los archivos que contiene. Esta información es mantenida en entradas en un dispositivo de directorio o directorio. El directorio almacena información (tal como nombre, lugar, tamaño y tipo) para todos los archivos en la partición. En la figura 10.6 se ve la organización típica de un sistema de archivo.

El directorio se puede ver como una tabla de símbolos que traduce nombres de archivos en su respectiva entrada del directorio. El directorio se puede organizar de diferentes maneras. Se debe ser capaz de insertar una entrada, eliminar una entrada, buscar una entrada, y listar todas las entradas del directorio. En esta parte se examinaran varios esquemas para definir la estructura lógica del sistema de directorio. Cuando se quiere definir una estructura de directorio particular se deben tener en cuenta las operaciones que se le aplicaran al directorio:

Buscar un archivo: Se debe escoger una estructura de directorio que sea capaz de encontrar la

entrada en el directorio de un archivo particular. Ya que los archivos tienen nombres simbólicos y similares nombres pueden indicar relaciones entre archivos, se debe ser capaz de encontrar todos los archivos cuyo nombre coincida con un string en particular.

Crear un archivo: se debe ser capaz de crear y agregar nuevos archivos en el directorio.

Eliminar un archivo: cuando un archivo ya no se necesita más, se debe eliminar del directorio.

Listar un directorio: se debe ser capaz de listar todos los archivos en un directorio, y los contenidos

de la entrada del directorio para un archivo dado.

Renombrar un archivo: ya que el nombre del archivo representa para el usuario el contenido del

archivo, se debe ser capaz de cambiarles el nombre en caso de que su contenido varíe o su uso varíe. Esta función también debe permitir cambiar un archivo de posición en el sistema de directorio.

Recorrer el sistema de archivo: se debe tener la posibilidad de recorrer y acceder a cada

directorio, y a cada archivo en la estructura de directorio. Por confiabilidad, es buena idea almacenar los contenidos y la estructura completa del sistema de archivos a intervalos regulares. Esto consiste de copiar todos los archivos en cintas magnéticas. Esta técnica provee una copia de seguridad en caso de que el sistema falle o de que el archivo no se use más. En este caso el archivo puede ser copiado en la cinta y liberar el lugar que ocupaba en el disco para que su lugar sea reusado. Directorio de único nivel: La estructura más simple de directorio es la de un solo nivel. Todos los archivos se encuentran en el mismo directorio (Figura 10.7). Este tipo de estructura tiene significantes limitaciones cuando el número de archivos es grande o cuando existe más que un usuario. Ya que todos los archivos están en el mismo directorio, los nombres de todos los archivos deben ser distintos.

directorio archivos directorio archivos directorio archivos Disco 1 Partición A Partición B Partición C Disco 2 Disco 3

Figura 10.6 Una típica organización de un sistema de archivos.

cat bo a test data mail cont hex records directorio

archivos

Directorio de dos niveles: la mayor desventaja de una estructura de único nivel es que todos los archivos deben tener diferentes nombres para los diferentes usuarios. La solución es crear un directorio para cada usuario. En una estructura de dos niveles cada usuario tiene su directorio (UFD: user file directory). El UFD tiene una estructura similar pero lista solo los archivos de un único usuario. Cuando un usuario comienza a trabajar se busca en el directorio maestro del sistema (MFD: Master File Directory) su UFD, es decir, cada entrada en el MFD apunta a un UFD de algún usuario, y cada entrada del UFD apunta a los archivos (Figura 10.8).

Cuando un usuario se refiere a un archivo en particular, solo se busca en su UFD. Así, diferentes usuarios pueden tener archivos con el mismo nombre, pero los archivos en un UFD deben tener nombres únicos. Para crear un archivo para un usuario, el sistema operativo busca en el UFD del usuario para ver si ya existe un archivo con ese nombre. De la misma manera, al eliminar un archivo el sistema operativo se limita a buscar sólo en el UFD del usuario. De esta manera no se eliminara accidentalmente un archivo de otro usuario. Este tipo de estructura si bien resuelve el problema de archivos con nombres iguales para dos usuarios distintos, aun tiene problemas. Esta estructura aísla un usuario de otro, el cual es una ventaja cuando ,los usuarios son totalmente independientes, pero es una desventaja cuando usuarios quieren cooperar en una misma tarea y acceder a archivos entre sí.

Algunos sistemas no permiten que un usuario acceda a los archivos de otro. Si tales accesos son permitidos, un usuario debe poder nombrar un archivo del directorio de otro usuario. Para nombrar un archivo particular en una estructura de dos niveles únicamente se puede lograr dando tanto el nombre del usuario y el nombre del archivo. Así, el directorio de dos niveles se puede ver como un árbol. La raíz es el Master File Directory. Sus descendientes directos son los UFDs. Los descendientes de los UFDs son los archivos. Los archivos son las hojas del árbol. Especificando el nombre del usuario y el nombre del archivo se define un camino en el árbol desde la raíz (MFD) a la hoja (el archivo especificado). Cada archivo en el sistema tiene un camino único.

Un caso especial de esta situación ocurre con respecto a los archivos del sistema. Estos archivos son una parte del sistema (cargadores, asemblers, compiladores, librerías, etc.). Cuando se le da al sistema operativo el comando apropiado, estos archivos son leídos por el cargador y ejecutados. Muchos interpretes de comando actúan simplemente tratando al comando como el nombre de un archivo para cargar y ejecutar. Como se definió hasta ahora el sistema de directorio, este archivo podría ser buscado en el directorio del usuario actual. Una solución podría ser copiar los archivos del sistema en el directorio de cada usuario. Sin embargo, copiar todos los archivos del sistema podría provocar un gasto tremendo de lugar (si los archivos del sistema requieren 5 megabytes, entonces para soportar 12 usuarios requerirá 60 megabytes sólo para las copias de los archivos del sistema).

La solución estándar es la de usar un directorio de usuario especial que contiene los archivos del sistema (por ejemplo, user 0). Cuando se da el nombre de un archivo para ser cargado, el sistema operativo primero lo busca en el directorio del usuario actual. Si lo encuentra, lo usa. En caso contrario, el sistema automáticamente lo busca en el directorio de éste usuario especial que contiene los archivos del sistema. La secuencia de directorios buscados cuando se nombra un archivo es llamado camino de búsqueda (search path). Este método es le más usado en sistemas UNIX y MS-DOS.

Master File Directory

cat bo a test data x

User 1 User 2 User 3 User 4

a a test data a

User File Directory

Directorios estructurados como árboles: la organización natural es la de extender la estructura de directorio a un árbol de altura arbitraria (Figura 10.9). Esta generalización permite a los usuarios crear sus propios sub-directorios y organizar sus archivos acordemente. Por ejemplo, el sistema MS-DOS es estructurado como un árbol. De hecho, un árbol es la estructura más común para un directorio. Cada archivo en el sistema tiene un nombre de camino único. Un nombre del camino es desde la raíz, pasando por todos los subdirectorio hasta le archivo específico.

Un directorio (o subdirectorio) contiene un conjunto de archivos o subdirectorios. Un directorio es simplemente otro archivo, pero es tratado de una manera especial. Todos los directorios en el sistema tienen el mismo formato interno. Un bit en cada entrada del directorio define la entrada como un archivo (0) o como un subdirectorio (1). Llamadas al sistema especiales se usan para crear y eliminar directorios. Cuando se hace una referencia a un archivo, se lo busca en el directorio actual. En caso de que se necesite un archivo que no esta en el directorio actual, entonces el usuario debe especificar el camino o cambiar el actual directorio y ubicarse en el directorio que esta el archivo. Al hacer este cambio de directorio actual, se provee una llamada al sistema (change directory) que toma como parámetro el nombre de un directorio y lo usa para redefinir el directorio actual.

Los nombres de los caminos pueden ser de dos tipos: caminos absolutos o caminos relativos. Un nombre de camino absoluto comienza de la raíz y continúa el camino hasta el nombre del archivo, dando los nombres de los directorios en el camino. Un nombre de camino relativo define un camino desde el directorio actual. Por ejemplo, en el directorio que se vio en la figura anterior, si el actual directorio es root/spell/mail, entonces el nombre de camino relativo prt/first se refiere al mismo archivo que el nombre de camino absoluto root/spell/mail/prt/first.

Una política de decisión importante es como manejar la eliminación de directorios. Si un directorio esta vació, entonces simplemente se puede eliminar su entrada en el directorio que lo contiene. Sin embargo, supongamos que el directorio a eliminar no esta vació (contiene varios archivos o subdirectorios). Entonces se pueden tomar dos caminos: Algunos sistemas tales como MS-DOS no eliminan el directorio a menos que este vació. Si hay varios subdirectorios, entonces el procedimiento de borrado debe ser hecho recursivamente sobre éstos. Un camino alternativo, tal como el que toma UNIX por medio del comando rm, provee la opción que, cuando se hace un pedido de eliminar un directorio, todos los archivos y subdirectorios que había en el directorio a eliminar también son eliminados. Esta política es más fácil de usar (ya que si tengo que eliminar muchos subdirectorios me los elimina todos de una vez), pero es peligrosa ya que puede que elimine archivos o subdirectorios que no quería eliminar.

stat mail dist

exp

count p

prog copy prt

spell bin program s

find hex recorder e mail

list obj spell all last first

reorder list find hex count

En este tipo de estructuras de directorios, un usuario no solo puede acceder a sus archivos, sino también a los archivos de otro usuario, simplemente especificando el camino.

Note que el camino a un archivo en una estructura de directorio tipo árbol puede ser mucho más grande de dos niveles. Para permitir a los usuarios acceder a programas sin tener que recordar estos largos caminos, el sistema operativo Macintosh automatiza la búsqueda de archivos ejecutables. Lo que hace es mantener un archivo llamado “Desktop File”, conteniendo el nombre y la ubicación de todos los programas ejecutables. Cuando se agrega un nuevo disco duro o disco blando al sistema, o se accede a la red, el sistema operativo recorre la estructura de directorio buscando por programas ejecutables en el dispositivo y graba dicha información. Este mecanismo soporta la ejecución por medio de hacer un doble clic en un archivo, causando que se lea el atributo de su creador, y se busque en el “Desktop File” para una coincidencia. Una vez que se produce la coincidencia, el programa ejecutable apropiado se inicia teniendo como entrada el archivo al que se le hizo el doble clic.

Directorios de grafos acíclicos: consideremos dos programadores que están trabajando en un proyecto. Los archivos asociados con este proyecto pueden ser almacenados en un subdirectorio, separándolos de los archivos y proyectos de los dos programadores. Pero ya que ambos programadores son igualmente responsables por el proyecto, ambos querrán que este directorio que contiene el proyecto este en su directorio. Entonces el subdirectorio en común podría ser compartido. Un archivo o directorio compartido existirá en el sistema de archivos en dos (o más) lugares a la vez. Note que un archivo (o directorio) compartido no es lo mismo que existan dos copias del mismo archivo en el sistema. Por medio de compartir archivos, solo existe una sola copia del archivo en el sistema, por lo que los cambios que una persona haga sobre el mismo aparecerán automáticamente en la vista que la otra persona tiene del archivo. Esta forma de compartir es muy importante en compartir subdirectorios: si una persona agrega un archivo en un subdirectorio compartido, el mismo aparecerá automáticamente en la vista que el otro (u otros) usuario tiene del subdirectorio.

Una estructura de árbol prohíbe compartir archivos o directorios. Un grafo acíclico permite que los directorios compartan archivos o subdirectorios (Figura 10.10).

En una situación donde varias personas están trabajando como un equipo, todos los archivos que son compartidos pueden ser ubicados todos juntos en un directorio. Aun si existe solo un usuario, puede existir la situación donde se quiere que un mismo archivo aparezca en varios subdirectorios. Por ejemplo, un programa escrito para un proyecto en particular podría estar tanto en el directorio de todos los programas y en el directorio de los proyectos.

La forma de compartir directorios o proyectos se puede implementar de diferentes maneras. Una forma común, usada por muchos sistemas UNIX, es crear una nueva entrada de directorio llamada un link, el cual es un puntero a otro archivo o subdirectorio. Por ejemplo, un enlace puede ser implementado como un nombre de camino relativo u absoluto. Cuando se hace una referencia a un archivo, se busca en el directorio. Si la entrada en el directorio para este archivo esta marcada como un enlace (link), se devuelve

spell

list all w count count words list

list rade w7 dict

root

el nombre del archivo (o directorio) real. El enlace se implementa por medio de la copia del camino real (a los enlaces también se los denomina punteros indirectos).

La otra forma de implementar la compartición de archivos es simplemente duplicar toda la información en los subdirectorios compartidos. Así, ambas entradas son idénticas. En la forma de enlace, el enlace es claramente diferente de la entrada original (el enlace apunta a la entrada original), por lo que la entrada del enlace y la original no son iguales. En la forma de duplicar la información la entrada de la copia y del original son indistinguibles. El mayor problema con entradas de directorio duplicadas es mantener la consistencia en caso de que el archivo sea modificado.

Un problema con este tipo de estructuras involucra el recorrido. Ya que un archivo puede tener múltiples nombres de caminos absolutos, distintos nombres de archivos se pueden referir al mismo archivo. Si se trata de recorrer el sistema de archivos completo (para encontrar un archivo, o por motivos estadísticos, o para copiar todos los archivos en un backup), puede que recorramos estructuras de directorio compartidas más de una vez.

Otro problema con este tipo de estructuras involucra a la eliminación de archivos (o directorios), ya que en caso de que eliminemos un archivo que es compartido, puede que queden punteros apuntando a nada, y si además el espacio liberado es ocupado por otro archivo, ahora el puntero estará apuntando a un lugar incorrecto.

En un sistema donde se maneja la compartición de archivos por medio de enlaces simbólicos, esta situación es fácil de manejar. La eliminación de un enlace no necesita afectar el archivo original, solo se elimina el enlace. Si la entrada del archivo es la que se elimina, se libera el espacio de que ocupaba el archivo, pero los enlaces que apuntaban a este archivo se dejan pendientes. Se podría hacer una búsqueda de estos enlaces y eliminarlos, pero, a menos que se tenga una lista de enlaces asociados al archivo, ésta búsqueda puede ser muy costosa. Otra idea seria la de dejar el enlace pendiente hasta que se produzca un intento de usar el enlace. En ese momento, se determinara que el archivo asociado con dicho enlace no existe, y se tratara el acceso como cualquier intento de acceso ilegal. En este punto, se debe tener cuidado si el lugar fue reemplazo por otro archivo antes de que se haga referencia al enlace simbólico. En el caso de UNIX, se deja los enlaces cuando se elimina el archivo hasta que el usuario vea que el archivo ya no existe o que ha sido reemplazado.

Otra forma de eliminar es la de preservar el archivo hasta que todas las referencias al mismo sean eliminadas. Para implementarla, se debe tener algún mecanismo para determinar cuando se ha eliminado la ultima referencia al archivo. Se podría mantener una lista de todas las referencias al archivo (ya sean entradas de directorio o enlaces simbólicos). Cuando se establece un enlace o una copia de la entrada del directorio, una nueva entrada se agrega a la lista de referencias del archivo. Cuando se elimina en enlace o una entrada de directorio, se elimina ésta entrada de la lista. El archivo se elimina cuando su lista de referencias esta vacía. El problema con esta implementación es el tamaño que puede llegar a tomar esta lista. Sin embargo, no se necesita tener una lista completa, sino que solo se debe mantener un número con la cantidad de referencias que tiene el archivo. Así, cuando la cantidad llegue a cero se elimina el archivo. El sistema operativo UNIX usa esta implementación para enlaces no simbólicos, manteniendo un contador de referencia en el bloque de información del archivo (o inode). Para evitar que el grafo pierda la propiedad de acíclico lo que se hace es prohibir que un directorio tenga más que una referencia, es decir, solo puede tener la referencia de su padre y nada más.

Para evitar el problema relacionado con la eliminación de archivos compartidos y los relacionados con la manutención de aciclicidad del grafo, el sistema operativo MS-DOS tiene una estructura de directorio de árbol, en vez de un grafo acíclico.

Directorio de grafo general: el problema serio en el uso de una estructura de grafo es el de mantener la propiedad de acíclico. En una estructura de árbol no existe problema de ciclos, pero cuando el sistema soporta enlaces, la estructura pasa a ser ya no la de un árbol sino la de un grafo.

La principal ventaja de un grafo acíclico es la simplicidad de los algoritmos para recorrer el grafo y para determinar cuando no existen más referencias a un archivo. Lo que se desea es evitar recorrer secciones compartidas de un grafo acíclico dos veces, principalmente por razones de performance. Si ya hemos

In document Conceptos de Sistemas Operativos (página 147-156)