Chapitre 4. Le langage PROMELA. (PROcess Meta LAnguage)

Documents pareils
1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Cours de Systèmes d Exploitation

Problèmes liés à la concurrence

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

OCL - Object Constraint Language

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Conception des systèmes répartis

Programmation Objet - Cours II

Les processus légers : threads. Système L3, /31

Recherche dans un tableau


Programmation C++ (débutant)/instructions for, while et do...while

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Algorithmique des Systèmes Répartis Protocoles de Communications

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Algorithmique et Programmation, IMA

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Algorithmique répartie

Cours Programmation Système

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours de Génie Logiciel

Chapitre 2 Devine mon nombre!

Java Licence Professionnelle CISII,

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Conventions d écriture et outils de mise au point

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Introduction à la programmation concurrente

Ordonnancement temps réel

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Cours d Informatique

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

TP 1. Prise en main du langage Python

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Introduction à la Programmation Parallèle: MPI

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Bases de programmation. Cours 5. Structurer les données

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Exercices INF5171 : série #3 (Automne 2012)

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Cours 1 : Qu est-ce que la programmation?

NIVEAU D'INTERVENTION DE LA PROGRAMMATION CONCURRENTE

Chapitre 4 : Exclusion mutuelle

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

KL5121. Pour activer des sorties en fonction de la position d'un codeur

Plateforme PAYZEN. Définition de Web-services

Projet Active Object

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Algorithmique et structures de données I

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Définition des Webservices Ordre de paiement par . Version 1.0

Chapitre 2. Classes et objets

Les diagrammes de modélisation

PROGRAMMATION EVENEMENTIELLE sur EXCEL

Plan du cours. Historique du langage Nouveautés de Java 7

Conception de circuits numériques et architecture des ordinateurs

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Gestion des transactions et accès concurrents dans les bases de données relationnelles

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

Notions fondamentales du langage C# Version 1.0

Correction TD algorithmique

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Utilisation de l analyse statique comme outil d aide au développement. par. Yves Gauthier

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

1 Recherche en table par balayage

Algorithme. Table des matières

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

Initiation à LabView : Les exemples d applications :

Cours Informatique Master STEP

CORRECTION EXERCICES ALGORITHME 1

Introduction à MATLAB R

Cours d Algorithmique et de Langage C v 3.0

1 Mesure de la performance d un système temps réel : la gigue

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Initiation à la programmation en Python

Gestion des processus

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Pourquoi l apprentissage?

Table des matières Sources

L'instruction if permet d'exécuter des instructions différentes selon qu'une condition est vraie ou fausse. Sa forme de base est la suivante:

Extension d'un outil de trace pour système embarqué temps réel. Encadrants : Laurent Pautet, Jérôme Hugues

Cours d algorithmique pour la classe de 2nde

INITIATION AU LANGAGE JAVA

Cours de Programmation 2

Algorithmes récursifs

UE C avancé cours 1: introduction et révisions

Introduction à JDBC. Accès aux bases de données en Java

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Université de Sherbrooke, Département d informatique

Sélection du contrôleur

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Transcription:

Chapitre 4 Le langage PROMELA (PROcess Meta LAnguage)

PROcess MEta Language [Holzmann] Spécification et vérification de protocoles Abstraction de l'implémentation (niveau conceptuel) Modèle de validation SPIN (Simple Promela INterpreter) http://spinroot.com/spin/man/manual.html Validation et vérification de propriétés Simulation : échanges de messages 2

1. Mécanismes du langage 1.1. Processus, canaux et variables Processus : Objets globaux spécifiant le comportement du protocole Canaux de messages et variables : Objets globaux ou locaux définissant l'environnement d'exécution des processus 1.2. Exécutabilité pas de différence entre conditions et instructions une instruction est soit exécutable soit bloquée mécanisme de synchronisation entre processus Ex : while (a!=b) skip équivaut à : (a==b) 3

