Title: Corosol : une machine virtuelle Java dynamiquement adaptative
1Corosol une machine virtuelle Java
dynamiquement adaptative
- Christophe Deleray
- Thèse de doctorat, spécialité Informatique
- Institut Gaspard Monge
- Université de Marne-la-Vallée
- 18 octobre 2006
2Plan
- Problématique
- Faire évoluer une application
- Adapter une plate-forme dexécution aux
contraintes dune application - Java et lévolution des applications
- Corosol
- Architecture à composants
- Adaptation statique
- Adaptation dynamique
- Conclusions et perspectives
3Les systèmes informatiques
4Les systèmes informatiques
- Système informatique
- Application ( Programme )
Application
5Les systèmes informatiques
- Système informatique
- Application ( Programme )
- ET
- Plate-forme d'exécution ( Interprète )
Application
Plate-forme dexécution
6Les systèmes informatiques
- Système informatique
- Application ( Programme )
- ET
- Plate-forme d'exécution ( Interprète )
- Construit pour un ensemble de besoins /
contraintes
Application
Plate-forme dexécution
7Problématique 1 Faire évoluer une application
- Une application distribuée nécessite la
communication entre deux machines distantes.
8Problématique 1 Faire évoluer une application
- Une application distribuée nécessite la
communication entre deux machines distantes.
- Comment sécuriser la communication même si cela
nétait pas prévu lors de la conception du
système ?
9Problématique 1 Faire évoluer une application
Prépare les données à envoyer
Application
Application
Plate-forme dexécution
Plate-forme dexécution
Canal de communication
Emet les données
10Problématique 1 Faire évoluer une application
- Solution 1 Modifier lapplication elle-même
Application
Application
Plate-forme dexécution
Plate-forme dexécution
11Problématique 1 Faire évoluer une application
- Solution 1 Modifier lapplication elle-même
Application
Application
Plate-forme dexécution
Plate-forme dexécution
12Problématique 1 Faire évoluer une application
- Solution 2 Modifier la plate-forme dexécution
Application
Application
Plate-forme dexécution
Plate-forme dexécution
13Problématique 1 Faire évoluer une application
- Solution 2 Modifier la plate-forme dexécution
Application
Application
Plate-forme dexécution
Plate-forme dexécution
14Problématique 1 Faire évoluer une application
- Solution 2 Modifier les deux
Application
Application
Plate-forme dexécution
Plate-forme dexécution
15Problématique 1 Faire évoluer une application
- Solution 3 Modifier les deux
Application
Application
Plate-forme dexécution
Plate-forme dexécution
16Solution 1 Modifier lapplication
- Chaîne de production dune application
Préprocesseur
compilation
Application
17Solution 1 Modifier lapplication
- Modifier le code source de lapplication
Ajouter par un préprocesseur
String mesg blabla mesg
crypt(mesg) Socket socket new
Socket() socket.send(mesg)
compilation
Application
18Solution 1 Modifier lapplication
- Modifier le code source de lapplication
String mesg blabla Socket socket new
Socket() socket.send(mesg)
19Solution 1 Modifier lapplication
- Modifier le code source de lapplication
Extension du langage
String mesg blabla Security Socket
socket new Socket() socket.send(mesg)
compilation
Application
Nouveau compilateur
20Solution 1 Modifier lapplication
Application
21Solution 1 Modifier lapplication
011000 100011 1010
bytecode initial
22Solution 1 Modifier lapplication
011000 110010 100011 11110
011000 100011 1010
modifications
bytecode initial
bytecode modifié
23Solution 1 Modifier lapplication
- Utilisation de la réflexivité
Auto Représentation
Application
Interface
Plate-forme dexécution
Représentation de lapplication
24Solution 1 Modifier lapplication
- Point fort
- Conservation de la portabilité
Application
Plate-forme dexécution
Plate-forme dexécution
25Solution 1 Modifier lapplication
- Point fort
- Conservation de la portabilité
- Point faibles
- Couplage
String mesg blabla mesg
crypt(mesg) Socket socket new
Socket() socket.send(mesg) LogManager.log(mesg
)
26Solution 1 Modifier lapplication
- Point fort
- Conservation de la portabilité
- Point faibles
- Couplage
- Difficilement réversible
String mesg blabla mesg
crypt(mesg) Socket socket new
SecureSocket() socket.send(mesg) LogManager.lo
g(mesg)
27Solution 1 Modifier lapplication
- Point fort
- Conservation de la portabilité
- Point faibles
- Couplage
- Difficilement réversible
String mesg blabla mesg
crypt(mesg) Socket socket new
SecureSocket() socket.send(mesg) LogManager.lo
g(mesg)
28Solution 1 Modifier lapplication
- Point fort
- Conservation de la portabilité
- Point faibles
- Couplage
- Difficilement réversible
- Difficilement combinable
29Solution 1 Modifier lapplication
- Point fort
- Conservation de la portabilité
- Point faibles
- Couplage
- Difficilement réversible
- Difficilement combinable
- Contrôle l'exécution limité
30Solution 2 Modifier la plate-forme dexécution
- Implantation ad-hoc
- Redéfinition de modules avant exécution
Application
Plate-forme dexécution Sécurité
31Solution 2 Modifier la plate-forme dexécution
Données de la plate-forme dexécution
Application
Interface
Plate-forme dexécution
Auto - Représentation
32Solution 2 Modifier la plate-forme dexécution
- Points faibles
- Perte de la portabilité
- Mise en oeuvre difficile
- Points forts
- Contrôle de l'exécution accrû
- Moins de couplages
- Modifications dynamiques
33Problématique 2 adapter la plate-forme
dexécution aux contraintes dune application
- Exemple une application temps réel nécessitant
un algorithme de ramasse-miettes adapté.
Algorithme GC
Application
Interface
Plate-forme dexécution
Algorithme GC
34Travaux existants en Java
- Adaptation de lapplication
- Modification de code source
- AspectJ, OpenJava, BCA,
- Modification du bytecode
- JOIE, ASM, BCEL, Javassist,
- Peuvent se ramener à une transformation de la
plate-forme dexécution
35Travaux existants en Java
- Adaptation de la plate-forme dexécution
- Nombreuses JVMs ad-hoc
- Jupiter, Plava, JanosVM
- Quelques JVMs adaptables
- JavaInJava, MetaXa, Guarana, Jikes
- Difficilements combinables
- Pas assez réflexives
36Notre solution Corosol
- Adapter la plate-forme d'exécution
- Une JVM
- Portable
- Facilement adaptable
- avant exécution
- pendant l'exécution, par l'application exécutée
37Portabilité
- Portabilité des propriétés et des modifications
- Comment ?
- Implantation 100 Java
Application
Corosol
Plate-forme dexécution
Plate-forme dexécution
38Adaptations statiques problématiques
- Repose sur la redéfinition des éléments de
larchitecture avant exécution - Reconnaître les éléments
- Les redéfinir
39Architecture à composants
Corosol se compose dune architecture à
composants.
40(No Transcript)
41Composants
- Définition dun composant
- Spécification abstraite
42Composants
- Définition dun composant
- Spécification abstraite
interface A extends JVMComponent
43Composants
Nouveau type abstrait de composant
- Définition dun composant
- Spécification abstraite
- Type abstrait
interface A extends JVMComponent
Interface commune à tous les types de composants
44Composants
- Définition dun composant
- Spécification abstraite
- Type abstrait
- Spécification des services
interface A extends JVMComponent int
service1(B b) int service2(Class c) C
service3(A a)
45Composants
- Définition dun composant
- Spécification abstraite
- Type abstrait
- Spécification des services
- Implantation concrète
public class AImpl implements A
46Composants
Type concret du composant de type abstrait A
- Définition dun composant
- Spécification abstraite
- Type abstrait
- Spécification des services
- Implantation concrète
public class AImpl implements A
47Composants
- Définition dun composant
- Spécification abstraite
- Type abstrait
- Spécification des services
- Implantation concrète
- Implantation des services
public class AImpl implements A public int
service1(B b) public int service2(Class
c) public C service3(A a)
48Composants
- Définition dun composant
- Spécification abstraite
- Type abstrait
- Spécification des services
- Implantation concrète
- Implantation des services
- Dépendances dynamiques
public class AImpl implements A private D d
private E e public int service1(B b)
public int service2(Class c) public C
service3(A a) public void
configure(JVirtualMachine jvm) this.d
(D)jvm.getComponent(D.class) this.e
(E)jvm.getComponent(E.class)
49Composants
- Définition dun composant
- Spécification abstraite
- Type abstrait
- Spécification des services
- Implantation concrète
- Implantation des services
- Dépendances dynamiques
public class AImpl implements A private D d
private E e public int service1(B b)
public int service2(Class c) public C
service3(A a) public void
configure(JVirtualMachine jvm) this.d
(D)jvm.getComponent(D.class) this.e
(E)jvm.getComponent(E.class)
Commune à tous les composants
Type abstrait du conteneur de composants
50Adaptations statiques
- Redéfinition des implantations des composants
- via un fichier de configuration
compilation
Corosol
Code source de Corosol
Fichier de configuration
51Adaptations statiques fichier de configurations
corosol.component.JMethodInvoker
corosol.component.impl.RealJMethodInvoker corosol.
component.JScheduler
corosol.component.impl.DefaultJScheduler corosol.c
omponent.JHeapAllocator corosol.component.imp
l.JSimpleHeapAllocator corosol.component.JHeap
corosol.component.impl.DefaultJHea
p corosol.component.JavaStack
corosol.component.impl.DefaultJavaStack
52Adaptations statiques fichier de configurations
corosol.component.JMethodInvoker
corosol.component.impl.RealJMethodInvoker corosol.
component.JScheduler
corosol.component.impl.DefaultJScheduler corosol.c
omponent.JHeapAllocator corosol.component.imp
l.JSimpleHeapAllocator corosol.component.JHeap
corosol.component.impl.DefaultJHea
p corosol.component.JavaStack
corosol.component.impl.DefaultJavaStack
Description des types abstraits des composants
53Adaptations statiques fichier de configurations
corosol.component.JMethodInvoker
corosol.component.impl.RealJMethodInvoker corosol.
component.JScheduler
corosol.component.impl.DefaultJScheduler corosol.c
omponent.JHeapAllocator corosol.component.imp
l.JSimpleHeapAllocator corosol.component.JHeap
corosol.component.impl.DefaultJHea
p corosol.component.JavaStack
corosol.component.impl.DefaultJavaStack
Description des types abstraits des composants
Description des implantations (types concrêts)
des composants
54Adaptations statiques fichier de configurations
corosol.component.JMethodInvoker
corosol.component.impl.RealJMethodInvoker corosol.
component.JScheduler
corosol.component.impl.DefaultJScheduler corosol.c
omponent.JHeapAllocator corosol.component.imp
l.JSimpleHeapAllocator corosol.component.JHeap
example.PersistentHeap corosol.com
ponent.JavaStack corosol.component.im
pl.DefaultJavaStack
Description des types abstraits des composants
Description des implantations (types concrêts)
des composants
55Adaptations dynamiques Problématique
- Reposent sur une gestion des composants à
lexécution - Cest-à-dire
- Y accéder via lapplication,
- En ajouter, remplacer voire supprimer
56Accès aux composants depuis lapplication
- Lapplication créé et accède à
- - ses objets,
- - les composants de Corosol
Objets applicatifs
Composants
Application
57Méta-niveaux
- Trois méta-niveaux dexécution
58Méta-niveaux
Objets applicatifs
- Trois méta-niveaux dexécution
- Niveau de base (lapplication)
59Méta-niveaux
Objets applicatifs
- Trois méta-niveaux dexécution
- Niveau de base (lapplication)
- Niveau méta 0 (Corosol)
Composants
60Méta-niveaux
Objets applicatifs
- Trois méta-niveaux dexécution
- Niveau de base (lapplication)
- Niveau méta 0 (Corosol)
- Niveau méta 1 la JVM hôte
Composants
Objets natifs
61Exécution
Objets applicatifs
- Chaque niveau exécute
- le niveau supérieur.
Composants
Niveau méta 0 (Corosol) Exécute le niveau de
base (lapplication)
Objets natifs
Niveau méta 1 (JVM hôte) Exécute Corosol
62Références
Niveau méta 0 (Corosol) Alloue physiquement les
objets de lapplication
- Chaque niveau contient les références des
objets du - niveau supérieur.
Gestionnaire des références
Tas
Niveau méta 1 (JVM hôte) Alloue physiquement les
composants de Corosol
Tas
63Causalité
Objets applicatifs
Les niveaux sont causalement entre eux.
Composants
Objets natifs
64Réflexivité totale méta-niveaux
Objets applicatifs
- Création / Appel sur un objet applicatif
Composants
65Réflexivité totale méta-niveaux
Objets applicatifs
- Création / Appel sur un objet applicatif
- Exécution au niveau méta 0
Composants
66Réflexivité totale méta-niveaux
Objets applicatifs
- Création / Appel sur un objet applicatif
- Exécution au niveau méta 0
- Retour du résultat
Composants
67Réflexivité totale méta-niveaux
Objets applicatifs
- Création / Appel sur un objet applicatif
- Exécution au niveau méta 0
- Retour du résultat
- Création / Appel sur un composant
Composants
68Réflexivité totale méta-niveaux
Objets applicatifs
- Création / Appel sur un objet applicatif
- Exécution au niveau méta 0
- Retour du résultat
- Création / Appel sur un composant
- Activation au niveau méta 0
Composants
69Réflexivité totale méta-niveaux
Objets applicatifs
- Création / Appel sur un objet applicatif
- Exécution au niveau méta 0
- Retour du résultat
- Création / Appel sur un composant
- Activation au niveau méta 0
- Délégation au niveau méta 1
Composants
Objets natifs
70Réflexivité totale méta-niveaux
Objets applicatifs
- Création / Appel sur un objet applicatif
- Exécution au niveau méta 0
- Retour du résultat
- Création / Appel sur un composant
- Activation au niveau méta 0
- Délégation au niveau méta 1
- Activation au niveau méta 1
Composants
Objets natifs
71Réflexivité totale méta-niveaux
Objets applicatifs
- Création / Appel sur un objet applicatif
- Exécution au niveau méta 0
- Retour du résultat
- Création / Appel sur un composant
- Activation au niveau méta 0
- Délégation au niveau méta 1
- Activation au niveau méta 1
- Remontée du résultat
Composants
Objets natifs
72Réflexivité totale Up / Down
- Passer dun méta-niveau à un autre nécessite une
transformation des données
Gestion uniforme des composants Et objets de
lapplication
Représentation des objets de lapplication.
Niveau méta 0 (Corosol)
Tas
Up
Down
Représentation des composants
Tas
73Réflexivité totale Up / Down
- Passer dun méta-niveau à un autre nécessite une
transformation des données
- Si value est d'un type primitif
- alors
- Up(value) encode(value)
- Sinon si value est du niveau méta 1
- alors
- Up(value) wrap(value)
- Sinon
- Up(value) value
Gestion uniforme des composants Et objets de
lapplication
Représentation des objets de lapplication.
Niveau méta 0 (Corosol)
Tas
Up
Down
Représentation des composants
Tas
Niveau méta 1 (JVM hôte)
74Réflexivité totale Up / Down
- Passer dun méta-niveau à un autre nécessite une
transformation des données
- Si value est d'un type primitif
- alors
- Down(value) decode(value)
- Sinon si value est du niveau méta 1
- alors
- Down(value) value
- Sinon
- Down(value) Proxy(value)
Niveau méta 0 (Corosol)
Tas
Down
Tas
Niveau méta 1 (JVM hôte)
75Gestion des composants à lexécution
- Deux composants essentiels
- Le gestionnaire des associations
- Relations Type abstrait / Type concrèt
- Le conteneur à composants
- Gestion des dépendances
- Construction des mandataires
- Utilisé par lapplication
76Gestion des composants à lexécution
Composant
- Trois opérations élémentaires
- Ajout dun nouveau composant
- Création dun mandataire
Dépend de
A
B
Mandataire
C
D
Conteneur de composants
77Gestion des composants à lexécution
Composant
- Trois opérations élémentaires
- Ajout dun nouveau composant
- Création dun mandataire
- Insertion dans le conteneur
- Liaisons avec les autres composants
Dépend de
A
B
Mandataire
C
D
Conteneur de composants
78Gestion des composants à lexécution
- Trois opérations élémentaires
- Ajout dun nouveau composant
- Création dun mandataire
- Insertion dans le conteneur
- Liaisons avec les autres composants
- Remplacement dun composant
Dépend de
A
B
Composant
Mandataire
C
D
Conteneur de composants
79Gestion des composants à lexécution
- Trois opérations élémentaires
- Ajout dun nouveau composant
- Remplacement dun composant
- Création du nouveau composant
- Transfert des données
- Invalidation de lancien composant
Nouveau composant
Dépend de
A
B
Composant
Mandataire
C
D
Conteneur de composants
80Gestion des composants à lexécution
- Trois opérations élémentaires
- Ajout dun nouveau composant
- Remplacement dun composant
- Création du nouveau composant
- Transfert des données
- Invalidation de lancien composant
- Mise à jour du mandataire
Nouveau composant
Dépend de
A
B
Mandataire
C
D
Conteneur de composants
81Gestion des composants à lexécution
- Trois opérations élémentaires
- Ajout dun nouveau composant
- Remplacement dun composant
- Création du nouveau composant
- Transfert des données
- Invalidation de lancien composant
- Mise à jour du mandataire
- Suppression dun composant
Dépend de
A
B
Composant
Mandataire
C
D
Conteneur de composants
82Gestion des composants à lexécution
- Trois opérations élémentaires
- Ajout dun nouveau composant
- Remplacement dun composant
- Suppression dun composant
- Invalidation des dépendances
Dépend de
A
B
Composant
Mandataire
C
D
Conteneur de composants
83Gestion des composants à lexécution
- Trois opérations élémentaires
- Ajout dun nouveau composant
- Remplacement dun composant
- Suppression dun composant
- Invalidation des dépendances
- Retrait du conteneur
Dépend de
A
B
Composant
Mandataire
C
D
Conteneur de composants
84Gestion des composants à lexécution
- Trois opérations élémentaires
- Ajout dun nouveau composant
- Remplacement dun composant
- Suppression dun composant
- Invalidation des dépendances
- Retrait du conteneur
Dépend de
A
B
Composant
Mandataire
C
D
Conteneur de composants
85Exemple 1 Changer le type de mémoire
- Motivations Ajouter dynamiquement la
persistence - Comment ?
- Reconnaître les composants mis en jeu
- Écrire les nouvelles implantations
- Les instancier
- Effectuer le remplacement
86Modification de la mémoire des objets et mise à
jour des layouts
Modification des valeurs au sein des Stacks
frames
87Exemple 1 Changer le type de mémoire
- Composants concernés
- JHeap le tas
interface JHeap extends JVMComponent
//lecture dune valeur dans le tas Type
readType(int index) //écriture dune valeur
dans le tas void writeType(Type value, int
index)
Nouvelle implantation public class
PersistentJHeap implements JHeap
88Exemple 1 Changer le type de mémoire
- Composants concernés
- JHeap le tas
- JStackFrame les frames
interface JStackFrame extends JObject,
JAllocatable //empile une valeur sur la pile
des opérandes void pushType(Type type)
//dépile une valeur de la pile des opérandes
Type popType() //écriture dans le tableau
des valeurs locales void storeType(Type value,
int index) //lecture dans le tableau des
valeurs locales void loadType(int index)
Position à recalculer
89Exemple 1 Changer le type de mémoire
- Composants concernés
- JHeap le tas
- JStackFrame les frames
- JLayout les gestionnaires de dispositions
- interface JClassLayout extends JLayout
- //position dun champ dans la mémoire
- int getPosition(JField field)
-
- interface JArrayLayout extends JLayout
- //position dune entrée dans la mémoire
- int getPosition(int index)
-
Mise à jour des layouts
90Exemple 1 Changer le type de mémoire
- public void replace(JVMComponent component)
- ()
- JHeap oldHeap (JHeap)component
- JVirtualMachine jvm Corosol.getVirtualMachine()
- JHeapAllocator allocator
(JHeapAllocator)jvm.getComponent(JHeapAllocator.cl
ass) - allocator.moveAllocatables(oldHeap, this)
-
Ancien tas passé en paramètre
LAllocateur déplace tous les objets de lancien
tas vers le nouveau
Obtention du composant Allocateur
91Exemple 1 Changer le type de mémoire
public class MyApp private Object data
public void createObject(int n) //création
dobjets public static void main(String
args) new MyApp().createObject(1000)
JVirtualMachine jvm Corosol.getVirtualMachine()
jvm.replaceComponent(new PersistentHeap(10000
0)) Integer value new Integer(200)
Accès à la JVM
Création du nouveau composant
Remplacement du Composant (transfert)
Sera créé dans le nouveau tas
92Conclusions et perspectives
- Corosol, une JVM
- Facilement adaptable
- avant exécution
- Via modularité
- pendant exécution
- Via réflexivité
- Entièrement écrite en Java
- Modifications portables
- Travaux futurs
- Améliorations des performances
- Sûreté
- Sécurité
- Compilateur incrémental