• Aucun résultat trouvé

Analyse de ressources pour les systèmes concurrents dynamiques

N/A
N/A
Protected

Academic year: 2021

Partager "Analyse de ressources pour les systèmes concurrents dynamiques"

Copied!
178
0
0

Texte intégral

(1)

HAL Id: tel-01523979

https://tel.archives-ouvertes.fr/tel-01523979

Submitted on 17 May 2017

HAL is a multi-disciplinary open access archive for the deposit and dissemination of sci-entific research documents, whether they are pub-lished or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers.

L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des établissements d’enseignement et de recherche français ou étrangers, des laboratoires publics ou privés.

Analyse de ressources pour les systèmes concurrents

dynamiques

Aurélien Deharbe

To cite this version:

Aurélien Deharbe. Analyse de ressources pour les systèmes concurrents dynamiques. Systèmes dynamiques [math.DS]. Université Pierre et Marie Curie - Paris VI, 2016. Français. �NNT : 2016PA066520�. �tel-01523979�

(2)

Université Pierre et Marie Curie

École Doctorale Informatique, Télécommunications et Électronique

Analyse de ressources pour les

systèmes concurrents dynamiques

Aurélien Deharbe

sous la direction de Frédéric Peschanski et Michèle Soria

THÈSE

pour obtenir le titre de

Docteur en Sciences mention Informatique

soutenue le 21 septembre 2016, devant le jury composé de Président

Béatrice Bérard Université Pierre et Marie Curie Directeurs

Frédéric Peschanski Université Pierre et Marie Curie Michèle Soria Université Pierre et Marie Curie

Rapporteurs

Hanna Klaudel Université d’Évry

Daniele Varacca Université Paris Est - Créteil Examinateurs

Ilaria Castellani INRIA Sophia Antipolis Jean Krivine Université Paris Diderot

(3)
(4)

T

ABLE DES MATIÈRES

Table des matières i

1 Introduction 1

1.1 Contexte . . . 2

1.1.1 Les systèmes concurrents . . . 2

1.1.2 Qu’est-ce qu’une ressource ? . . . 3

1.2 Problématiques . . . 4

1.2.1 Construction d’espaces d’états . . . 4

1.2.2 Profils de ressources . . . 4

1.2.3 Quantification des ressources . . . 5

1.3 Approche de la thèse . . . 5 1.3.1 Présentation de l’approche . . . 5 1.3.2 Contributions . . . 6 1.4 Plan de la thèse . . . 8 I Contexte 11 2 État de l’art 13 2.1 Des systèmes concurrents auπ-calcul : modélisation et programmation . . . 13

2.2 Analyses de ressources . . . 14

2.2.1 Notion préliminaire : les noms purs . . . 14

2.2.2 Analyses de ressources . . . 15

2.2.3 Automates pour mots sur alphabets infinis . . . 16

2.2.3.1 Automates à mémoire finie . . . 16

2.2.3.2 Automates à galets . . . 17

2.2.3.3 Automates à données . . . 17

2.2.3.4 Automates à variables . . . 18

2.2.3.5 Automates à gardes . . . 18

2.3 Analyses comportementales pour leπ-calcul . . . . 18

2.3.1 Approche explicite et approche implicite . . . 18

2.3.2 Contrôle fini, infini, processus finitaires . . . 19

2.3.3 Construction d’espaces d’états pour les processus . . . 20

(5)

ii Table des matières

2.3.5 Autres techniques de vérification pour leπ-calcul . . . . 23

2.4 Synthèse . . . 24

3 Motivations 27 3.1 Consommation de ressources des programmes . . . 27

3.1.1 Algorithmes de tri parallèles . . . 28

3.1.1.1 Tri à bulles parallèle . . . 28

3.1.1.2 Tri rapide parallèle . . . 31

3.1.2 Problématiques . . . 34

3.2 Propriétés sur les systèmes et les programmes . . . 36

3.2.1 Le dîner des philosophes . . . 36

3.2.2 Abstraction et propriétés du système . . . 36

3.2.3 Profils de ressources . . . 38

3.3 Systèmes à contrôle infini et à ressources finies . . . 39

3.3.1 Un système de sessions en Piccolo . . . 39

3.3.2 Problématiques . . . 39 II Analyse de ressources 41 4 ν-automates 43 4.1 Profils de ressources . . . 44 4.1.1 Programmes de ressources . . . 45 4.1.2 ν-langages . . . . 47 4.1.3 Reconnaisseurs deν-langages . . . . 48 4.2 ν-automates finis . . . . 53 4.2.1 Définition . . . 53 4.2.2 Allocateurs et configurations . . . 54

4.2.3 ν-automates finis élémentaires . . . . 63

4.2.4 ν-automates à portées minimales . . . . 65

4.3 Bornes de ressources . . . 67

4.3.1 Consommation . . . 67

4.3.2 ν-automates bornés . . . . 68

4.4 Minimisation des ressources . . . 70

4.5 Comparaison avec d’autres types d’automates à mémoire . . . 73

4.6 Conclusion . . . 78

5 Le ramasse-miettes omniscient 79 5.1 Graphe d’unν-automate . . . . 80

5.2 Complétion en treillis . . . 84

5.2.1 Complétion du graphe . . . 84

5.2.2 Modèle algorithmique . . . 89

5.2.2.1 Principe algorithmique . . . 89

(6)

Table des matières iii

5.3 Propriétés du graphe d’unν-automate . . . . 91

5.3.1 Utilisation correcte des ressources . . . 91

5.3.2 Classification des ressources . . . 93

5.3.3 Conflits entre ressources . . . 95

5.4 Algorithme du ramasse-miettes omniscient . . . 96

5.4.1 Allocateurs . . . 96

5.4.2 Bornes et indice de ressources . . . 97

5.4.2.1 Définitions . . . 97 5.4.2.2 Borne triviale . . . 98 5.4.2.3 Borne first-fit . . . . 98 5.4.2.4 Indice de ressource . . . 99 5.5 Conclusion . . . 102 III Expérimentations 103 6 Modèles de ressources pour leπ-calcul 105 6.1 Modèles d’abstraction des ressources . . . 106

6.2 Construction d’un espace d’états pour leπ-calcul . . . 111

6.2.1 Sémantique à état persistant . . . 111

6.2.2 Abstraction des ressources . . . 114

6.3 Observations à la carte : slice-π . . . 115

6.3.1 Sémantique slice-π . . . 116

6.3.2 Abstraction des ressources . . . 118

6.4 Conclusion . . . 120

7 Environnement d’analyse de ressources 123 7.1 Architecture générale . . . 123

7.2 Notes d’implémentation . . . 125

7.2.1 Construction d’espaces d’états . . . 125

7.2.2 Récurseurs . . . 126

7.2.3 Calcul des bornes de ressources . . . 126

7.3 Expérimentations . . . 126

7.3.1 Modélisation de structures de données . . . 127

7.3.2 Le protocole de transfert cellulaire (GSM) . . . 128

7.3.3 Le dîner des philosophes . . . 128

7.4 Conclusion . . . 130

8 Conclusion et perspectives 131 8.1 Lesν-automates . . . 131

8.2 Algorithmes pour les ressources dynamiques . . . 132

8.3 Algorithmique pour la vérification de processus enπ-calcul . . . 132

(7)

iv Table des matières

Annexes 136

A Notations 137

A.1 Objets structurés . . . 137

A.2 Fonctions et relations . . . 137

A.3 Substitutions . . . 137 A.4 Graphes . . . 138 B Leπ-calcul 139 B.1 Syntaxe . . . 139 B.2 Sémantique de réductions . . . 140 B.3 Sémantiques de transitions . . . 141 B.3.1 Sémantique précoce . . . 141 B.3.2 Sémantique tardive . . . 142 B.4 Sémantique symbolique . . . 144

B.5 Processus finitaires et processus à contrôle fini . . . 144

C Les automates à mémoire finie 147 D Le langage Piccolo 151 D.1 Présentation du langage . . . 151

D.2 Un premier exemple à deux threads . . . 152

D.3 Les constructions classiques de la concurrence en Piccolo . . . 154

D.4 Modélisation de fonctions en Piccolo . . . 157

