• Aucun résultat trouvé

Reconnaisseurs de ν-langages

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

4.1.3 Reconnaisseurs de ν-langages

Nous nous intéressons désormais à des machines permettant de reconnaître certaines sous-classes deν-langages : les ν-automates finis2. Pour cela, nous reprenons l’exemple 4.1 du programme de ressources P1et considérons leν-automate qui reconnaît le ν-langage que P1génère.

Exemple 4.3. Un reconnaisseur pour leν-langage généré par le programme P1

q0

N1 {νX , X , νX }

Nous ne détaillons pas ici la procédure qui permet de synthétiser unν-automate depuis

un programme de ressources. Les programmes de ressources étant largement inspirés des expressions rationnelles, la construction d’unν-automate correspondant peut être effectuée

sur la base de l’algorithme de [Thompson, 1968] qui effectue la construction d’un automate fini non-déterministe depuis une expression rationnelle classique3.

2. Nous présentons dans ce chapitre la variante finie desν-automates, mais discutons d’une possible variante

reconnaissant des mots infinis dans la conclusion de ce manuscrit (chapitre 8).

3. Nous n’abordons pas ici la question de la complétude de la traduction d’un programme de ressources en un

4.1. Profils de ressources 49

Ceν-automate N1ne comporte qu’un unique état. La répétition du programme de res-sourcesP1autorise le franchissement répété d’une transition reliant q0vers lui-même, q0

étant un état final duν-automate. Lors de chaque franchissement de cette transition :

— La variable X est allouée, ce qui est notéνX .

— X est ensuite utilisé, ce qui est noté X . — Enfin, X est libéré, ce qui est notéνX .

Lesν-langages reconnus par les ν-automates doivent permettre l’expression de la fraîcheur

des noms purs vis-à-vis d’autres noms purs déjà consommés dans unν-mot. L’exemple suivant

illustre cet aspect.

Exemple 4.4. Illustration de la notion de conflit entre variables

Cet exemple correspond à la reformulation du système informellement présenté en début de chapitre : un système utilisant dans cet ordre une ressource X , puis une seconde ressource Y , et enfin X à nouveau. Un programme de ressources correspondant au comportement de ce système est le suivant :

P2 atomic allocalloc(X ),(Y ) .use(X ).use(Y ).use(X ).atomic



free(X ),

free(Y ) 

.end

et leν-automate reconnaissant les traces de ce programme est le ν-automate qui suit :

q0

N2 {νX , νY } q1 {X } q2 {Y } q3 {X } q4 {νX , νY } q5

Comme nous l’avons déjà évoqué, les noms purs ne supportent nativement que deux opéra-tions élémentaires : le test d’égalité et le test d’inégalité. C’est sur cette possibilité de distinction entre identités de ressources que repose la discrimination des ressources au niveau desν-mots.

Leν-automate N2reconnaît lesν-mots de la forme suivante :

{}{νi}{νj}{νi}{}, avecνi,νj∈ V et i = j.

On rappelle que dans les mots ne figurent pas explicitement les allocations et les libérations (ici de X et de Y ). Les transitions entre les états q0et q1, ainsi qu’entre les états q4et q5, sont toutefois nécessaires afin d’allouer effectivement la mémoire, ainsi que pour la libérer, durant le processus de reconnaissance de ces mots. Les franchissements de ces transitions dans l’automate correspondent alors à la consommation d’ensembles {} vides deν-symboles. Nous

détaillons plus tard le processus complet de reconnaissance d’unν-mot par un ν-automate,

comprenant entre autres le rôle des fonctionnalités d’allocation et de libération de variables. Ensuite, il est important ici de distinguer les deux noms purs attribués aux variables de ressources X et Y , puisque celles-ci coexistent durant la transition reliant q2à q3. C’est en fait l’exigence de fraîcheur des noms purs nouvellement consommés par l’automate qui impose

50 ν-automates

cette distinction : lorsque Y est consommé pour la première fois (entre q2et q3), le processus de reconnaissance de l’automate a déjà attribué une identitéνià X (entre q1et q2), qui sera réutilisée ensuite (entre q3et q4). Le nomνjassocié à la ressource Y ne doit pas être confondu avecνi, car, les allocations n’étant pas explicitées dans leν-mot, on pourrait alors confondre