1.3. Types de données Types de base : bit, bool, byte, short, int une valeur unique à un instant donné Canaux : chan peuvent stocker simultanément plusieurs valeurs (messages) Tableaux : comme en C, rangs de O à N-1 byte state[n] state[0] = state[3] + 5 * state[3 * 2/n] 4

1.4. Types de processus Déclaration d'un type de processus : proctype définit le comportement d'un processus celui-ci sera instancié lors de l'exécution Ex : proctype A() { byte state ; state = 3 } Le séparateur ; est synonyme du séparateur (causalité) Ex : byte state = 2 ; proctype A() { (state == 1) state = 3 } proctype B() { (state = state - 1 } Exercice : comparer les processus de type A et B en termes d'exécutabilité 5

1.4.1. Instanciation des processus Initialement un seul processus s'exécute : init Ex : init { skip } init { printf ("hello world\n") } init { run A() ; run B() } L'instruction run instancie une copie d'un processus de type donné run retourne un entier positif (pid du processus instancié) ou 0 en cas d'échec (trop de processus dans le système) 6

NB : seuls les canaux et les instances des 5 types de base peuvent être passés en paramètre (les tableaux et les types de processus ne peuvent pas être passés en paramètre) Ex : proctype A (byte state ; short set) { (state == 1) state = set } init { run A(1, 3) } L'instruction run peut aussi être utilisée dans les types de processus : un processus se termine quand il a achevé son corps d'exécution et que tous les processus qu'il a instanciés se sont terminés. 7

Exemple : problème de l'exclusion mutuelle lors de l'accès aux variables globales par plusieurs processus concurrents : byte state = 1; proctype A() { (state == 1) -> state = state + 1} proctype B() { (state == 1) -> state = state - 1} init { run A() ; run B() } Question : déterminer les différents types de scénarios d'exécution. Quelle est la valeur finale de la variable state? 8

Spécification de l'algorithme de Dekker en Promela [Holzmann] #define true 1 #define false 0 #define Aturn false #define Bturn true bool x, y, t; proctype A() { x = true; t = Bturn; (y == false t == Aturn); /* critical section */ x = false } 9

proctype B() { y = true; t = Aturn; (x == false t == Bturn); /* critical section */ y = false } init { run A(); run B() } Exercice: montrer que cet algorithme assure l'exclusion mutuelle (TD-TP) 10

1.4.2. Séquences atomiques Séquence d'instructions qui sont exécutées de façon indivisible, i.e. non entrelaçable avec d'autres processus Exercice : reprendre l'exercice précédent avec des séquences atomiques. Quelle est la valeur finale de la variable state? byte state = 1; proctype A() { atomic { (state == 1) state = state + 1} } proctype B() { atomic { (state == 1) state = state - 1} } init { run A(); run B() } Les séquences atomiques sont un outil important de réduction de la complexité dans un modèle de validation, car elles diminuent le nombre d'entrelacements possibles 11

1.5. Canaux de messages Les canaux modélisent le transfert de messages entre les processus. Ex : chan a, b ; chan c[3] /* tableau de canaux */ On peut préciser le nombre maximum de messages que le canal peut contenir Ex : chan c[3] = [4] of {byte} On peut déclarer des messages à plusieurs champs de types différents. Ex : chan qname = [16] of { byte, int, chan, byte } 12

Instructions d'envoi et de réception de messages sur un canal : qname! expr envoie la valeur de l'expression expr vers le canal qname. Le message est rajouté à la queue de la file du canal. qname? msg reçoit un message du canal qname et le stocke dans la variable msg. Les canaux transmettent les messages dans l'ordre FIFO. Pour les messages à plusieurs champs, la notation est la suivante : qname! expr1, expr2, expr3 qname? var1, var2, var3 13

Le premier champ d'un message est souvent utilisé pour préciser le type du message (ex : ack, nak, data, etc.) : qname! expr1(expr2,expr3) qname? var1(var2,var3) L'opérateur len(qname) retourne le nombre de messages présents dans le canal qname. Remarque : les opérations d'envoi et de réception sur la canal ne peuvent pas être évaluées sans effets de bord potentiels : qname? ack(var) Si on veut tester la présence d'un message ack(var) sur le canal, l'instruction précédente va retirer le message du canal. 14