D.5 Allocation dynamique de mémoire . . . 158

Liste des figures 161

Liste des définitions 162

Liste des lemmes et théorèmes 163

Liste des listings 163

(8)

C

H AP ITRE

1

I

NTRODUCTION

L

ES PROGRAMMESainsi que les systèmes informatiques ont le besoin constant d’accéder

et de manipuler des ressources. Les ressources peuvent être internes, et nécessaires au bon fonctionnement du système, comme de la mémoire par exemple. Elles peuvent aussi être externes, permettant alors la communication de données : lecture de fichiers, affichage d’in-formations et de résultats, etc. En particulier, les ressources dynamiques sont des ressources générées, utilisées, puis détruites au gré des besoins des systèmes durant leurs exécutions.

La vérification de la bonne utilisation des ressources, ainsi que leur dénombrement pour un système donné, est un sujet de recherche actif depuis un certain nombre d’années. Dans ce travail, nous nous intéressons aux ressources dynamiques des systèmes concurrents. Ces systèmes se composent de plusieurs threads d’exécution qui concourent entre eux pour l’accès et l’utilisation aux ressources dynamiques. Les ressources sont alors mobiles puisqu’elles peuvent être échangées entre les diverses flux d’exécution. L’analyse de ce type de systèmes est d’autant plus intéressante que leurs propriétés comportementales sont souvent étroite-ment liées à l’utilisation et à la disponibilité de ressources dynamiques. Toutefois, leur étude contient également des difficultés qui leur sont propres. D’abord, les processus exécutés concurremment forment en fait eux-mêmes une catégorie de ressources dynamiques. Il est difficile de suivre de façon statique les exécutions de processus créés dynamiquement. Ensuite, dans le cas général, la multiplicité de ces processus mène à une explosion du nombre d’états atteignables par un système, voire à une infinité d’états. Ces difficultés connues présentent des enjeux théoriques et pratiques importants. Nous proposons dans cette thèse de les étudier à travers une approche dans laquelle les ressources dynamiques sont considérées comme hautement représentatives du comportement des ces systèmes. En effet, un système qui ne dispose plus d’assez de ressources ne fonctionne pas, et à l’inverse un système qui exploite plus de ressources que nécessaire n’est pas efficace.

(9)

2 Introduction

également largement utilisées dans le domaine de la programmation. Elles sont bénéfiques puisqu’elles permettent de paralléliser certains traitements, et ainsi d’exploiter au mieux les ressources de calcul des matériels modernes impliquant plusieurs processeurs ou encore des processeurs à plusieurs cœurs.

L’objectif de cette thèse est donc l’étude quantitative des ressources manipulées dans les systèmes concurrents dynamiques. Ce travail a pour ambition d’introduire des modèles génériques permettant l’analyse (quantitative) de ressources, tant pour des systèmes modélisés que pour des programmes multithreadés directement exécutables.

1.1 Contexte

1.1.1 Les systèmes concurrents

L’analyse des systèmes concurrents passe tout d’abord par une étape de modélisation de leurs comportements. De la même manière que leλ-calcul ou les machines de Turing

capturent le concept informel de fonction calculable, les algèbres de processus capturent l’essence du concept de processus communicant.

À la base de ces algèbres, on retrouve la notion de nom (d’action ou de canal) utilisé pour la communication entre processus. Bien qu’il existe des variantes asynchrones, la plupart du temps, ces communications sont des mécanismes de modélisation de synchronisation. On citera tout d’abord les algèbres CCS [Milner, 1980] et CSP [Hoare, 1985]. Ces calculs permettent de modéliser les communications entre processus effectuant chacun des séquences d’actions atomiques. Les noms d’actions figurent dans les termes syntaxiques, puis figurent dans les transitions possibles des systèmes, selon leurs sémantiques. On retrouve bien la notion de ressource dynamique dans ces algèbres de processus : tout calcul est réalisé à travers des synchronisations entre processus, elles-mêmes effectuées sur la base d’un nom de canal qui sont des ressources implicitement créées, puis utilisées et finalement détruites lorsqu’elles ne sont plus nécessaires à l’exécution du système. Chaque canal de communication est donc une ressource du système concurrent, et toute ressource manipulée par un système concret peut donc être modélisée sous la forme d’un canal de communication puisqu’il est représenté par un simple nom.

Les étiquettes générées par les transitions peuvent ensuite être utilisées pour la construc-tion de systèmes à transiconstruc-tions étiquetées représentant l’ensemble des états atteignables par un système concret donné. Des algorithmes tels que la vérification de bisimulation par raf-finement de partitions ou bien la vérification de propriétés exprimées enµ-calcul ont été

appliqués avec succès sur ces modèles.

Dans ces deux algèbres de processus, la création dynamique des ressources est laissée implicite. D’autres algèbres de processus plus expressives caractérisent en fait mieux la dyna-micité des ressources et leur mobilité. Leπ-calcul [Milner et al., 1992a, Milner et al., 1992b],

par exemple, peut être vu comme une extension de CCS dans laquelle les noms représen-tant les canaux de communication peuvent être communiqués par ces mêmes canaux. Cette fonctionnalité en fait un calcul beaucoup plus concis pour l’encodage des phénomènes dyna-miques. Utilisée conjointement avec l’opérateur de création de nomν, les processus π-calcul

(10)

1.1. Contexte 3

ont la possibilité de créer explicitement des ressources, et de faire connaître leur identité à des processus avec lesquels ils communiquent. Cela mène à la mobilité des liens de com-munication, et cette fonctionnalité caractérise idéalement les mouvements des ressources dynamiques entre les threads d’un système concurrent. Si l’on souhaite par exemple étudier la gestion de la mémoire (dynamique) d’un programme en C dans lequel un pointeur est transmis à une fonction, on assiste effectivement à la mobilité dudit pointeur, sorte de lien de communication avec la zone de mémoire effectivement pointée.

Cette dynamicité offre donc une expressivité très intéressante, mais également des dif-ficultés pour la vérification de modèles l’utilisant. Par exemple, les techniques usuelles de vérification pour les processus CCS ne peuvent pas être directement adaptées. Le problème apparemment simple de la construction d’un espace d’états est en fait non trivial. Il est par exemple difficile de choisir un nom globalement frais pour un système, et surtout de récupérer au bon moment les noms qui ne sont plus utilisés afin de ne pas faire exploser les modèles à états représentant les exécutions des processus enπ-calcul. Nous développons en détail ces

difficultés et enjeux ultérieurement dans ce manuscrit.

Les programmes multithreadés constituent un exemple important de systèmes concur-rents. Plusieurs langages de programmation trouvent d’ailleurs leurs racines dans les algèbres de processus. On citera par exemple le langage Pict [Pierce et Turner, 2000], qui est directe-ment inspiré duπ-calcul, et le langage JoCaml [Fournet et al., 2002], qui est quant à lui fondé

sur le join-calcul [Fournet et Gonthier, 2000]. Dans le cadre de cette thèse, nous développons le langage Piccolo, fondé également sur leπ-calcul, et dont un des objectifs est de permettre

des analyses de la manière la plus directe possible, et en particulier, des analyses de ressources.

1.1.2 Qu’est-ce qu’une ressource ?

Dans les systèmes concurrents et dynamiques sont généralement manipulées des res-sources de plusieurs types. Pour être qualifiée de dynamique, une ressource doit être allouée au cours de l’exécution du système. Les ressources dynamiques sont donc caractérisées par leur cycle de vie, spécifié à l’aide des événements suivants :

— le cycle de vie d’une ressource dynamique commence lorsqu’elle est allouée, — la ressource peut alors être utilisée un nombre arbitraire de fois,

— puis, elle est finalement détruite, ce qui met fin à son cycle de vie1.

Un premier exemple évident est la mémoire, et plus précisément le tas mémoire, dont l’utilisation courante correspond exactement à ce schéma. On retrouve également dans le panorama des ressources dynamiques les objets permettant aux systèmes de manipuler cette mémoire, des fichiers, ou encore d’effectuer des entrées/sorties. Lorsque l’on considère en particulier des systèmes concurrents et dynamiques, une autre classe d’objets s’avère constituée de tout en ensemble de ressources dynamiques importantes : il s’agit des objets permettant la manipulation des threads ainsi que ceux permettant les communications et les

