pepe dixit

18 enero, 2006

3.3 Objetividad (puede ser un poco árido)

Descripción del universo presente: Tenemos un sistema que ejecuta periódica o eventualmente una serie de procesos orientados a una aplicacion de control en tiempo real, el proceso supremo que controla todo el devenir del sistema y de los procesos secundarios se denomina Planificador de Tareas. Para poder efectuar las labores de control el sistema dispone de una serie de recursos a los que los diferentes procesos pueden acceder cuando lo necesiten. Se da la circunstancia de que algunos de esos recursos son únicos, por ejemplo solo existe una memoria de datos EEPROM externa, solo existe un canal de comunicaciones serie síncrono y existen diversas zonas de la memoria RAM que solo pueden ser leídas o escritas por un solo proceso cada vez, de forma que cuando un proceso está utilizando el recurso ningún otro proceso debe de poder acceder al mismo porque si no se perdería la integredidad de los datos manipulados. Para gestionar la concurrencia de procesos sobre este tipo de recursos existen diversas técnicas, yo he implementado una gestión por semáforos: Cada vez que un proceso accede a uno de estos recursos limitados pone el semáforo en rojo y cuando libera el recurso pone el semáforo en verde. De esta forma si otro proceso quiere acceder al recurso previamente comprueba el estado del semáforo, en caso de estar en verde procede a emplear el recurso, si por el contrario el semáforo está en rojo el proceso debe de esperar hasta que el recurso sea liberado.

Descripción del infierno: Al incrementar las solicitaciones de control al sistema el tiempo del que disponía el Panificador de tareas para ejecutar su labor resultó ser insuficiente por lo que se entraba en un ciclo perpetuo en el cual el planificador de tareas se ejecutaba recursivamente sin dar lugar a que el resto de procesos entrase en acción.

Descripción de la primera solución: Se añadió un semáforo que regulaba el intercambio de tareas de forma que este no puede producirse antes de que el planificador de tareas haya terminado sus operaciones. El tiempo empleado en encontrar el error fueron 40 días, el tiempo empleado en solucionarlo tan solo 5 minutos.

Descripción de la segunda avenida: Se introdujeron una serie de procesos nuevos en el sistema y se incrementó la frecuencia de uno de los procesos que, en particular consume muchos recursos. Un agujero en la política de semáforos ocasiona que varias tareas, hasta 3, accedan al canal serie síncrono y a la memoria EEPROM externa simultáneamente. Se produce una pérdida de información y un comportamiento errático del planificador de tareas.

Descripción de la segunda solución: Modificación de los instantes de acceso a los semáforos de los procesos implicados. Implemenatción de un nuevo semáforo que impida que una misma tarea sea puesta en ejecución cuando aún no ha terminado de ejecutarse en el ciclo anterior. (¿Por qué no implementé esto cuando descubrí el primer fallo? En esencia se trata del miemo problema). Tiempo empelado en encontrar la solución: 14 horas. Tiempo empleado en solucionar el problema: No lo sé, todavía estoy ensayando la solución descrita.

Reflexión: En esencia los dos problemas son el mismo. Una vez encontrado e identificado el primero un análisis detallado del sistema debería de haber identificado el segundo antes de que este ocurriese. La misma imprecisión que causó el primero fué el origen del segundo.