La Tabla de inodos, es una copia en memoria de la lista de inodos que hay en el disco, a la que se le añade información adicional. Esta tabla se copia en disco para conseguir un acceso más rápido
La Tabla de archivos, es una estructura global del kernel y en ella hay una entrada por cada archivo distinto que los procesos del kernel o los procesos del usuario tienen abiertos. La tabla de archivos es una estructura de datos orientadas a objetos. Cada vez que un proceso abre o crea un archivo nuevo, se reserva una nueva entrada en la tabla. Cada entrada de la tabla contiene un bloque de datos y un array de punteros a funciones que traducen las operaciones genéricas que se pueden realizar con los archivos (leer, escribir, cerrar, posicionar, ...) en acciones concretas asociadas a cada tipo de archivo. Las operaciones que se deben implementar para cada tipo son:
- Funciones para leer (read) y escribir (write) en un archivo.
- Una función para realizar la multiplexación síncrona de la entrada salida (select).
- Una función para controlar los modos de entrada/salida (ioctl).
- Una función para cerrar un archivo (close).
Se puede observar que no hay ninguna rutina de apertura de archivos en esta definición de objeto. Esto es debido a que el sistema sólo empieza a tratar a los elementos de esta tabla como objetos a
partir de que se haya abierto el archivo. Cada entrada de la tabla de archivos tiene también un puntero a una estructura de datos que contiene información del estado actual del archivo. Entre
otros, se deben tener en cuenta los siguientes campos:
- inode asociado a la entrada de la tabla.
- offsets de lectura y escritura que indican sobre qué byte del archivo van a tener efecto las siguientes operaciones de lectura o escritura. Estos offsets quedan actualizados cada vez que se realiza una de las operaciones anteriores.
- Permisos de acceso para el proceso que ha abierto el archivo.
- flags del nodo de apertura del archivo, que se verificarán cada vez que se realice una operación sobre el mismo para ver si es congruente. Por ejemplo, si un archivo se abre para leer solamente, el kernel no va a permitir que se realicen operaciones de escritura sobre él.
- Un contador para indicar cuántas entradas de la tabla de descriptores de archivos tiene asociadas esta entrada de la tabla de archivos.
La Tabla de descriptores de archivos es una estructura local a cada proceso. Esta tabla identifica todos los archivos abiertos por un proceso. Cuando utilizamos las llamadas open, creat, dup o link, el kernel devuelve un descriptor de archivo, que es un índice para poder acceder a las entradas de latabla anterior (tabla de archivos). En cada una de la s entradas de la tabla hay un puntero a una entrada de la tabla de archivos del sistema.
Los procesos no van a manipular directamente ninguna de las tablas anteriores (esto lo hace el
kernel), sino que van a acceder a los archivos manipulando su descriptor asociado, que es un número. Cuando un proceso invoca una llamada para realizar una operación sobre un archivo, le va a pasar al kernel el descriptor de ese archivo. El kernel va a usar este número para acceder a la tabla de descriptores de archivos del proceso y buscar en ella cuál es la entrada de la tabla de archivos que le da acceso a su inodo (inode). Este mecanismo puede parecer artificioso, pero va a ofrecer una gran flexibilidad cuando queramos que un proceso acceda simultáneamente a un mismo archivo en modos distintos, o que varios procesos compartan archivos.
El tamaño de la tabla de descriptores de archivos tiene un valor limitado para cada proceso. Este valor depende de la configuración del sistema (limits, constante OPEN_MAX), aunque está bastante extendido que sea 20. Así, un proceso no puede tener abiertos más de 20 archivos distintos en un instante de tiempo determinado. Si algún proceso necesita manipular más de 20 archivos, hemos de tener presente que algunos deberán estar cerrados para poder manipular otros, ya que todos no pueden estar abiertos simultáneamente. Una situación semejante a ésta se plantea cuando intentamos compilar un proyecto y consta de más de 20 archivos distribuidos entre archivos de cabecera, archivos fuentes, archivos objeto y librerías. Aunque el compilador debe de poder generar el archivo ejecutable sin imponer límite al número de archivos de nuestro proyecto.
Cuando se arranca un proceso en UNIX, el sistema abre para él, por defecto, tres archivos que van a ocupar las tres primeras entradas de la tabla de descriptores de archivos. Estos archivos seconocen como archivo estándar de entrada (stdin), que tiene asociado el descriptor número 0; el archivo estándar de salida (stdout), que tiene asociado el descriptor número 1; y el archivo estándar de errores (stderr), que tiene asociado el descriptor número 2.
No hay comentarios:
Publicar un comentario