1. Dans certains cas toutefois, cette destruction peut être retardée un temps arbitrairement, voire infiniment, long. Par exemple, un système ne terminant pas peut requérir d’utiliser la ressource considérée tout au long de son exécution.

(11)

4 Introduction

synchronisations entre des threads. Citons par exemple les verrous, les sémaphores, ou encore les canaux de communication synchrones.

Toutes ces formes de ressources exposent effectivement ce schéma d’allocation/utilisa-tion(s)/destruction propre aux ressources dynamiques.

Les enjeux de la maîtrise de ce type de ressources paraissent importants. En particulier, pour toutes les ressources précédemment citées, les coûts d’allocation et de destruction sont souvent conséquents, et il convient donc d’utiliser au mieux les ressources mises à disposition d’un système. Ce type de problématique passe avant tout par la bonne délimitation du cycle de vie des ressources en question, pour permettre ensuite la meilleure réutilisation possible des ressources déjà allouées. Ce problème peut paraître simple lorsque l’on dispose des différents instants au cours desquels ont lieu les principaux événements liés aux ressources. Toutefois, dans des systèmes concurrents, où non seulement les ressources sont mobiles, mais où en plus les fils d’exécution sont eux-mêmes dynamiques, ce type de problématique devient rapidement complexe.

1.2 Problématiques

Plusieurs problématiques liées à la gestion des ressources dynamiques se révèlent intéres-santes. Nous les présentons informellement dans cette section.

1.2.1 Construction d’espaces d’états

Une première problématique concerne la construction d’espaces d’états représentant le comportement des systèmes concurrents et dynamiques. Il s’agit là d’un thème classique, mais non trivial.

Pour leπ-calcul, cette construction est rendue difficile entre autres par la forte dynamicité

des systèmes et par le fait que la génération dynamique des noms dépend essentiellement de propriétés sémantiques. Un raisonnement du point de vue de l’utilisation des ressources peut servir cette construction. En particulier, leπ-calcul étant déjà une abstraction du

com-portement d’un système concurrent, il peut être intéressant de répercuter les différences de nature de ressources dynamiques dans l’abstraction, et de ne considérer certaines catégories de ressources seulement lors de la construction d’un espace d’états. De plus, cette idée per-mettrait d’aborder la problématique de représentation en un espace fini de comportements de processus au contrôle infini mais au nombre de ressources nécessaires fini.

1.2.2 Profils de ressources

De la même façon que l’espace d’états représentant le comportement général d’un système concurrent permet l’analyse de celui-ci, on souhaite s’intéresser à la représentation permet-tant l’analyse des manipulations de ressources dynamiques effectuées par un système. On s’intéresse alors uniquement à une sous-partie du comportement relatif à ces manipulations. On appelle profil de ressources le modèle informel représentant la forme des allocations / utilisations / libérations de ressources dynamiques. Une problématique est alors de fournir un modèle concret pour ces profils de ressources, qui permettrait d’effectuer la comparaison

(12)

1.3. Approche de la thèse 5

de deux profils ainsi que d’envisager par la suite la vérification de propriétés logiques de ressources.

En particulier, la construction d’un tel modèle de ressources peut être en fait effectuée à travers une nouvelle abstraction depuis l’espace d’états d’un système.

1.2.3 Quantification des ressources

La quantification des ressources nécessaires à la bonne exécution d’un système est d’inté-rêt. Un tel résultat est un indicateur fort du comportement d’un système. Du point de vue de la vérification formelle des systèmes, il permet de conclure par exemple si l’exécution d’un système sur un dispositif embarqué, ne bénéficiant que de peu de ressources, est possible. Du point de vue de la programmation de ces systèmes, il permet la clarification et l’optimisation d’une partie de la gestion des ressources dynamiques, notamment par l’allocation statique d’un nombre suffisant de ressources attribuées ensuite à la demande.

Enfin, pour l’étude des systèmes concurrents et dynamiques, la quantité de ressources dynamiques que leur exécution requiert est une vue de leur complexité, dans l’idée de la complexité en espace des programmes. De la même façon que pour cette dernière, on peut envisager la synthèse de plusieurs bornes de ressources significatives : pour une exécution donnée, dans le pire-cas ou encore, en moyenne.

Bien qu’un résultat quantitatif semble simple sous sa forme finale, son calcul n’en reste pas moins difficile. Nous prouvons dans cette thèse que ce calcul, pour le pire-cas, fait intervenir la résolution d’un problème NP-complet.

1.3 Approche de la thèse

1.3.1 Présentation de l’approche

Dans le cadre d’analyses de ressources, en particulier quantitatives, il est utile de considérer celles-ci comme de simples identifiants, des valeurs permettant de les manipuler quelles que soient leurs types ou les opérations qu’elles offrent. On traite alors les ressources comme des noms purs [Needham, 1990], de simple identités de ressources dépourvues de structures et d’informations autres que leur nom. Cette approche est en fait similaire à la façon dont les noms de canaux sont gérés dans leπ-calcul : la ressource qui représente un canal est

effectivement utilisée lors d’une communication à travers celui-ci, mais l’envoi d’un canal est par contre effectué au travers de son handle (sorte de descripteur de canal sous la forme d’un nom pur) uniquement. L’approche par les noms purs nous amène donc naturellement vers les calculs nominaux, et vers un développement d’analyse sur une base théorique, puisque reposant sur des problèmes fondamentaux non triviaux des algèbres de processus dont nous avons discuté précédemment. De plus, la théorie ainsi développée peut être adaptée à de nombreux contextes dans lesquels l’étude des ressources dynamiques est d’intérêt.

Le point de départ de notre étude est l’abstraction du comportement d’un système vers un processus enπ-calcul. Pour cette abstraction, nous proposons un passage facultatif à travers

(13)

6 Introduction

système concurrent. Durant cette abstraction, l’idée directrice fait correspondre un nom à chaque ressource en jeu.

Ensuite arrivent les problématiques de la construction d’un espace fini d’états qui permet-tra à son tour l’analyse effective du système via l’abspermet-traction. Nous proposons dans cette thèse des méthodes de constructions de ces espaces pour les processus finitaires.

Une seconde abstraction est alors nécessaire, pour basculer depuis l’espace des comporte-ments complets des systèmes vers celui des ressources dynamiques. L’approche choisie est fondée sur un formalisme de type automate, permettant l’abstraction des branchements du systèmes pour ne considérer que des traces d’événements de ressources. Notons par ailleurs qu’il serait possible, pour certains systèmes et comportements, de construire directement des

ν-automates sans passer par le π-calcul. Un des bénéfices majeurs de cette approche serait

alors la possibilité de construire un modèle de ressources pour un système à ressources finis mais à contrôle infini. Cette approche fera l’objet de travaux ultérieurs à cette thèse.

À partir de ce modèle d’automates, nous élaborons finalement une brique algorithmique permettant de synthétiser des bornes (majorants de quantités de ressources) ainsi que l’indice (plus petite borne) de ressources recherchés initialement.

Ce cheminement entre les différents modèles et formalismes manipulés dans cette thèse est illustré par la figure 1.1. Les contributions de nos travaux y sont marquées par des rectangles aux bords non arrondis, ainsi que par des étiquettes numérotées.

1.3.2 Contributions

1 Piccolo Nous avons souligné le fait que les programmes multithreadés sont un exemple de systèmes concurrents et dynamiques. Ils sont utilisés pour ce qu’ils sont, mais peuvent aussi être utilisés à des fins de modélisation / simulation de ce genre de systèmes. Nous présentons un langage de programmation fortement concurrent et parallèle, essentiellement fondé à partir des primitives duπ-calcul. Ainsi, il permet tant la programmation que la modélisation

de systèmes concurrents, tout en réduisant le plus possible l’effort nécessaire à leur abstraction vers unπ-calcul, à des fins d’analyse.

2 Slice-π Nous avons présenté l’importance d’abstraire le comportement des programmes et systèmes à analyser vis-à-vis des propriétés à étudier. Nous nous basons pour cela sur le formalisme duπ-calcul. En particulier, nous présentons slice-π une variante du π-calcul pour