les deux ressources. On dira dans ce cas que les variables de ressources X et Y sont en conflit dans N2.

En comparaison, le programme de ressources dans lequel on remplace la deuxième uti-lisation de X par une utiuti-lisation de Y , génère desν-mots reconnus par l’automate suivant

:

q0

N2 {νX , νY } q1 {X } q2 {Y } q3 {Y } q4 {νX , νY } q5

Ici, les durées de vie, définies par les premières utilisations des ressources représentées par X et Y , ne se chevauchent pas : X est utilisé de q1à q2tandis que Y est utilisé de q2à q4. Les traces reconnues par N2 ont alors la forme suivante :

{}{νi}{νj}{νj}{}, avecνi,νj∈ V et sans contrainte supplémentaire.

Il n’y a plus lieu de forcer une distinction entre les deux ressources. Elles ne sont pas en

conflit, la seconde pourrait même tout à fait réutiliser l’identité de la première, dans un souci

d’économie de ressources. Par exemple, leν-mot ν1ν1ν1est une instance valide duν-langage

reconnu par N2. On parlera alors de réutilisation de l’identité de ressourceν1pour Y . Dans le but d’établir la relation de conflits entre variables de ressources manipulées par unν-automate, il est nécessaire de déterminer avec précision leurs durées de vie respectives.

Un point important est que les marqueurs d’allocation et de libération des ressources ne constituent en général qu’une surapproximation la durée de vie des ressources. Considérons par exemple un système allouant une ressource (dynamiquement) au début de son exécution. Si pour tous ses chemins d’exécution, la ressource en question n’est pas utilisée avant n étapes d’exécution, son allocation aurait pu être retardée, et la durée de vie estimée, entre allocation et libération, s’en serait retrouvée réduite.

La première utilisation d’une ressource revêt donc un caractère spécial : il s’agit de l’ins-tant optimal pour son allocation effective, c’est-à-dire le moment où le système a réellement besoin de cette ressource.

De la même manière, c’est lors de sa dernière utilisation que le nom pur lié à une variable de ressource pourrait être oublié, et donc potentiellement réutilisé pour identifier une autre ressource dans unν-mot.

Ces instants de première et dernière utilisations peuvent être difficiles à déterminer, même dans le cas où l’on connais la suite de l’exécution du processus.

Ces difficultés découlent des potentiels branchements du graphe d’unν-automate, et

impliquent que ces instants peuvent être multiples.

On illustre ces points par le prochain exemple, qui traite en particulier de l’instant de la première utilisation des ressources.

4.1. Profils de ressources 51

Exemple 4.5. Première utilisation d’une ressource dans unν-automate

q0

N3 {νX , νY } q1 q2 q3 q4

{Y }

{X }

{X ,νX } {Y ,νY }

Dans un premier temps, le système modélisé réserve des emplacements de ressources, nom-mément X et Y . Ensuite, il peut se comporter de deux façons différentes, selon la transition qu’il emprunte pour passer de l’état q1 à l’état q2. Dans un programme de ressources, ce type de comportement est exprimable à l’aide de l’opérateur+. Selon le chemin d’exécution

emprunté, les premières utilisations des ressources X et Y n’ont pas lieu au même instant. Par exemple, la première utilisation de X peut être celle entre q1et q2, ou bien celle entre q2et q3. Cette information ne peut pas être enregistrée en tant qu’annotation supplémentaire dans les transitions duν-automate puisqu’elle dépend de l’historique : si l’on annote la transition de q2vers q3comme une première utilisation de X , cette information est incorrecte pour un des deux chemins d’exécution possibles.

Cet exemple met en lumière un autre point important impactant sur les analyses que nous souhaitons établir par la suite. Considérons lesν-mots que N3reconnaît :



{}{νi}{νj}{νi} avec i= j, (1) {}{νi}{νi}{νj} (2)



, sans contrainte supplémentaire.

Dans le chemin de N3reconnaissant lesν-mots de la forme (1), les ressources X et Y sont en

conflit. Il y a donc une distinction, au niveau des noms purs, entreνireprésentant X etνj

représentant Y .

