INTRODUCCIÓN A José Antonio Glez. Reboredo

Anuncio
INTRODUCCIÓN A
Autor: José Antonio Glez. Reboredo
Jose Antonio Glez. Reboredo
Introducción a SPIN
1. MÉTODOS FORMALES .......................................................................................... 3
1.1. INTRODUCCIÓN .......................................................................................................... 3
1.2. ESPECIFICACIÓN ........................................................................................................ 4
1.3. VERIFICACIÓN ........................................................................................................... 5
1.3.1. COMPROBACIÓN DE MODELOS.................................................................................. 5
1.3.2. PRUEBA DE TEOREMAS ............................................................................................. 5
1.4. TRABAJO FUTURO ...................................................................................................... 7
1.4.1. CONCEPTOS FUNDAMENTALES ................................................................................. 7
1.4.2. MÉTODOS Y HERRAMIENTAS .................................................................................... 7
1.4.3. INTEGRACIÓN DE MÉTODOS ...................................................................................... 8
1.4.4. EDUCACIÓN Y TRANSMISIÓN DE LA TECNOLOGÍA ..................................................... 9
2. SPIN ........................................................................................................................... 10
2.1. CARACTERÍSTICAS GENERALES .............................................................................. 10
2.2. INTRODUCCIÓN ........................................................................................................ 12
2.2.1. ESTRUCTURA ......................................................................................................... 12
2.3. FUNDAMENTOS ........................................................................................................ 14
2.3.1. REQUERIMIENTOS DE LÓGICA TEMPORAL ............................................................... 15
2.3.2. DOMINIO DE APLICACIÓN ....................................................................................... 15
2.4. ALGORITMOS ........................................................................................................... 17
2.4.1. NESTED DEPTH-FIRST SEARCH ................................................................................ 17
2.4.2. PASO DE FÓRMULAS LTL A AUTÓMATAS DE BÜCHI ............................................... 17
2.4.3. REDUCCIÓN DE ORDEN PARCIAL............................................................................. 18
2.5. REQUISITOS DE TIEMPO Y MEMORIA .......................................................................... 18
2
Jose Antonio Glez. Reboredo
Introducción a SPIN
1. Métodos formales
Antes de abordar el estudio de la verificación formal de sistemas distribuidos,
realizaremos una breve introducción acerca de la aplicación de métodos formales a los
ámbitos computacionales.
1.1. Introducción
Actualmente estamos asistiendo a una mejora de los métodos matemáticos para la
verificación y especificación de sistemas hardware y software de elevada complejidad;
de hecho, muchos de estos métodos ya son capaces de afrontar ejemplos reales del
mundo industrial. Esta mejora en los métodos se debe principalmente al desarrollo de
nuevas metodologías y de nuevas y más potentes herramientas (como pueden ser
mejores probadores de teoremas). Es difícil predecir, aún así, cual será el alcance, en el
futuro, de estas técnicas; pero la situación permite un cierto optimismo que debería ser
acompasado de un trabajo en investigación que permita que estas técnicas ayuden en
mayor medida al mundo industrial.
Las técnicas formales son uno de los métodos existentes en la ingeniería del software
para ayudar a la creación de sistemas de elevada complejidad y que, sin embargo,
alcancen los parámetros de eficiencia y eficacia deseados. El uso de métodos formales
no nos garantiza, a priori, la corrección del software, pero es una buena práctica que
permite alcanzar mejores resultados en la construcción de sistemas complejos, ya que
nos permite revelar inconsistencias, ambigüedades, etc.
En el pasado el uso de estas técnicas no fue muy utilizado debido a los problemas que
llevaban asociados, como la dificultad de los métodos, su baja capacidad para escalar,
etc. Actualmente estas técnicas están aumentando su grado de aceptación y mejorando
su capacidad de éxito lo que convierte a los métodos formales en una técnica que no
debemos dejar de tener en cuenta a la hora de buscar métodos para la creación de
sistemas computacionales de calidad. La evolución de estos métodos y los frutos de la
investigación que en ellos se está llevando a cabo nos dirán cual será el papel de estos
métodos en la informática del futuro.
A continuación repasaremos los dos campos de principal aplicación de los métodos
formales: la especificación y la verificación.
3
Jose Antonio Glez. Reboredo
Introducción a SPIN
1.2. Especificación
La especificación es el proceso de describir un sistema y las propiedades que se desea
que tenga. Es de sentido común la afirmación de que, de la correcta especificación de un
sistema, depende en gran medida el éxito o el fracaso en su desarrollo.
La especificación formal se basa en un lenguaje con una sintaxis y un semántica
matemáticamente definidas. En estos métodos es común la utilización de los conceptos
matemáticos de abstracción y composición.
Actualmente, uno de los hitos en la investigación de la especificación formal estriba en
cómo integrar diferentes lenguajes de especificación, cada uno de los cuales sea capaz
de afrontar distintos aspectos de un sistema. Otro punto importante es cómo manejar los
aspectos de un sistema que no se refieren a su comportamiento, como puede ser el
rendimiento, limitaciones de tiempo real, políticas de seguridad o diseño arquitectural.
Los métodos de especificación formal han sido utilizados con éxito en áreas tan diversas
como pueden ser: bases de datos, dispositivos, hardware, medicina, tecnología nuclear,
seguridad, comunicaciones y transporte.
4
Jose Antonio Glez. Reboredo
Introducción a SPIN
1.3. Verificación
La verificación es el proceso que permite comprobar, en mayor o menor medida, si un
sistema cumple las propiedades deseadas en él. En la verificación formal nos
encontramos con dos aproximaciones: comprobación de modelos y prueba de teoremas.
1.3.1. Comprobación de modelos
La comprobación de modelos es una técnica que consiste en construir un modelo finito
de un sistema y comprobar si una determinada propiedad deseada en el sistema se
cumple en el modelo.
Esta comprobación se realiza mediante una búsqueda exhaustiva en todo el conjunto de
estados posibles en el modelo. La finalización de esta comprobación está garantizada ya
que el modelo será finito. El objetivo para la mejora de esta técnica sería encontrar
algoritmos y estructuras de datos que nos permitan manejar grandes espacios de
búsqueda.
Esta técnica se ha utilizado principalmente en sistemas hardware y en la verificación de
protocolos, aunque el objetivo actual es su utilización en el análisis del cumplimiento de
las especificaciones en sistemas software.
Existes dos vertientes de la comprobación de modelos en las prácticas de hoy:
La primera es la comprobación temporal de modelos. En esta aproximación, las
especificaciones son expresadas mediante lógica temporal y los sistemas se modelan
mediante sistemas de transiciones de estado finito. Se utiliza un procedimiento de
búsqueda para comprobar si éste modelo cumple la especificación.
En la segunda aproximación, la especificación se da en forma de autómata. Luego el
sistema, también modelado como un autómata, se compara con la especificación para
determinar si su comportamiento es congruente con la misma.
En comparación con la prueba de teoremas, la comprobación de modelos es totalmente
automática y rápida, pudiendo llegar a dar una respuesta en cuestión de minutos, pero
presenta la desventaja de que se puede enfrentar a una explosión combinatoria que haga
inmanejable el problema.
La comprobación de modelos puede ser utilizada para comprobar especificaciones
parciales, en cuyo caso nos proporciona una valiosa información sobre la corrección de
un sistema, aun cuando éste no esté completamente especificado. Por otro lado cabe
destacar que la comprobación de modelos produce contraejemplos a partir de los cuales
podríamos analizar posibles errores subyacentes en el diseño. Es por este que puede ser
un asistente al debugging.
1.3.2. Prueba de teoremas
5
Jose Antonio Glez. Reboredo
Introducción a SPIN
La prueba de teoremas es una técnica en la que, tanto el sistema, como las propiedades
en él deseadas, se expresan mediante fórmulas en algún tipo de lógica matemática.
Esta lógica viene dada por un sistema formal, el cual define una serie de axiomas y un
conjunto de reglas de inferencia. La prueba de teoremas es el proceso de encontrar la
prueba de una propiedad a partir de los axiomas del sistema. Los resultados que se
vayan consiguiendo en ese proceso de prueba se denominan lemas intermedios.
Estas pruebas pueden ser obtenidas a mano, pero la idea es utilizar una máquina como
asistente en ese proceso de prueba. Hoy en día se está viendo incrementada la
utilización de los probadores de teoremas, para la verificación mecánica de propiedades
críticas en diseños tanto hardware como software. Estos probadores de teoremas pueden
ser clasificados según su grado de automatismo, desde probadores totalmente
automáticos a probadores interactivos. Estos últimos, requieren la interacción con una
persona, lo que, por un lado, los hace más susceptibles a la aparición de errores en la
prueba, pero, por otro lado aumenta enormemente la potencia de los mismos gracias a la
aportación que puede hacer la inteligencia del ser humano.
En contraste con la comprobación de modelos, los probadores de modelos son capaces
de manejar espacios de estados infinitos, esto lo manejan mediante técnicas como la
inducción.
6
Jose Antonio Glez. Reboredo
Introducción a SPIN
1.4. Trabajo futuro
Como se ha visto, el objetivo global de los métodos formales es ayudar a los ingenieros
a construir sistemas con un mayor grado de corrección y, por tanto, mejores. Los
métodos formales son una parte de la computación que se relaciona con prácticamente
todas las demás partes de la Informática, ya que se pretende que sea útil tanto en
sistemas software como hardware y, sus usuarios potenciales, serían todos aquellos
desarrolladores involucrados en procesos de ingeniería de sistemas.
El avance en esta área depende de múltiples factores como son: la investigación en la
misma, inventar nuevos métodos, implementar nuevas herramientas, integrar distintos
métodos para que trabajen juntos y la transmisión de estos conocimientos a las personas
susceptibles de utilizarlos.
1.4.1. Conceptos fundamentales
El trabajo para el avance en este campo debe ser enfocado en las siguientes áreas:
•
•
•
•
•
•
Composición: necesitamos saber cómo componer métodos, especificaciones,
modelos, teorías y pruebas.
Descomposición: necesitamos desarrollar métodos más eficientes propiedades
computacionales de carácter global en una serie de propiedades más simples cuyo
tratamiento sea más asequible.
Abstracción: es difícil especificar y verificar los sistemas reales sin el uso de la
abstracción; por lo tanto, necesitamos identificar diversos tipos de abstracciones y
desarrollar métodos que nos permitan justificarlas formalmente (quizá asistidos por
métodos automáticos).
Modelos y teorías reutilizables: la utilización de modelos y teorías reutilizables
facilitaría la construcción de otros nuevos y reduciría el número de errores que se
cometieran.
Combinaciones de teorías matemáticas: muchos sistemas presenta la mezcla de
tecnologías digitales y analógicas, lo que haría necesario la utilización de, tanto las
matemáticas discretas, como del cálculo con variables continuas. En muchas
ocasiones es necesario mezclar diversas partes de las matemáticas para un mismo
problema, pudiendo necesitar, por ejemplo, de la estadística o de la teoría de colas.
Estructuras de datos y algoritmos: el desarrollo de estructuras de datos adecuadas
y algoritmos más eficientes, nos permitiría manejar sistemas y espacios de búsqueda
mayores.
1.4.2. Métodos y herramientas
Ningún método es útil para todos los problemas, por lo que es necesario soportar
distintos tipos de métodos. Para que los métodos y de las herramientas que se
desarrollen a este respecto, tengan éxito entre sus posibles usuarios deben tenerse en
cuenta los siguientes aspectos:
7
Jose Antonio Glez. Reboredo
•
•
•
•
•
•
•
•
•
•
Introducción a SPIN
Rápido retorno de la inversión: estos métodos deben dar beneficios a las personas
que los utilicen desde el primer momento.
Los beneficios deben incrementarse con el esfuerzo: los beneficios aportados por
estas técnicas deben hacerse mayores según los desarrolladores aumenten sus
esfuerzos en escribir especificaciones o utilizar las herramientas.
Múltiple uso: la amortización de un método o herramienta es mayor si esta tiene
varios usos.
Uso integrado: los métodos y herramientas deben integrarse perfectamente con las
técnicas y lenguajes comunes de programación, de forma que los desarrolladores no
tengan que adaptarse totalmente a una nueva tecnología para sacar partido de estos
métodos.
Facilidad de uso: la facilidad de uso aumenta el atractivo de una herramienta y
reduce el tiempo en el que su utilización empieza a ser rentable.
Eficiencia: una herramienta debe ser eficiente para que su utilización no suponga
una pérdida de tiempo. Aún así, el tiempo de proceso de la herramienta podrá ser
mayor cuanto mayores sean los beneficios que se obtengan de este proceso.
Fácil de aprender: el tiempo necesario para aprender el manejo de los métodos o
herramientas debe ser el menor posible, con lo que se ganará una mayor aceptación
de los mismos por parte de los desarrolladores y un retorno de la inversión más
rápido.
Orientación a la detección de errores: los métodos y las herramientas deben estar
orientados, más a la detección de errores, que a la certificación de la corrección de
un sistema. Es muy deseable que sean capaces de encontrar contraejemplos.
Análisis focalizado: los métodos y herramientas deben ser buenos analizando al
menos uno de los aspectos del sistema.
Desarrollo evolutivo: los métodos y las herramientas deben estar pensados para la
evolución de los sistemas cuyo desarrollo se asista de los mismos. Un ejemplo de
esto es que deben permitir especificaciones parciales o análisis de aspectos
concretos de un sistema.
Más ambicioso que la creación de herramientas, sería el desarrollo de “metaherramientas” que nos permitieran crear herramientas específicas para cada caso.
1.4.3. Integración de métodos
Ya que ningún método formal es adecuado para describir y analizar todos los aspectos
de un sistema complejo, debemos trabajar en la integración de distintos métodos para
que puedan trabajar juntos en pos de un objetivo común.
En la combinación de métodos debemos considerar dos aspectos:
-
Encontrar un estilo adecuado para la utilización de distintos métodos juntos.
Encontrar una semántica adecuada para la utilización de distintos métodos
juntos.
Una de las integraciones más prometedoras de métodos formales sería la integración de
la comprobación de modelos con la prueba de teoremas. La combinación de estos
8
Jose Antonio Glez. Reboredo
Introducción a SPIN
métodos podría darnos un método que redujera las desventajas de los mismos
aportándonos sus mayores beneficios.
Otro punto de integración de elevada importancia es la integración con el proceso de
desarrollo, sobre todo en las partes de análisis, refinamiento y pruebas del sistema.
1.4.4. Educación y transmisión de la tecnología
Un punto crucial para el éxito de una tecnología y, por tanto, de la utilización de los
métodos formales en el desarrollo de sistemas es la transmisión de estos conocimientos
a las distintas audiencias. Las audiencias destino serían las siguientes:
-
Otros investigadores
Desarrolladores
Estudiantes
9
Jose Antonio Glez. Reboredo
Introducción a SPIN
2. SPIN
2.1. Características generales
Antes de abordar el estudio de la herramienta en más profundidad daremos una lista de
características generales de la misma.
Spin es un paquete software que permite la verificación formal de sistemas distribuidos.
Este software fue desarrollado por el grupo de métodos formales y verificación de los
Laboratorios Bell, dando comienzo su desarrollo en 1980. El sistema presenta las
siguientes características:
•
•
•
•
•
•
•
•
•
Spin es un producto para la verificación de software, no pensado para la verificación
de hardware. Para llevar a cabo este proceso utiliza un lenguaje propio para
especificar descripciones de sistemas. Este lenguaje se denomina PROMELA
(PROcess MEta LANguage) y es un lenguaje no determinístico.
Spin ha sido utilizado para encontrar errores en el diseño lógico de sistemas
distribuidos (ej.: sistemas operativos, protocolos de comunicaciones, sistemas
concentradores, algoritmos concurrentes, etc.). La herramienta comprueba la
consistencia lógica de una especificación informando de: interbloqueo, recepciones
no especificadas, flags incompletos, race conditions y afirmaciones no garantizadas
acerca de las velocidades relativas de los procesos.
Spin trabaja on-the-fly, lo que quiere decir que evita tener que construir un grafo de
estados global o una estructura Kripke, como preresquisito para la verificación de
algunas de las propiedades del sistema.
Spin puede ser utilizado como comprobador de modelos LTL (linear line temporal),
permitiendo manejar todos los requisitos correctamente expresados en lógica LTL.
Aún así, puede ser utilizado como un eficiente verificador on-the-fly para muchas
propiedades (muchas de las propiedades de un sistema pueden ser especificadas y
verificadas sin utilizar LTL.
Spn soporta que el número de procesos aumente o mengüe dinámicamente, para lo
que utiliza una técnica rubber state vector.
Spin soporta tanto redezvous, como el pase de mensajes en buffers. Soporta
comunicaciones a través de memoria compartida. Por otro lado, admite tanto,
comunicaciones síncronas, como asíncronas.
Soporta simulación aleatoria, interactiva y guiada, así como técnicas de prueba
exhaustivas y parciales.
La herramienta está pensada para enfrentarse a problemas de gran tamaño.
Para optimizar la verificación, la herramienta utiliza técnicas de reducción de orden
parcial y (opcionalmente) técnicas de almacenamiento BDD.
Spin puede ser utilizado en 3 modos básicos:
-
Como simulador, permitiendo un prototipado rápido mediante una simulación
aleatoria, guiada o interactiva.
10
Jose Antonio Glez. Reboredo
-
-
Introducción a SPIN
Como un analizador exhaustivo del espacio de estados, capaz de demostrar de
forma rigurosa la validez de los requerimientos de corrección. Aquí utiliza la
teoría de las reducciones de orden parcial para optimizar la búsqueda.
Como un analizador de un espacio de estados-bit puede validar, incluso sistemas
de protocolos de gran tamaño, con la máxima cobertura del espacio de estados.
(Es una técnica de prueba aproximada).
El software de Spin está escrito en el estándar ANSI C, pudiendo ser portado a todas las
versiones de Linux, a Windows 95/98 y a Windows NT.
A partir de aquí y, tras describir someramente las principales características del sistema,
pasaremos a describirlo en mayor profundidad a lo largo de los próximos apartados.
11
Jose Antonio Glez. Reboredo
Introducción a SPIN
2.2. Introducción
Spin es un sistema genérico de verificación que soporta el diseño y la verificación de
sistemas de procesos asíncronos. Los modelos de verificación de Spin están enfocados
en probar la corrección de las interacciones de los procesos, abstrayéndose lo más
posible de secuencia de computaciones interna.
La interacción entre procesos se indica a través de primitivas rendezvous, con pase
asíncrono de mensajes a través de canales con buffer, acceso a variables compartidas o
con una combinación de estos.
Como herramienta para la puesta en práctica de métodos formales, SPIN intenta
proporcionar:
1) Una intuitiva notación (similar a la de un lenguaje de programación) que nos
permite especificar detalles del diseño sin ambigüedades y sin llegar a nivel
de implementación.
2) Una notación concisa para expresar requerimientos genéricos de corrección
3) Una metodología para establecer la consistencia lógica de los detalles de
diseño de 1) y comprobar los requerimientos de corrección de 2).
Spin acepta especificaciones de diseño por medio del lenguaje PROMELA (PROcess
MEta LAnguage), que, a su vez, acepta especificaciones de corrección en la sintaxis del
estándar LTL (Linear Temporal Logic). Las notaciones en Spin se han escogido de tal
forma que la consistencia lógica de un diseño pueda ser demostrada por la herramienta.
2.2.1. Estructura
La estructura básica del comprobador de modelos Spin es la que podemos ver en la
siguiente figura:
12
Jose Antonio Glez. Reboredo
Introducción a SPIN
Figura 1: Estructura de la simulación y la verificación en SPIN
La forma típica de trabajar es comenzando con la especificación de un modelo de alto
nivel de un sistema concurrente (o algoritmo distribuido), normalmente utilizando el
front-end gráfico XSpin. Tras arreglar los errores sintácticos, se ejecuta una simulación
interactiva hasta que se tenga la suficiente confianza de que, el comportamiento del
sistema, es el esperado. En un tercer paso, Spin es utilizado para generar un programa
de verificación on-the-fly optimizado, a partir del la especificación de alto nivel. Este
verificador es compilado (aquí se pueden utilizar diversas opciones de compilación para
escoger el tipo de algoritmo de reducción) y ejecutado. Si se encontrase algún
contraejemplo para las especificaciones de corrección, éste puede ser probado en el
simulador, con el objeto de buscar la causa del mismo y eliminarla.
13
Jose Antonio Glez. Reboredo
Introducción a SPIN
2.3. Fundamentos
Spin tiene sus orígenes en los primeros sistemas de verificación de protocolos de
principios de los 80. Estos primeros verificadores se basaban en un análisis on-the-fly
del alcance y, su objetivo, era proporcionar una herramienta efectiva que pudiera
resolver problemas con un alcance práctico. La complejidad computacional del
problema, obliga a uno a escoger cuidadosamente que características soportará el
sistema, llegando a un compromiso entre utilidad y complejidad. Así, los predecesores
de Spin proporcionaban un rango de características mucho menor que el alcanzado con
éste. A partir de este punto nos centraremos en Spin:
En lo referente a la descripción de un sistema concurrente en PROMELA, ésta está
formada por: una o más plantillas de procesos definidas por el usuario o definiciones de
tipos de procesos, y, al menos una instanciación de procesos. Las plantillas definen el
comportamiento de los distintos tipos de procesos. Cualquier proceso puede instanciar
otros procesos asíncronos usando las plantillas de procesos.
Spin traduce cada plantilla de procesos en un autómata finito. El comportamiento global
del sistema concurrente se obtiene al computar un producto entrelazado y asíncrono de
autómatas (un autómata por cada comportamiento asíncrono de proceso). El resultado
global, con el comportamiento del sistema, es representado, a su vez, mediante un
autómata. Este producto entrelazado es conocido, normalmente, como el espacio de
estados del sistema y puede ser representado fácilmente como un grafo, que se conoce,
a su vez, como el grafo global de alcance.
Antes de explicar el proceso de verificación diremos que, un autómata de Büchi es un
autómata definido sobre infinitas secuencias de entrada, en vez de sobre un conjunto
finito como en la teoría estándar de máquinas de estado finito.
Para realizar la verificación, Spin coge un requerimiento de corrección expresado como
una fórmula de lógica temporal, la convierte en un autómata de Büchi y computa el
producto síncrono de ese requerimiento con el atómata que representa el estado de
espacios global; siendo, el resultado, nuevo autómata de Büchi. Si el lenguaje aceptado
por ese autómata es vacío, significará que el requerimiento original no se satisface para
el sistema dado. Si el lenguaje no es vacío, contendrá exactamente los comportamientos
que satisfacen la fórmula original. En Spin, se utilizan los requerimientos de corrección
para formalizar los comportamientos erróneos en los sistemas (comportamientos no
deseados), de forma que el proceso de verificación demuestra que esos
comportamientos no son posibles en el sistema o, en su defecto, nos indicará en que
casos se dan esos comportamientos.
En el peor caso, el grafo de alcance global tendrá el tamaño del producto cartesiano de
todos los componentes del sistema. La especificación del lenguaje PROMELA está
definida de tal modo que , cada componente siempre tiene un rango finito. Esto se
aplica a los procesos (que sólo podrán tener un conjunto finito de estados) y a todos los
canales de mensajes (todos con una capacidad limitada según lo que indique el usuario.
Nota: Las variables y los canales de mensajes también tienen un estado que se
seleccionará a partir de un dominio finito. Estos componentes pasivos pueden cambiar
de estado sólo como un efecto lateral síncrono, de las transiciones que se hacen en los
14
Jose Antonio Glez. Reboredo
Introducción a SPIN
componentes activos del modelo de verificación, es decir, en los procesos instanciados).
De todos modos, en la práctica, el tamaño del alcance global, nunca se aproxima al del
peor caso, ya que el tamaño del producto cartesiano podría hacer prohibitivos los
procesos computacionales exhaustivos. Con objeto de evitar este problema, se han
desarrollado varias técnicas para el manejo de la complejidad.
2.3.1. Requerimientos de lógica temporal
Spin acepta propiedades de corrección expresadas en lógica lineal temporal (LTL).
Vardi y Wolper demostraron en 1983 que cualquier fórmulal LTL puede ser traducida a
un autómata de Büchi. Spin implementa la conversión a un autómata de Büchi basada
en una simple construcción on-the-fly. El autómata generado sólo acepta las ejecuciones
que satisfacen la correspondiente fórmula LTL (existen infinitas).
Como se ha explicado anteriormente, se utilizan requerimientos de corrección que
expresan comportamientos indeseados del sistema (con el objeto de demostrar que no se
pueden producir).
Cada posible fórmula LTL puede ser transformada en su negación y viceversa, mediante
la adicción del operador de negación al principio de la misma. En principio puede
parecer que es indiferente cuál de las dos formas se escoja, pero hay una diferencia: Una
cláusula positiva requiere la demostración de que el lenguaje del sistema (es decir, todas
sus ejecuciones) está incluido en el lenguaje de la cláusula. Una cláusula negativa
requiere la demostración de que la intersección de los lenguajes es vacía. El tamaño del
espacio de estados para la demostración de una inclusión de lenguajes, en el peor caso
es el producto cartesiano de los autómatas del sistema y la restricción y, como mínimo,
su suma. El peor caso para la demostración de que la intersección de dos lenguajes es
vacía, también es el producto cartesiano del sistema y la restricción, pero, en el mejor
caso, es cero. (Si la parte inicial del comportamiento inválido representado en la
restricción, no aparece en el sistema, la intersección no contendrá ningún estado). Por
todo lo relatado, Spin trabaja con cláusulas negativas y resuelve el problema de la
verificación mediante intersección de lenguajes.
Un autómata de Büchi acepta una ejecución del sistema si, y sólo si, la ejecución fuerza
el paso por uno o más de sus estados de aceptación infinitas veces. Este comportamiento
es llamado ciclos de aceptación (una ejecución infinita en un sistema finito supone la
existencia de un ciclo). Para demostrar que no existe un a secuencia de aceptación que
cumpla el requisito de aceptación negativo, es suficiente probar que no existen ciclos de
aceptación en la ejecución combinada del sistema y el autómata de Büchi que representa
el requisito. Esta ejecución combinada se define formalmente por el producto síncrono
del sistema y el requisito.
La computación realizada por Spin para llevar a cabo esta demostración se basa en un
algoritmo de búsqueda en profundidad anidado (nested depth-first search algorithm).
Esta búsqueda terminará cuando se encuentre un contraejemplo (se encuentra un ciclo
de aceptación) o si se recorre todo el producto sin encontrar ciclos.
2.3.2. Dominio de aplicación
15
Jose Antonio Glez. Reboredo
Introducción a SPIN
Es diseño de Spin está enfocado a la verificación eficiente de sistemas software
asíncronos. Esto afecta a varias características de la herramienta, como el diseño del
lenguaje de especificación, la lógica, el procedimiento de verificación, las técnicas de
reducción y los métodos de codificación de estados.
16
Jose Antonio Glez. Reboredo
Introducción a SPIN
2.4. Algoritmos
En este apartado comentaremos brevemente los algoritmos utilizados por la
herramienta.
2.4.1. Nested depth-first search
El método para la detección de ciclos utilizado por Spin es de vital importancia para la
herramienta. Este método debe ser compatible con todos los modos de verificación,
incluyendo la búsqueda exhaustiva, bit-state hashing y las técnicas de reducción de
orden parcial.
El algoritmo clásico para encontrar un ciclo en un grafo es el algoritmo depth-first seach
de Tarjan, que construye los elementos fuertemente conectados en tiempo lineal,
mediante la adicción de dos enteros a cada estado alcanzado. Debido a que el espacio de
estados susceptible de ser generado por Spin, podría tener miles de millones de estados
alcanzables, estos dos números enteros deberían ser de 32 bits cada uno. Este algoritmo
no es compatible con las técnicas de bit-state hashing, también presentes en Spin, lo que
nos hace buscar una alternativa más eficiente en cuanto a espacio. Una nested depth-fist
search puede visitar cada estado dos veces, pero puede almacenar cada estado con sólo
2 bits a mayores (utilizando un método de codificación simple), en lugar de los 64 bits
del método de Tarjan.
El principio de esta búsqueda es el siguiente: para encontrar un ciclo de aceptación en el
grafo de alcance debe haber un estado de aceptación que sea, a la vez, alcanzable desde
el inicio y desde el propio nodo de aceptación. La primera búsqueda en profundidad
realizada, nos dice que estados de aceptación son alcanzables desde el inicio. La
búsqueda en profundidad anidada comprueba si son alcanzables desde sí mismos. Si se
llega a completar una ejecución tendremos el ciclo de aceptación, que será la
concatenación de la lista de estados recorridos en las dos búsquedas. Este ciclo será un
contraejemplo del requerimiento de corrección y podrá ser mostrado como prueba de
que éste no se cumple.
Este algoritmo no garantiza que encontremos todos los ciclos de aceptación, pero nos
garantiza encontrar al menos uno si alguno existe. Esto supone encontrar un
contraejemplo del requisito y, por tanto, cumplir los propósitos mínimos para realizar la
verificación.
Este algoritmo cuenta también con una restricción propia para evitar el cómputo de
caminos infinitos que no nos lleven a una solución.
2.4.2. Paso de fórmulas LTL a autómatas de Büchi
Las fórmulas LTL pueden ser utilizadas para expresar distintas propiedades en el
sistema. Una fórmula LTL f, puede contener varios símbolos proposicionales p (en
minúsculas), combinados con operadores, unarios o binarios, boléanos o temporales.
17
Jose Antonio Glez. Reboredo
Introducción a SPIN
El algoritmo de traducción, computa los estados de un autómata de Büchi, mediante el
cómputo del conjunto de subfórmulas que deben permanecer en cada estado alcanzable
y en cada uno de sus estados sucesores. En primer lugar, se pasa la fórmula a la forma
normal, con negaciones sólo adyacentes a proposiciones atómicas. Se crea un estado
inicial, marcado con la fórmula que va a ser macheada y un falso estado “de borde”. El
resto del autómata se calcula recursivamente. En cada estado, se coge una subfórmula
que espera ser satisfecha y, de acuerdo con su operador principal, el estado actual podría
ser dividido en dos estados con distintas partes de la subfórmula. Finalmente se detectan
los estados de aceptación en base a la fórmula que contengan.
2.4.3. Reducción de orden parcial
Spin usa un método de reducción de orden parcial para reducir el número de estados
alcanzables que deben ser explorados para completar una verificación. La reducción
está basada en la observación de que, la validez de una fórmula LTL, suele ser
insensible al orden de ejecución de eventos independientes en la depth-fist search. Así,
en lugar de generar un espacio de estados exhaustivo, que incluya todas las secuencias
de ejecución, éste se reduce a clases representativas de ejecución, que sean
indistinguibles para una propiedad de corrección dada.
La implementación de este método de reducción, se basa en una técnica estática de
reducción, que, antes de que la verificación real de comienzo, identifica casos en que
una regla de reducción de orden parcial pueda ser aplicada, de modo que no afecte al
proceso de verificación. Este método estático de reducción evita la sobrecarga del
tiempo de ejecución del que, otras estrategias de reducción adolecían.
Una característica importante del método estático de reducción de Spin es que no
conlleva un importante aumento del uso de la memoria, con respecto a una búsqueda
exhaustiva. Además, este método de reducción no se muestra sensible a decisiones
acerca del orden de los procesos o de las variables. Lo métodos alternativos de
reducción, basados en diagramas de decisión binarios, presentan problemas en los dos
aspectos antes mencionados.
2.5. Requisitos de tiempo y memoria
El tamaño del producto entrelazado que Spin puede computar, en el peor caso, crece
exponencialmente con el número de procesos. Dado el tamaño del producto, expresado
como el número de estados alcanzables R, podemos establecer una cota superior del la
cantidad de memoria y tiempo que serían necesarios para completar varios tipos de
tareas de verificación.
Probar propiedades de seguridad, tales como la ausencia de interbloqueo o condiciones
del usuario, supone un coste computacional que es lineal en el número de estados
alcanzables R, tanto en tiempo de CPU como en requisitos de memoria. Para probar
otras propiedades simples, tales como la ausencia de inanición o de ciclos de
aceptación, se requiere el doble de tiempo, aunque la memoria no se ve incrementada
significativamente. Para probar propiedades LTL, los requerimientos de tiempo crecen
en un factor, que, en el peor caso, puede ser el exponente del número de operadores
18
Jose Antonio Glez. Reboredo
Introducción a SPIN
utilizados en la fórmula. Los requisitos de memoria, sin embargo, permanecen largo
tiempo inalterados. Las propiedades LTL usadas en la práctica, rara vez tiene más de
dos o tres operadores, así que, el aumento en la complejidad es relativamente pequeño
comparado con la potencia que se le da al sistema.
La memoria es un recurso limitado en cualquier sistema. No es difícil construir un
comprobador de modelos que use tan sólo una pequeña cantidad de memoria, pero esto
sólo se puede hacer a expensas de un aumento en el tiempo utilizado inaceptable. Para
alcanzar este propósito Spin utiliza principalmente dos técnicas: compresión de los
estados y técnicas de bit-state hashing (gracias a la cual sólo dos bits son necesarios
para el almacenamiento de un estado alcanzable).
19
Descargar