les exécutions dans laquelle les possibilités d’observations de l’environnement sont flexibles. De plus, sa sémantique opérationnelle est, elle aussi, flexible et permet ainsi d’affiner ce qu’il est possible d’observer dans les transitions.

3 Espaces d’états pour le π-calcul Nous proposons une technique pour la construction d’espaces d’états pour des processus à contrôle fini exprimés enπ-calcul. Notre approche

permet de considérer plusieurs processus de manière indépendante, mais autorise tout de même la vérification de bisimulation entre eux, et l’application d’algorithmes classiques et efficaces pour la minimisation des espaces d’états. La contrepartie de cette contribution est une bisimulation un peu plus restrictive que celles considérées jusqu’alors dans la littérature.

(14)

1.3. Approche de la thèse 7

Systèmes concurrents et dynamiques

Piccolo π-LTS (Observations) Slice-π (Exécutions) π-calcul Graphes d’états ν-automates Ramasse-miettes omniscient (inducteur, récurseur)    Résultats quantitatifs : borne de ressources, indice de ressources. 1 2 3 4 5 Program-mation Abstraction M odél isat ion du comp or temen t Analyse Modélisation des utilisations de ressources Analyse

(15)

8 Introduction

4 ν-automates Les systèmes à transitions étiquetées sont largement utilisés pour représen-ter les différents états accessibles depuis un certain processus et selon une sémantique donnée. Nous proposons, dans la même idée, un formalisme d’automates ayant la capacité d’embar-quer des informations concernant les ressources dynamiquement créées et manipulées par un système : lesν-automates. Ces automates ont la particularité de ne manipuler que des noms

symboliques, et ainsi de reconnaître des langages dont l’alphabet est potentiellement infini et représente des traces d’utilisations de ressources d’un système. Des analyses de ressources peuvent alors être conduites directement sur ces langages, appelésν-langages.

5 Cadre algorithmique pour l’analyse des ressources À la différence des systèmes à transi-tions étiquetées, nosν-automates abstraient la signification des branchements des

proces-sus pour ne considérer que des traces de ressources. Ces traces permettent des analyses de ressources, entre autres des pire-cas puisque l’on dispose de tous les chemins d’exécution possibles (dans lesquels les ressources présentent un intérêt). Nous introduisons un cadre algorithmique générique, opérant sur le graphe représentant unν-automate. Ce cadre est

mise en place à travers, tout d’abord, un outil de définition d’algorithmes sur unν- automate

(les récurseurs) et, ensuite, un outil de preuve de correction de ces algorithmes (les induc-teurs). Nous concrétisons cette boîte à outils algorithmiques par la définition d’algorithmes d’analyses quantitatives des ressources nécessaires à l’exécution d’un système concurrent (bornes et indices de ressources).

1.4 Plan de la thèse

Ce document est organisé en trois parties. Dans la première, Contexte, nous présentons tout d’abord les méthodes existantes pour l’analyse de ressources en environnement multithreadé et concurrent, et nous détaillons à l’aide d’exemples concrets les problématiques de notre sujet.

Le Chapitre 2 décrit l’état de l’art, depuis les techniques possibles d’analyse pour le

π-calcul jusqu’à l’analyse de ressources pour les systèmes concurrents en général. Nous reconsidérons le schéma de la figure 1.1 afin de discuter des solutions existantes et des possibilités et difficultés à les adapter à nos problématiques de ressources.

Le Chapitre 3 est un approfondissement des motivations et des problématiques étudiées dans cette thèse et décrites succinctement dans cette introduction. Sur la base d’exemples concrets de modélisations et d’implémentations dans le langage Piccolo, nous examinons différents schémas de gestion de ressources et les bénéfices que peuvent apporter des analyses automatiques.

La seconde partie, Analyse de ressources, est la partie centrale de cette thèse. Elle introduit le modèle théorique sur lequel sont basées nos analyses (lesν-automate), ainsi que le modèle

(16)

1.4. Plan de la thèse 9

Le Chapitre 4 présente une des contributions majeures de notre travail : il s’agit du forma-lisme desν-automates. Ces automates permettent de traiter des langages définis sur des

alphabets infinis, après abstraction des seules ressources dynamiques manipulées par les systèmes, et les traite finalement sous la forme de noms purs. Nous présentons également des variantes de ce modèle d’automates à ressources, ainsi que les fondations théoriques nécessaires à l’établissement d’analyses quantitatives. Également, nous introduisons dans ce chapitre la notion de programmes de ressources, abstraction permettant la construction triviale deν-automates depuis de tels programmes.

Le Chapitre 5 introduit les algorithmes correspondant aux analyses décrites au niveau desν-automates. Ces algorithmes sont exprimés dans un cadre générique afin de pouvoir

développer d’autres types d’analyses de propriétés sur les ressources dynamiques. Ce cadre générique que nous définissons permet également de mettre en œuvre de manière claire les preuves de correction des algorithmes, ainsi que de raisonner sur leur complexité de manière modulaire.

La troisième partie de cette thèse, Expérimentations, rend compte de la démarche expéri-mentale. Elle est constituée d’une part, de méthodes pour l’abstraction des utilisations de ressources depuis leπ-calcul, et, d’autre part, d’un compte-rendu des tests effectués à la suite

de l’implémentation d’un prototype réalisant les analyses décrites dans la partie précédente. Le Chapitre 6 regroupe deux résultats importants. D’abord, il y est présenté une séman-tique pour leπ-calcul permettant une construction efficace d’espace d’états, pour des

processus, de manière indépendante. Ensuite, la variante slice-π est présentée, et sa

sé-mantique flexible autorisant l’observation des ressources adaptable au système à étudier. Le Chapitre 7 présente les résultats expérimentaux obtenus depuis les prototypes déve-loppés dans le cadre de cette thèse. On y décrit en particulier un outil d’abstraction des ressources de termesπ-calcul, ainsi que l’outil implantant l’analyse quantitative décrite

dans ce manuscrit.

Enfin, le dernier chapitre est, quant à lui et tout comme l’est cette introduction, indépendant de toute partie.

Le Chapitre 8 constitue une synthèse de ce travail de thèse, ainsi qu’un survol des pistes envisageables pour approfondir ce sujet ou explorer des sujets connexes, comme l’étude de certains processus à contrôle infini par exemple.

Ensuite, des chapitres annexes permettent le rappel de certains concepts importants dans ce travail.

L’Annexe A résume certaines notations importantes utilisées tout au long de ce document. L’Annexe B synthétise différentes sémantiques existantes duπ-calcul et certaines de leurs

spécificités. Certains chapitres pourront en effet faire appel aux notions qui sont rappelées ici.

(17)

10 Introduction

L’Annexe C rappelle le formalisme des automates à mémoire finie avec lesquels sont comparés nosν-automates du point de vue de l’expressivité.

L’Annexe D présente le langage de programmation multithreadée Piccolo. Il est conçu sous la forme d’un tutoriel dans lequel sont introduites les constructions du langage et leurs spécificités à travers des exemples concrets.

(18)

Première partie

(19)
(20)

C

H AP ITRE

2

É

TAT DE L

ART

D

E LA MODÉLISATIONdu système concurrent et dynamique jusqu’à l’analyse de ses res-sources, en passant par les techniques d’abstraction de son comportement ainsi que de l’usage qu’il fait des ressources dynamiques, des points très différents ont été abordés durant l’introduction. Dans ce chapitre, nous reprenons ces formalismes, techniques, et probléma-tiques, en considérant cette fois les travaux existants dans la littérature.

Dans une première section, nous considérons d’abord la question de la modélisation des systèmes et des programmes vers leπ-calcul. La seconde section est un état de l’art de

l’analyse de ressources pour les processus, avec en particulier une présentation des principaux formalismes d’automates dont les mots reconnus sont définis sur des langages infinis. Ces automates sont en effet centraux dans notre travail puisqu’il permettent la représentation des traces d’utilisations de ressources en quantité non bornées. Enfin, une présentation de diverses techniques pour l’analyse comportementale pour les processus enπ-calcul est proposée, avant

une synthèse en dernière section.

2.1 Des systèmes concurrents au

π-calcul : modélisation et

programmation