Dans l’autre chemin, X est utilisé deux fois puis détruit, puis Y est à son tour utilisé. Le nom purνjassocié dans (2) à Y peut alors réutiliser l’identitéνiprécédemment attribuée à

X . Les deux formes deν-mots ne présentent alors potentiellement pas le même nombre de

noms purs consommés. Lorsqu’il s’agira d’étudier la consommation en nombre de ressources d’un système modélisé par unν-automate, nous en étudierons tous les chemins possibles afin

d’en extraire le pire cas (il s’agit pour cet exemple desν-mots (1) consommant exactement

deux noms purs).

Les exemples précédents ont permis d’introduire informellement la notion de conflit entre variables de ressources (en particulier l’exemple 4.4) ainsi que la notion de réutilisation des noms purs pour les utilisations de variables de ressources non-conflictuelles (en particulier l’exemple 4.5). La fraîcheur des noms purs reste toutefois pour l’instant locale : un nom doit être frais vis-à-vis de ceux qui sont couramment utilisés dans le processus de reconnais-sance d’unν-automate. Le prochain exemple présente une autre facette des ν-automates : la

52 ν-automates

Exemple 4.6. Réallocation de variables dans unν-automate

Nous reconsidérons le cas du programme générateur de ressources P1 de la page 48. Le reconnaisseur des traces générées par ce programme est le suivant :

q0 {νX , X } N4

Ici, dès qu’une ressource a été dynamiquement générée, elle est utilisée une fois. À la différence de l’exemple 4.1 toutefois, la variable n’est pas libérée ensuite. Ainsi, elle continue d’exister, et les prochaines identités générées pour X doivent être, à chaque franchissement de l’unique transition de N4, fraîches vis-à-vis de toutes celles précédemment utilisées.

Dans notre contexte d’étude, cet aspect desν-automates peut par exemple être utilisé pour

représenter le comportement de composants qui génèrent des ressources et qui les envoie à d’autres composants. Le générateur ne connaît pas la durée de vie des ressources qu’il crée, puisqu’elle sont ensuite manipulées par un environnement non connu. Il doit alors s’assurer que les nouvelles entités qu’il génèrent ne seront pas confondues avec les précédentes.

Ce programme doit donc produire desν-mots de la forme :

{να1}{να2} . . . {ναn} avec∀i, j ∈ N,{ναi,ναj}⊂ V , et 1 ≤ i < j ≤ n =⇒ αi= αj.

Chaque ressource générée est garantie différente de toutes les autres. Le nombre de ressources alors générées peut ne pas être borné. Des distinctions par conflits dans l’automate pour représenter ces différences nécessiterait donc un nombre non borné de variables de ressources et, par conséquent, un nombre non borné d’états dans leν-automate.

Pour contrer cela et conserver une représentation finie de ce type de comportement, les

ν-automates sont dotés d’une capacité de réallocation des variables de ressources. Lorsqu’une

variable est réallouée, elle n’"oublie" pas les différents noms purs qui lui ont été précédem-ment attribués, mais les conserve dans un ensemble. Ensuite, à la prochaine utilisation de la ressource, un nouveau nom pur, frais vis-à-vis de cet ensemble, viendra s’y ajouter.

En ne libérant pas la variable X (pas d’occurrence deνX ), puis en la réallouant (via νX ,

lors du second parcours du cycle par exemple), le processus de reconnaissance d’unν-mot

force l’attribution d’un nouveau nom pur lors de la première utilisation de X , sans pour autant écraser les précédents. Il peut alors être attribué un nombre potentiellement infini à la ressource dénommée X . Puisque seul un nom frais peut être nouvellement attribué à une ressource lors de sa première utilisation, chaqueν-symbole consommé par la transition de q0

vers lui même dans N4est globalement frais pour le programme de ressources correspondant. Nous avons présenté dans cette section les programmes de ressources, leur sémantique (les ν-langages), et enfin le fonctionnement des machines reconnaissant les ν-mots (les ν-automates). Le fonctionnement des ν-automates est résolument différent de celui des

automates finis, afin de pouvoir reconnaître desν-mots composés de ν-symboles issus d’un

ensemble infini. Cette introduction laisse maintenant place à une présentation formelle des