On peut éviter l'effet de bord en utilisant l'instruction suivante : qname? [ack(var)] retourne 1 si l'instruction qname?ack(var) est exécutable, i.e s'il y a un message ack(var) sur le canal et retourne 0 sinon. le message ack(var) n'est pas retiré du canal Remarque : dans les séquence non-atomiques suivantes : (len(qname) < MAX) qname! msgtype qname?[msgtype] qname? msgtype La deuxième instruction n'est pas forcément exécutable lorsque la première a été exécutée. En effet, si le canal est partagé par plusieurs processus, un autre processus peut écrire ou lire un message dans canal, avant que le processus exécute la deuxième instruction. 15

Exercice : dans le programme suivant, quelle est la valeur affichée par le processus de type B? [Holzmann] 16

1.6. Communication par rendez-vous Communication asynchrone entre processus : chan qname = [N] of {byte} Communication par rendez-vous ou synchrone : chan port = [0] of {byte} Le message ne peut pas être stocké dans le canal et doit être livré instantanément Remarque : la communication par rendez-vous est binaire ou point à point. 17

Exemple du sémaphore de Dijkstra [Holzmann] (TD-TP) 18

Exercice : comparer les exécutions des processus de type A et B, suivant que la taille du canal name soit 0, 1 ou 2 19

2. Structures de contrôle 3 structures de contrôle : Sélection Répétition Saut inconditionnel 2.1. Sélection if /* ici sémantique du «if» classique : 1 seule alternative exécutable */ :: (a!= b) option1 :: (a == b) option2 fi 20

Exemple de sélection [Holzmann] 21

Exemple de sélection /* ici sémantique différente du «if» classique : les 2 alternatives sont exécutables choix aléatoire */ byte count; proctype counter () { if :: count = count + 1 :: count = count 1 fi } 22

2.2. Répétition Pour sortir de la boucle on utilise l'instruction break Exemple : byte count; proctype counter () { do :: count = count + 1 :: count = count 1 :: (count == 0) break od } Exercice : le processus dans l'exemple se termine-t-il nécessairement? Sinon proposer une modification pour forcer la terminaison quand le compteur atteint 0. 23

2.3. Saut inconditionnel Le saut inconditionnel permet aussi de sortir d'une boucle : goto Exemple : algorithme d'euclide de recherche du PGCD de deux entiers positifs proctype Euclide (int x, y) { do :: (x > y) x = x- y :: (x < y) y = y -x :: (x == y) goto done od ; done : printf ("pgcd : %d\n", x) } 24

3. Procédures et récursion Les procédures récursives peuvent se modéliser par des processus. Exemple de factorielle [Holzmann]: 25

4. Types de messages Exemple : mtype = { ack, nak, err, next, accept } Ceci équivaut à la définition : #define ack 1 #define nak 2 #define err 3 #define next 4 #define accept 5 26

Exemple de modélisation du protocole de Lynch [Holzmann] (TD-TP) 27