Un grand nombre de langages de programmation offrent des fonctionnalités permettant la mise en parallèle de plusieurs fils d’exécution ainsi qu’un modèle de concurrence. Pour ce qui est de la modélisation des systèmes, une idée est d’abstraire directement ce type de programmes vers des algèbres de processus.

Par exemple, le langage Erlang [Armstrong et al., 1993a] propose une couche concurrente par passage de messages, basée sur le modèle des acteurs. Des travaux présentent des schémas de traduction de programmes Erlang vers des processus enπ-calcul [Noll et Roy, 2005]. La

(21)

14 État de l’art

les valeurs, et des optimisations ont ensuite été proposées [Roy et al., 2006] afin de refléter au mieux dans les processus finaux la sémantique du choix gardé du langage de départ.

D’autres langages sont quant à eux délibérément construits à partir des constructions même offertes par les algèbres de processus. Pour leπ-calcul, on citera d’abord le langage

Pict [Pierce et Turner, 2000], qui propose l’implémentation d’unπ-calcul asynchrone. Le

lan-gage Occam-π1rassemble quant à lui différents traits duπ-calcul ainsi que de CSP, ce qui

a permis d’abstraire un programme directement, par exemple, en CSP pour l’établissement d’une analyse compositionnelle d’échappement d’objets mobiles [Barnes, 2009]. Le langage ConcurrentML [Reppy, 2011] intègre des communications synchrones en tant qu’objets de première classe, et a influencé le langage Manticore [Fluet et al., 2007] qui permet tant la concurrence dans le style de ConcurrentML que le parallélisme au niveau des structures de données manipulées.

La communication par messages est en fait adoptée par de nombreux langages de pro-grammation modernes. Parmi eux, Go2, Clojure3muni de la librairie core.async, ou encore Haskell [Marlow, 2011] sont des langages proposant la communication entre un ensemble de processus arbitraires à travers des canaux. Un autre paradigme assez proche est le modèle des acteurs, permettant quant à lui la communication entre les processus, non pas à travers des canaux mais en s’adressant directement aux autres entités du système. Il est central dans le Erlang [Armstrong et al., 1993b] ainsi que dans la couche de communication interprocessus du langage Scala [Haller et Odersky, 2009].

Parallèlement à l’élaboration de cette thèse, nous avons développé le langage Piccolo4, lui aussi fondé sur leπ-calcul et présenté en Annexe D. Il fait suite à des travaux dans lesquels

avaient été posées les bases d’un langage concurrent ne nécessitant pas de pile d’exécu-tion [Peschanski et Hym, 2006], ainsi qu’un concept de ramasse-miettes permettant de récu-pérer la mémoire occupée par des processus interbloqués [Peschanski, 2011]. Il nous a donc semblé naturel de nous reposer sur ce langage pour la modélisation des systèmes concurrents et leur analyse de ressources à suivre. Il est en effet un candidat idéal : du fait de sa forte proximité avec leπ-calcul, il est le langage qui minimise au mieux l’effort nécessaire pour

l’abstraction du langage de programmation/modélisation de systèmes concurrents vers les algèbres de processus.

2.2 Analyses de ressources

2.2.1 Notion préliminaire : les noms purs

Le terme de "nom pur" a d’abord été introduit par Needham dans le contexte des systèmes distribués [Needham, 1990]. Nous ne saurions mieux le définir qu’en le citant directement :

« Un nom pur n’est rien d’autre qu’un ensemble de bits constituants un identi-fiant, et est utile uniquement à des fins de comparaison d’identité avec d’autres

1. http ://pop-users.org/occam-pi/ 2. https ://golang.org/

3. http ://clojure.org/

(22)

2.2. Analyses de ressources 15

ensembles de bits (cela inclut des recherches dans des tables pour éventuellement accéder à d’autres informations). Cette notion contraste volontairement d’avec les noms, qui portent de l’information par examination des noms eux-mêmes, soit par la lecture du texte du nom, soit autrement. [...] comme d’autres bons concepts en sciences informatiques, les noms purs aident en ajoutant une indirection supplémentaire, mais ne sont réellement bons pour rien d’autre. »5

Comme souligné dans [Gordon, 2000], les algèbres nominales, comme leπ-calcul,

ma-nipulent des noms purs : les noms de ce type de calculs sont des identités comparables ne portant aucune autre information. En cela, les noms purs sont une abstraction idéale pour l’identification des ressources dynamiques manipulées par les systèmes que nous considérons. Les noms purs répondent effectivement aux simples exigences des noms (fraîchement géné-rés) duπ-calcul : la possibilité de générer des noms frais et non devinables, et un opérateur

de comparaison de noms.

Les noms purs sont en fait, bien qu’initialement introduits dans le contexte des sys-tèmes distribués, applicables à bien d’autres domaines. Dans le domaine de la concurrence, leπ-calcul permet la génération de canaux de communication. On cite également le

spi-calcul [Abadi et Gordon, 1999] dans lequel des noms purs sont générés pour représenter des clés cryptographiques pour la vérification de protocoles de sécurité. En programmation fonc-tionnelle, différents langages étendent leλ-calcul avec des fonctionnalités assimilables à

la génération d’entités fraîches, par exemple la génération de références vers des cellules mémoire mutables. Plus généralement, le concept de scope lexical repose sur l’idée selon laquelle chaque identifiant doit rester localement frais. Cette création dynamique de nom se retrouve également durant l’exécution, avec la création de handle à l’ouverture d’un fichier par exemple, ou encore la compilation de programmes, avec notamment la fonction gensym des langages Lisp permettant la génération d’identifiants frais.

Les noms purs et leur génération apportent des difficultés sémantiques, mais également dès la manipulation des termes syntaxiques d’un formalisme [Miller et Palamidessi, 1999]. Concernant les aspects sémantiques, des travaux ont été réalisés afin de généraliser ces opérations de génération de noms purs. Leν-calcul [Pitts et Stark, 1993] est un λ-calcul étendu

d’un opérateur de génération de nom frais sur lequel a été fondée une théorie permettant de raisonner sur ces noms à un niveau sémantique [Stark, 1994, Stark, 1998]. Cette approche s’illustre notamment par sa mise en œuvre dans plusieurs langages de programmation (ou de meta-programmation) [Shinwell et al., 2003, Lakin et Pitts, 2012], systèmes de réécriture de termes [Fernández et Gabbay, 2007], ou encore formalisations d’algèbres de processus (et notamment leπ-calcul [Milner et al., 1992a, Milner et al., 1992b, Sangiorgi et Walker, 2001]),

contenant des occurrences liées de noms.

2.2.2 Analyses de ressources

Après le choix d’un abstraction pour les ressources, il s’agit de s’intéresser aux différentes analyses concrètes qu’il est possible de conduire dessus. Nous considérons d’autres analyses que celles pouvant être menées sur leπ-calcul, puisque la section 2.3 est dédiée à ce thème.

(23)

16 État de l’art

La majorité des travaux d’analyse de ressources menées sur les abstractions de type auto-mates à mots sur alphabets infinis sont relatives au contrôle de ressources. L’objectif est alors de montrer qu’un système se comporte de manière conforme à une spécification, elle-même souvent exprimée grâce à un automate.

C’est le cas des travaux de vérification de modèles à partir des automates d’utilisations

de ressources [Bartoletti et al., 2008] (UA). Ces automates sont construits directement à partir

d’une algèbre de processus simplifiée, au nombre de processus fixe, et dont la sémantique génère des traces d’utilisations de ressources qui peuvent être mises directement sous la forme d’automates. Les transitions sont étiquetées par une fonction (par exemplenew,open,read

ou encoreclose) appliquée à un identifiant de ressource. Les propriétés de sûreté concernant l’utilisation des ressources est alors effectuée via des techniques par vérification de modèles. La même algèbre de processus qui donne lieu à des UA a permis l’application de la vérification de modèles à partir d’automates à variables finies [Grumberg et al., 2010] (VFA) en utilisant les techniques nominales [Gabbay et Pitts, 2002] dans [Degano et al., 2012].

