Monitor

Esta práctica plantea el desarrollo de un módulo que exporte información de las estructuras de datos internas de Linux, de manera que pueda facilitar una mejor comprensión de cómo es su modo de operación interno. Concretamente, se va a exportar información relacionada con los ficheros que utilizan los procesos, por tratarse de uno de los aspectos más ilustrativos.

En primer lugar, se especifica qué información del sistema debe exportar el módulo, para, a continuación, explicar cuál debe ser el modo de operación del módulo.

Información exportada por el módulo monitor

  • Será la correspondiente al camino que va desde cada descriptor de fichero abierto por el proceso hasta el inodo que lo representa. En los sistemas operativos de la familia UNIX se usan las siguientes estructuras de datos para almacenar la información de los ficheros abiertos: Linux tiene una estructura similar pero con algunas diferencias. A continuación, se revisa brevemente estas estructuras de datos en Linux especificando el nombre de los campos involucrados: Para facilitar la legibilidad por parte de los usaurios y siguiendo el modelo usado en numerosas entradas del proc, el módulo exportará la información en modo texto y orientada a líneas. La información exportada por el monitor debería ser similar a la siguiente:
    Tabla de ficheros abiertos PID 6647: dir f7d18180 | n_refs 1
    
    + Descriptor 0 -> Dir. entrada filp ea2f3980
    ++ Entrada filp -> n_refs 10 | offset  0 | (RD 1 WR 1) | dir. dentry f6407b58
    +++ Dentry -> n_refs 2 | nombre 6 | dir inodo f4fe92f0
    ++++ Inodo -> nº inodo 8 | n_refs 1 | enlaces 1 | tam 0 | tipo (disp. caracteres) | permisos 620
    ...................................................................
    + Descriptor 3 -> Dir. entrada filp eca0f580
    ++ Entrada filp -> n_refs 2 | offset  0 | (RD 1 WR 0) | dir. dentry f6407c58
    +++ Dentry -> n_refs 1 | nombre Makefile | dir inodo dee237d8
    ++++ Inodo -> nº inodo 31096891 | n_refs 1 | enlaces 1 | tam 38 | tipo (normal) | permisos 644
    ...................................................................
    
    En la misma se puede observar que la primera línea se corresponde con datos de la tabla de ficheros abierta especificando su dirección y el número de referencias a la misma (count). A continuación, hay un bloque de cuatro líneas por cada uno de los ficheros abiertos incluyendo la información de interés que se comentó previamente:

    Modo de operación del módulo monitor

  • La información se exportará usando un dispositivo de caracteres, que denominaremos monitor, y que, concretamente, se creará en el directorio /tmp (es decir, /tmp/monitor). Nótese que una alternativa hubiera sido crear una nueva entrada del /proc para exportar esta información, dado que para eso justamente se utiliza. Sin embargo, se ha preferido esta opción para poder facilitar el desarrollo reutilizando parte del conocimiento obtenido en el diseño del módulo de la segunda actividad. El modo de operación del dispositivo será el siguiente: Dado que el monitor maneja información en modo texto orientada a líneas, para probar el monitor basta con ejecutar una secuencia de mandatos como la siguiente:
    	echo $$ > /dev/monitor
    	cat < /tmp/monitor
    
    Esa secuencia imprimirá la información de ficheros abiertos del shell ($$ corresponde al PID del shell) activo en el terminal que se ejecuta el mandato.

    Para realizar una prueba más completa, se proporciona el siguiente programa, que el alumno utilizará para depurar su monitor. Obsérvese que, para facilitar la depuración, el programa de prueba es autocontenido e incluye directamente la interacción con el monitor. Además, deberá incluir en la memoria una explicación de la información que imprime el monitor al supervisar la ejecución de este programa explicando cómo evoluciona en cada uno de sus pasos.

    Para terminar esta práctica, se plantea un pequeño reto final: desarrollar un programa de usuario tal que al aplicarle el monitor exista un camino en el que todos los contadores de referencias tengan un valor de 2. Dicho de otra forma, al monitorizar el programa debe tener un valor de 2 el contador de referencias de la tabla y debe haber al menos un descriptor de fichero tal que su contador de filp, de dentry y de inodo sean iguales a 2. Este programa se incluirá en el material entregado por el alumno con el nombre de prueba2.c.