5. Critères de correction des protocoles Objectifs de PROMELA : Modéliser le comportement des processus à un haut niveau d'abstraction modèle de validation du protocole définir des critères de correction respect des invariants du système pas de «deadlocks» pas de «mauvais cycles» pas de terminaisons incorrectes PROMELA repose sur un modèle d'automates à états finis vérification automatique (ex : absence de «deadlocks» vérification de propriétés formulées par le programmeur (ex : invariants) => labels, assertions 28

5.1. Assertions Un critère de correction peut s'exprimer sous forme d'une condition booléenne qui doit être satisfaite dans un état donné : assert (condition) : toujours exécutable et peut être placée n'importe où dans un code PROMELA si la condition est vraie : l'instruction «assert» est sans effet l'instruction «assert» est violée s'il existe au moins une séquence d'exécution telle que la condition est fausse lorsque l'instruction «assert» devient exécutable. 29

Exemple d'exclusion mutuelle (slide 8) : byte state = 1; proctype A() { (state == 1) -> state = state + 1} proctype B() { (state == 1) -> state = state - 1} init { run A() ; run B() } Si on veut exprimer que quand un processus de type A() (resp. B()) finit son exécution la valeur de la variable «state» est 2 (resp. 0) : byte state = 1; proctype A() { (state == 1) -> state = state + 1 ; assert(state = 2)} proctype B() { (state == 1) -> state = state - 1 ; assert(state = 0)} init { run A() ; run B() } Remarque : ces assertions sont fausses (vérifier avec le validateur) 30

5.2. Invariants du système Une application plus générale du «assert» est la formalisation des invariants du système (conditions booléennes qui restent vraies dans tous les états atteignables du système) : proctype monitor() { assert (invariant) } ce processus s'exécute indépendamment des autres avec l'entrelacement, l'instruction «assert» est exécutable à tous les états du système l'invariant peut être vérifié à tout moment 31

Exemple du sémaphore de Dijkstra (slide 18) : byte count ; chan sema = [0] of {bit} ; proctype user() { skip ; sema?p; count = count + 1; skip; /* section critique */ count = count - 1; sema!v; /* sortie de la section critique */ skip; } proctype monitor() {assert(count == 0 count == 1) } init {atomic {run dijkstra() ; run monitor(); run user(); run user(); run user()} } 32

5.3. Deadlocks (interblocages) Les séquences d'exécution : soit se terminent soit rebouclent sur un état précédent de la séquence Tous les processus ne se terminent pas forcément : Ex : processus serveur (sémaphore) Tous les cycles infinis ne sont pas des «deadlocks» : => distinguer un état final «correct» d'un état final «incorrect» 33

Un état final incorrect peut être un «deadlock» ou un état d'erreur du à une spécification incomplète du protocole (ex : réception d'un message non attendu) Un état final correct est tel que : i. tous les processus instanciés se sont terminés ii. tous les canaux de messages sont vides => PROMELA permet d'indiquer qu'un état final doit être considéré comme correct, même s'il est dans une boucle : le label «end» marque un état comme étant un état final valide 34

Exemple proctype dijkstra() { end : do :: sema!p sema?v od } Tout processus de type dijkstra est considéré dans un état final valide si cet état est étiqueté par «end» Remarque : on peut utiliser plusieurs labels de type «end-state» dans un même processus : préfixe commun «end» (end0, end_world, etc.) 35

Le premier critère de correction (i) est modifié : (i') tous les processus instanciés se sont terminés ou ont atteint un état étant marqué comme état final valide (end_state) Un modèle de validation est donc correct s'il ne contient pas de séquence d'exécution avec un état final invalide 5.4. «Mauvais» cycles Certains comportements infinis sont acceptables. Il faut donc pouvoir distinguer les cycles valides des «mauvais» cycles => marquage des états dans les boucles 36

5.4.1. «Non-progress» cycles Pour définir l'absence de cycles infinis qui ne progressent pas, il faut pouvoir définir les états qui dénotent un progrès le label «progress» définit un état qui doit être atteint pour que le protocole progresse (ex : incrémentation d'un n de séquence, réception d'une donnée, etc.) Exemple du sémaphore : proctype dijkstra() { end: do :: sema!p progress: sema?v od } Remarque : on peut utiliser plusieurs labels de type «progress» dans un même processus : préfixe commun «progress» (progress0, progress_is_slow, 37 etc.).

5.4.2. «Livelocks» Nous souhaitons exprimer la condition inverse du «progress», i.e. formaliser qu'une séquence ne peut pas se reproduire indéfiniment le label «accept» marque un état qui ne doit pas appartenir à une boucle infinie => utilisé dans les «temporal claims» Exemple du sémaphore : proctype dijkstra() { end: accept: do :: sema!p od sema?v } /* signifie qu'il est impossible de boucler sur une séquence de P et V (faux!) */ Remarque : on peut utiliser plusieurs labels de type «accept» dans un même processus : préfixe commun «accept» (accept0, acceptable, 38 etc.).