Enfin, concernant le dénombrement des ressources nécessaires à l’exécution à un système, plusieurs travaux abordent les problèmes de décidabilité, souvent en connexion avec les réseaux de Petri [Amadio et Meyssonnier, 2002, Rosa-Velardo et de Frutos-Escrig, 2009]. En particulier, dans [Hüchting et al., 2013] est introduit la classe des systèmes infinis pour laquelle la réponse à la question de bornes sur les noms est positive. Il est particulièrement remarquable que le problème de l’accessibilité soit d’ailleurs décidable pour cette classe.

Une autre approche envisageable est d’enrichir la sémantique des modèles, comme par exemple dans [Amadio et Dal-Zilio, 2004] où une analyse de borne de ressources est proposée pour une variante synchrone et réactive duπ-calcul.

Nous présentons dans la suite différents formalismes d’automates, centraux dans l’analyse de ressources puisqu’ils permettent entre autres de caractériser les mots faits de symboles issus d’alphabets infinis, assimilables à l’ensemble des noms purs, identifiants de ressources dynamiques manipulées par un système.

2.2.3 Automates pour mots sur alphabets infinis

Chaque analyse de ressources repose sur une abstraction adaptée. Nous passons donc en revue, dans cette section, en particulier les formalismes d’automates et de langages associés permettant de manipuler les mots construits sur la base d’alphabets infinis. Ces alphabets infi-nis reflètent alors les ensembles infiinfi-nis de noms purs représentant les ressources dynamiques, tandis que les mots reflètent les différentes traces générées par un système concurrent.

Pour posséder une représentation finie alors que les symboles qu’ils lisent sont issus d’un domaine infini, ce type d’automates nécessite la mise en place d’une forme de mémoire, afin de retenir les symboles lus et de pouvoir les comparer à d’autres symboles des mots par la suite. Plusieurs mécanismes ont été introduits dans ce but : mémoire implicite, registres explicites ou encore dépôt de galets pour retenir une information.

(24)

2.2. Analyses de ressources 17

2.2.3.1 Automates à mémoire finie

Un des premiers formalismes permettant de manipuler des mots définis sur des alphabets infinis est celui des automates à mémoire finie [Kaminski et Francez, 1994] (FMA). Il reste d’ailleurs un des plus emblématiques types d’automates de ce genre, et est utilisé dans de nombreux travaux à des fins de comparaisons, notamment d’expressivité.

Les FMA consistent en des automates classiques accompagnés d’un ensemble de registres. Les états de l’automate sont optionnellement annotés de l’adresse du registre dans lequel enregistrer le prochain symbole lu, et les étiquettes des transitions consistent également en des noms de registres desquels le contenu doit correspondre au symbole lu pour que la transition puisse avoir lieu. De cette façon, l’utilisation de la mémoire explicite mise à disposition dans ce modèle est régie par des règles très contraintes, afin qu’il ne soit pas possible de tirer parti des capacités de mémorisation des symboles pour autre chose que l’extension du test d’égalité classique entre symboles à des symboles issus d’un alphabet infini.

Les FMA sont alors des reconnaisseurs de langages dits quasi-réguliers, extension naturelle des langages réguliers aux alphabets infinis. Les définitions relatives au fonctionnement détaillé des FMA figurent dans l’annexe C.

Une variante déterministe des FMA est présentée dans [Francez et Kaminski, 2003], et permet la mise en place de définition de minimisation de FMA, qui passe en particulier par la minimisation du nombre de registres nécessaires à la reconnaissance d’un langage donné [Benedikt et al., 2010].

Différentes extensions des FMA ont vu le jour dans la littérature. Parmi elles, les

auto-mates à registres frais [Tzevelekos, 2011] (FRA) ont été proposés. Cette extension confère aux

automates à alphabets infinis la possibilité d’exprimer la fraîcheur globale, à travers l’enregis-trement (hors registres) de tous les noms rencontrés jusqu’alors durant la reconnaissance d’un mot. Ainsi, le phénomène de la génération des noms frais enπ-calcul par exemple, peut être

capturé par un FRA. Un exemple élémentaire est le langage Lformé des mots arbitrairement longs et constitués de symboles tous distincts deux à deux :

L=σ1σ2···σn | ∃i, j,1 ≤ i < j ≤ n t.q. σi= σj

2.2.3.2 Automates à galets

Une alternative au stockage d’un sous-ensemble fini de symboles et des tests d’égalité entre ces symboles, certaines approches stockent un ensemble fini de positions sur les mots, et autorisent ensuite des tests d’égalités entre les symboles présents à ces positions. Ces positions particulières sont marquées par des galets, et l’approche donne lieu aux automates à

galets [Neven et al., 2004] (PA). L’expressivité de ces modèles dans le cas général va bien au-delà

des langages quasi-réguliers, et une expressivité restreinte est alors obtenue en contraignant le dépôt des galets, notamment sous forme de pile uniquement.

Les automates à galets sont connus pour être plus pratiques que les automates à mémoire finie lorsqu’il s’agit de considérer leurs connexions avec la logique.

(25)

18 État de l’art

2.2.3.3 Automates à données

Un mot à données est un mot dans lequel chaque position est accompagnée d’une étiquette issue d’un alphabet fini ainsi que d’une donnée issue d’un alphabet infini. Les automates à

données [Boja ´nczyk et al., 2006] (DA) qui permettent de reconnaître de tels mots sont compo-sés de deux structures : un transducteur permettant une première reconnaissance de mots et un NFA traitant la sortie du transducteur. Le procédé de reconnaissance d’un mot à données passe donc par deux automates, et fait appel à un alphabet fini supplémentaire pour conserver des états finis.

2.2.3.4 Automates à variables

D’après les auteurs de [Grumberg et al., 2010], les automates à mémoire, à galets, ou à données échouent le critère indispensable de la simplicité. Plus précisément, le processus de reconnaissance d’un mot est jugé trop éloigné de celui des classiques NFA.

Les automates à variables ont pour vocation de réintroduire cette proximité avec les NFA. Ils consistent en des automates classiques, nommés automates de schémas, dont l’interpré-tation est réalisée à l’aide d’un alphabet infini formé de symboles mais aussi de variables parcourant l’alphabet infini. L’ensemble des variables est constitué de variables liées (toutes les occurrences doivent correspondre au même symbole pour un mot donné) ainsi que d’une unique variable libre (n’importe quel symbole peut lui correspondre à tout moment).

Comme pour les autres types d’automates, des variantes du formalisme de base sont étu-diées, comme la variante déterministe. En particulier, une version permettant de reconnaître des mots infinis (sur des alphabets infinis également) est considérée ; elle est basée sur des automates de Büchi en tant qu’automates de schémas.

2.2.3.5 Automates à gardes

L’expressivité des automates pour mots sur alphabets infinis comme introduits précédem-ment peut ne pas être suffisante pour l’expression de certains problèmes. Les automates à

variables gardées (GVA) sont introduits dans [Belkhir et al., 2013] et présentent des transitions

entre états gardées par des tests logiques sur les variables manipulées par l’automate. L’objectif est d’enrichir le modèle des VA, tout en permettant de se reposer sur les fondations introduites avec ce modèle d’automates.

Les GVA sont finalement strictement plus expressifs que les FMA ainsi que les VA. En plus des gardes, ils munissent certains états d’une fonctionnalité de remise à zéro de variables choi-sies. Les gardes permettent en fait de surcharger les comparaisons entre symboles consommés, de manière à rendre les tests d’égalité plus fins que ceux mis en place dans les registres des FMA par exemple.

2.3 Analyses comportementales pour le

π-calcul

Des rappels duπ-calcul figurent en annexe B. Cette présentation classique parcourt le π-calcul depuis sa syntaxe jusqu’à plusieurs sémantiques utilisées dans notre travail. Les

(26)

2.3. Analyses comportementales pour leπ-calcul 19

définitions de processus finitaires ainsi que de processus à contrôle fini y sont également rappelées.

Nous considérons dans cette section les techniques générales d’analyses du comportement de processus enπ-calcul.

2.3.1 Approche explicite et approche implicite

Tout d’abord, les techniques de vérification pour les algèbres de processus en général peuvent être séparées en deux grandes catégories : les approches explicites et les approches implicites.

