Next: Sistema de ficheros Up: No Title Previous: No Title

# Sistema de ficheros distribuido

Un laboratorio tiene una serie de máquinas interconectadas entre sí y cada una de ellas con un disco. Los responsables de dicho laboratorio quieren desarrollar un sistema de ficheros distribuido de tal forma que el espacio virtual para cada máquina sea la suma de las capacidades de todos los discos.

Cada fichero del sistema tendrá un nombre global (del tipo `T_Nombre_Global`) que se corresponde con un fichero físico en el sistema de ficheros local de una máquina determinada (cuyo nombre será del tipo `T_Nombre_Local`). Para que la instalación del nuevo sistema sea completamente transparente se pretende conservar el interfaz de acceso a los ficheros:

- `LeerFichero(nombre:T_Nombre_Global; VAR b:T_Buffer)`

- `GrabarFichero(nombre:T_Nombre_Global; b:T_Buffer)`

Se puede suponer que todo el fichero se lee o graba completo cada vez.

Para desarrollar el sistema se dispone en cada máquina de las siguientes operaciones para acceder al disco local:

- `DISCO.Leer(nombre:T_Nombre_Local; VAR b:T_Buffer)`

- `DISCO.Grabar(nombre:T_Nombre_Local; b:T_Buffer)`

Es necesario tener en cuenta que la ejecución simultánea de dos o más de estas operaciones no se debe permitir (es decir, es necesario asegurar exclusión mutua en el acceso al disco local u ofrecer dicho acceso a través de un único proceso).

En cada máquina se dispone de una tabla de correspondencias entre nombre globales de ficheros (`ng`) y la máquina (`m`) y el nombre local equivalente (`nl`). Dicha tabla se mantiene automáticamente (no nos preocupa) y se accede a través de la siguiente operación:

- `TABLA.Correspondencia(ng:T_Nombre_Global; VAR m:CARDINAL; VAR nl:T_Nombre_Local)`

Además, existen primitivas de comunicación entre procesos en diferentes máquinas:

- `TomarPuerto(p : T_Puerto)`

- `Enviar(p:T_Puerto; m:CARDINAL; mensaje:ANY)`

- `Recibir(p:T_Puerto; VAR dato:ANY)`

Cuya semántica es la del paso de mensajes síncrono con canales de comunicación (`T_Puerto`) N a 1 (el comportamiento es idéntico al visto en Cc-Modula pero sin primitiva `SELECT`).

Se pide:

> Implementar las operaciones `LeerFichero` y `GrabarFichero` y desarrollar el conjunto de procesos y la comunicación (mediante paso de mensajes o monitores) que deben ejecutarse en una máquina (idénticos en todas las demás) para tener el sistema de ficheros distribuido.

Notas y restricciones:

- Las operaciones `LeerFichero` y `GrabarFichero` ejecutadas en una máquina no deben interferir con las ejecutadas en otra salvo que el acceso sea sobre el mismo disco.

- Es admisible que el sistema de ficheros distribuido se comporte como uno local, es decir, no importa que se impida que dos procesos de una máquina ejecuten a la vez una operación (`LeerFichero` o `GrabarFichero`), incluso sobre discos diferentes.

- Este problema no corresponde al esquema de lectores-escritores.

- No es necesario establecer prioridades.

- Los procesos en distintas máquinas sólo pueden comunicarse con las primitivas `Enviar` y `Recibir`.

- En el envío y recepción de mensajes (tanto en las primitivas `Enviar` y `Recibir` como en las propias de Cc-Modula) se permiten tuplas en los mensajes para simular registros. Ej. `Enviar(2,i,(LECT,f,j))` que envia un mensaje al puerto 2 de la maquina i y el mensaje consiste en una tupla (simulando un registro sin necesidad de definirlo) que podría indicar operación de lectura (`LECT`), de un fichero (`f`) desde una máquina (`j`).

- Sistema de ficheros distribuido (SOLUCIÓN)

Next: Sistema de ficheros Up: No Title Previous: No Title