La catégorie des approches explicites correspond à des techniques de vérification pour lesquelles il est nécessaire de d’abord construire un espace d’états représentant le modèle, pour appliquer des algorithmes de vérifications sur cet espace dans un second temps. Un des avantages est donc qu’il permet de séparer la problématique de représentation du com-portement d’un processus des algorithmes de vérification que l’on appliquera dessus. En particulier, il sera possible, sous certaines conditions, de réutiliser des algorithmes d’analyse existants. Par exemple, on pourra, dans certains cas, appliquer directement un algorithme efficace de vérification de bisimulation par raffinement de partitions [Paige et Tarjan, 1987, Kanellakis et Smolka, 1990] pour établir la bisimilarité entre deux processus ou bien pour minimiser une représentation à états.

L’approche implicite correspond quant à elle aux techniques de vérification dans lesquelles la vérification est effectuée "à la volée". L’avantage de cette approche est qu’elle permet de prouver certaines propriétés pour des processus dont la représentation du comportement contiendrait un nombre infini d’états. Par contre, les algorithmes sont alors ad-hoc et pas toujours aussi efficaces que ceux de l’approche explicite. Cette approche "à la volée" a été appliquée à la vérification de l’équivalence comportementale [Fernandez et Mounier, 1991, Lin, 2000], ainsi que pour l’établissement du Mobility Workbench [Victor et Moller, 1994], pre-mier outil de vérification pour leπ-calcul.

Dans cette thèse, nous avons choisi de nous concentrer sur l’approche explicite, puis-qu’elle permet d’une part, de mieux séparer les différentes problématiques, et d’autre part, parce qu’une de nos approches pour l’analyse de ressources est de construire un modèle de ressources directement depuis une représentation explicite du comportement du système étudié.

2.3.2 Contrôle fini, infini, processus finitaires

Dans le cadre de la vérification pour leπ-calcul, et en particulier pour la construction d’un

espace d’états, on considère en général deux familles de processus :

— Les processus finitaires ont un nombre d’états fini. Toutefois, l’appartenance d’un processus à cette classe est une propriété sémantique non décidable.

— Les processus à contrôle fini correspondent aux processus n’utilisant pas de définition appelée récursivement au sein d’une composition parallèle. Cette propriété est syn-taxique et facilement identifiable, mais correspond à une restriction forte des processus finitaires.

(27)

20 État de l’art

P ()

b y.P () ax.0 | P()

ax.0 | by.P() ax.0 | ax.0 | P()

ax.0 | ax.0 | by.P() ··· ax b y b y ax ax b y b y ax ax b y b y ax

FIGURE2.1 – Système de transitions du processus à contrôle infini P ()

Considérons par exemple la définition de processus suivante :

P () def= ax.0 | by.P()

Le processus P () ne répond pas aux exigences syntaxiques de la définition de processus à contrôle fini. La divergence du comportement de ce processus est illustré par la figure 2.1.

D’autres catégories de processus intéressantes dans le cadre de la vérification automa-tique sont présentes dans la littérature. On cite par exemple les classes de processus bor-nés [Hüchting et al., 2014] en profondeur (longueur de la plus longue chaîne de communi-cation bornée), en largeur (nombre borné de processus en parallèle partageant un nom) ou encore, en noms (nombre borné de noms partagés). Cette dernière notion présente d’ailleurs une similarité avec nos analyses quantitatives de ressources pour leπ-calcul, nous rediscutons

de ce point ultérieurement.

La majorité des travaux évoqués dans cette sous-section ne fait référence qu’aux processus finitaires, le cas des processus à contrôle infini n’est abordé que dans des techniques d’analyse ne nécessitant pas la construction explicite d’un espace d’états.

2.3.3 Construction d’espaces d’états pour les processus

D’autres phénomènes que l’explosion du contrôle d’un processus peut être à l’origine d’un nombre infini d’états : il s’agit du choix des noms fait lors de réceptions ou encore lors d’émissions de noms frais. Les problèmes surviennent alors dans différents cas de figure, pour les sémantiques de transitions.

(28)

2.3. Analyses comportementales pour leπ-calcul 21

. . .

c(x1)

c(x2) c(x3) c(x4)

FIGURE2.2 – Exemple de transitions pour le processusGen(c)

Émission d’un nom frais Lors de l’émission d’un nom frais, il s’agit de choisir

convenable-ment ce nouveau nom, en fonction de ce que connaît déjà l’environneconvenable-ment (d’où la dépen-dance à l’historique duπ-calcul). Considérons par exemple le processus suivant :

ν(c)Gen(c) | Listen(c), avec 

Gen(c)def= ν(x) cx.Gen(c)

Listen(c)def= c(x).Listen(c)

Puisque les occurrences de x générées parGensont toutes fraîches, et donc toutes dif-férentes de celles rencontrées plus tôt, le nombre de transitions déclenchables est néces-sairement infini. Dans la figure 2.2 figurent plusieurs exemples de transitions parmi celles déclenchées par le processusGen(c).

Réception d’un nom : le cas de la sémantique précoce Pour ce qui est de la réception d’un

nom, nous considérons séparément les cas des sémantiques précoce et tardive. Pour le cas de la sémantique précoce, puisque l’instanciation du nom reçu est anticipé, il convient de consi-dérer à l’avance toutes les instanciations possibles du symbole reçu durant la construction de l’espace d’états. Ainsi, une branche d’exécution possible dans la suite du déroulement d’un processus ne sera pas oubliée. Alors, un simple processus c(x).0 génère lui aussi un espace d’états infinis, d’une forme semblable à celle de l’espace représenté dans la figure 2.2 (avec des réceptions à la place des émissions).

Réception d’un nom : le cas de la sémantique tardive Dans le cas de la sémantique tardive,

c’est un autre problème qui se pose. Cette fois, puisque le nom reçu est choisi uniquement lors de la communication et pas avant, une réception ne nécessite qu’une unique transition, dont l’étiquette est munie d’une variable à instancier ultérieurement. Le problème est, cette fois, de choisir le nom de cette variable, nécessairement frais pour éviter toute ambiguïté.

(29)

22 État de l’art

Choix d’un nom frais Le problème du choix d’un nom frais peut être résolu en utilisant

une séquence ordonnée de noms réservés pour les noms frais, puis de piocher au besoin le prochain nom disponible dans cette réserve. De cette manière, une unique transition est suffisante à chaque création de nom frais, et deux processus bisimilaires choisiront a priori le même nom dans la séquence puisqu’ils auront le même historique (en terme de transitions).

L’inconvénient de cette méthode est toutefois que, puisqu’un nouveau nom est choisi à chaque création de nom frais, le nombre de noms nécessaire peut être infini. Il suffit de considérer un processus qui boucle sur la création et l’émission d’un nom frais pour s’en convaincre. Par exemple, pour le sous-processusGen(c) de l’exemple précédent, on obtient la suite de transitions suivantes :

Gen(c)−−−→c(x1) Gen(c)−−−→c(x2) Gen(c)−−−→ ...c(x3)

Récupération des noms Il a toutefois été montré qu’il est possible, pour deux processus

finitaires, de construire deux systèmes à états en disposant seulement d’un nombre fini de noms [Dam, 1997]. Deux processus sont considérés conjointement dans l’optique de la vérification d’équivalence comportementale entre eux. Précisons que l’approche décrite n’associe pas un espace d’états unique à un processus : des espaces différents peuvent être obtenus depuis le même processus selon le processus avec lequel son comportement est comparé.

Pour obtenir un ensemble de transitions fini pour un processus comportant une partie cy-clique (et consommant donc possiblement une infinité de noms), il est nécessaire de récupérer les noms au fur et à mesure de leurs désallocations, de la même façon que les ramasse-miettes récupèrent la mémoire qui n’est plus utilisée dans les programmes compilés depuis certains langages.

Dans la sémantique duπ-calcul, on peut considérer qu’un nom est désalloué lorsqu’il

n’apparaît plus dans le processus. Mais cette politique de récupération n’est pas satisfaisante : deux processus équivalents peuvent ne pas récupérer leurs noms au même moment, et ainsi utiliser des noms frais différents lors de transitions pourtant correspondantes. C’est le cas des deux processus P et Q suivants :

P ν(x) c x.ν(y) d y.0

Q  ν(x) c x.(ν(y) d y.0 | ν(z) zx.0)

Les deux processus P et Q sont bisimilaires : leur comportement est d’envoyer un nom fraîchement généré sur le canal c, puis d’envoyer un second nom fraîchement généré sur le canal d . Prenons l’ensemble des nombres entiers comme espace de noms frais. Le processus

P génère alors les transitions suivantes :

P−−→ ν(y) d y.0c(1) −−→ 0c(1)

En effet, le caractère lié des émissions des transitions spécifie bien qu’il s’agit de l’émission d’un nom frais, et puisque le nom 1 n’apparaît pas comme libre dans le processus

(30)

intermé-2.3. Analyses comportementales pour leπ-calcul 23

diaire, il peut être récupéré de manière sûre pour la seconde transition. Le processus Q quant à lui, génère les transitions suivantes :

Q−−→ (ν(y) d y.0 | ν(z) z1.0)c(1) −−→ ν(z) z1.0c(2)

Ces comportements sont bien les mêmes : puisque le nom z est privé, la composante effectuant un envoi sur z est en fait bloquée. Toutefois, cette propriété sémantique étant non décidable statiquement, il n’est pas possible de récupérer de manière sûre le nom 1 cette fois-ci. Il apparaît toujours dans le terme à dériver ensuite, et est donc susceptible de faire partie d’une transition future.

Noms actifs Par la suite, une politique de récupération plus avancée a été mise en place

dans [Montanari et Pistore, 1995] (une approche similaire avait été proposée pour CCS avec passage de valeurs [Jonsson et Parrow, 1993]) : un nom peut être récupéré lorsqu’il n’est plus

actif, c’est-à-dire qu’il n’apparaîtra pas dans des transitions futures. Puisque deux processus

équivalents ont les même noms actifs, il est alors sûr de choisir le premier nom qui n’est pas actif lors de la génération de noms frais.

Malheureusement, cette approche ne fonctionne pas en présence de l’opérateur de com-paraison de nom [x= y] en π-calcul. Si cet opérateur est utilisé, décider si un nom est actif ou

non est aussi difficile que de décider de l’équivalence de deux processus.

Substitutions explicites Ensuite, les substitutions entre noms peuvent être rendues

expli-cites dans les transitions [Quaglia, 1996, Ferrari et al., 1996], et ainsi permettre une meilleure gestion du renommage possible des noms et de leur récupération.

Automates avec dépendances à l’historique (HDA) Les techniques de récupération des

noms actifs pour leπ-calcul ont finalement donné lieu à un type d’automates permettant

d’ap-procher les problématiques de génération de nom frais : il s’agit des History-Dependent

Au-tomata (HDA) [Pistore, 1999, Montanari et Pistore, 2005a, Montanari et Pistore, 2005b]. Les

HDA forment une abstraction sémantique généralisable, permettant la construction d’une forme normale caractérisant les noms actifs d’un processus. Les HDA permettent de repré-senter des calculs avec dépendance à l’historique, comme par exemple des processus en

π-calcul (selon la sémantique précoce) mais aussi des processus en CCS avec passage de

valeurs, ou encore des réseaux de Petri. Un HDA peut ensuite être déplié vers un automate traditionnel dans lequel la minimisation peut être effectuée par des algorithmes eux aussi traditionnels. Le support de l’opérateur de comparaison pose certains problèmes avec cette approche. En particulier, les comparaisons ne pouvant pas être réalisées de façon totalement statique ne sont pas supportées. Enfin, cette approche a donné lieu à un outil de vérifica-tion [Ferrari et al., 1998, Ferrari et al., 2005] pour les processusπ-calculs.

2.3.4 Algorithme de bisimulation pour la sémantique ouverte

Pour ses aspects compositionnels, la sémantique ouverte [Sangiorgi, 1996] semble plus intéressante que les sémantiques classiques duπ-calcul. Un algorithme ad-hoc a été conçu

(31)

24 État de l’art

pour vérifier la bisimulation selon cette sémantique [Pistore et Sangiorgi, 2001], dans le style des algorithmes de minimisation de modèle par raffinements de partitions.

Le graphe d’états de départ est un graphe dit saturé, qui résout les problèmes de noms actifs et affichent toutes les transitions symboliques tardives possibles. Le graphe contient alors des transitions dites redondantes, qui sont éliminées ensuite en même temps que le raffinement des partitions des états équivalents.

2.3.5 Autres techniques de vérification pour leπ-calcul

D’autres approches que la construction explicite d’un espace d’états permettent l’analyse de certaines propriétés de processusπ-calcul. Elles permettent d’ailleurs, pour la plupart, de

contrer les problèmes d’espaces d’états infinis des processus non finitaires en se concentrant sur la sémantique sans pour autant la dérouler de façon explicite.

Syntaxe et congruences Nous l’avons évoqué plus tôt : les noms liés dans les algèbres de

processus apportent des difficultés pour l’analyse, et ce dès la syntaxe. Un premier type d’ana-lyse, utile à d’autres analyses sémantiques, peut être la décision de l’équivalence syntaxique entre deux termes. En présence de noms liés et d’opérateurs binaires commutatifs ainsi qu’as-sociatifs, le problème de cette décision a été prouvée être au moins aussi complexe que la décision de l’isomorphisme entre deux graphes [Khomenko et Meyer, 2009], puisqu’il s’agit déjà là de la complexité de l’équivalence de termes contenant des opérations commutatives et associatives [Basin, 1994]. Ce point met en évidence une difficulté supplémentaire dans la construction en pratique d’espaces d’états pour des processus pour lesquels il est confortable de pouvoir prouver l’équivalence dès la syntaxe afin de réduire le nombre d’états potentiels des modèles.

Typage Le typage peut également être utilisé à des fins de vérification de propriétés sur

un programme. Il peut être vu comme une façon de catégoriser les données ainsi que les constructions d’un programme, et, à plus haut-niveau, d’étudier les articulations entre ces constructions.

La discipline du typage a été utilisée avec succès pour vérifier des propriétés complexes, comme la terminaison de termes enπ-calcul [Demangeon et al., 2009], ou bien raisonner,

tou-jours dans les algèbres de processus, sur les ressources manipulées [Igarashi et Kobayashi, 2005, Kobayashi et al., 2006].

Le typage a été plus récemment appliqué à l’étude quantitative des ressources dans le

π-calcul. Dans [D’Osualdo et Ong, 2015], un système de type permet de déterminer

l’apparte-nance au fragment des processus à profondeur finie duπ-calcul [Hüchting et al., 2013].

Logiques Parmi les techniques sémantiques de raisonnement sur des programmes, des

sys-tèmes et leurs propriétés, figure la logique. Dans notre contexte concurrent, on citera en parti-culier la logique de séparation [O’Hearn, 2007], extension de la logique de Hoare [Hoare, 1969], dont le principe est la séparation simultanée des propriétés et des programmes en plusieurs

Références

Documents relatifs

Bon, c’est sûr que la motricité fine, effectivement dans tous les exercices de motricité fine où on peut voir… parfois, c’est pas flagrant, il y a un enfant qui peut tout à

Lassées de vivre « à dix minutes de tout », elles essayent de se fondre dans le chic des soirées parisiennes et de pénétrer un monde qui n’est pas le leur.. A2

Propositions de réponses : Pour se fondre dans le monde parisien, Ely et Lila s’achètent des chaussures hors de prix, mentent sur leur adresse, font semblant de parler anglais

Ce compte-rendu rapide peut donner l’impression que cette thèse ouvre plus de questions qu’elle n’en résout, mais cela tient à la richesse du travail théorique

 (T et R sont de part et d’autre du segment [SU].) Tracer les segments [SR], [TU] et [RT].. I est le point d’intersection de [SU] et

La qualification juridique du texte numérique est le préalable indispensable à l ’étude des modalités d’application des droits d’auteur au document numérique par exemple,

Introduction...- 4 - Les enseignements tirés du récit le Luqmân - 10 - Leçon n°1 : la sagesse est un don d’Allah...- 10 - Leçon n°2 : les moyens d’obtenir la sagesse...- 11

Le diagramme d’exigences permet tout au long d’un projet de relier les exigences avec d’autres types d’élément SysML.. Précision sur