Services de mobilité et de persistance des applications Java 151
La première approche, appelée gestion explicite, consiste à laisser entièrement à
la charge du programmeur de l’application la gestion de la capture et de la
reconstruction de l’état de son application. Le programmeur doit donc ajouter du
code qui effectue ce travail, en des points fixes de l’application, dits points de
sauvegarde. En un point de sauvegarde, le code ajouté doit enregistrer l’état de
l’exécution : il note la dernière instruction exécutée et l’état courant de l’application.
Lors de la reprise de l’exécution, le premier traitement effectué est un branchement
vers le dernier point de sauvegarde enregistré ; ainsi, l’exécution peut reprendre au
point où elle a été interrompue. Cette solution manque de souplesse, car la gestion
des points de sauvegarde est entièrement à la charge du programmeur. De plus,
l’ajout ou la modification de points de sauvegarde induit une modification de
l’application elle-même. Cette gestion explicite est utilisée dans les applications
faisant appel à des plates-formes à agents mobiles [CHE 95] fournissant une
migration faible tels que les Aglets [IBM 96] ou Mole [BAU 98].
Les deux autres approches, dites implicites, fournissent un service transparent de
capture/restauration de l’état des flots de contrôle. Le service fourni est indépendant
du code de l’application ; il se présente sous la forme d’une primitive appelée par
l’application elle-même ou par une application externe. Ces deux approches diffèrent
par leur mise en œuvre :
- la première approche implicite consiste à fournir un préprocesseur qui injecte
du code soit dans le code source de l’application, soit dans son code
intermédiaire Java. Lors de l’exécution de l’application, le code injecté crée
un objet Java, que l’on nommera backup, et l’associe à l’application. Au fur
et à mesure que l’application s’exécute, le code injecté sauvegarde dans
l’objet backup l’état de l’exécution (les appels de méthodes, les valeurs des
variables locales des méthodes). Lorsque l’application désire capturer son
état, il lui suffit d’utiliser l’objet backup que le préprocesseur lui a associé.
Pour restaurer l’état d’une application, les informations sauvegardées dans
l’objet backup sont utilisées pour réinitialiser l’état de l’application : une
réexécution partielle de l’application est effectuée pour reconstruire la pile
d’exécution et réinitialiser les valeurs des variables locales. La principale
motivation de cette approche est qu’elle ne modifie pas la JVM. Mais son
inconvénient est que d’une part, elle induit un surcoût non négligeable sur les
performances de l’application (dû au code injecté par le préprocesseur)
[BOU 00b] et que d’autre part, le coût de l’opération de restauration de l’état
est important en raison de la réexécution partielle de l’application.
Fünfrocken propose une plate-forme à agents mobiles se basant sur un
préprocesseur qui instrumente le code source des applications Java [FUN 98]
et Truyen, ou encore Sakamoto proposent des implantations de mécanismes
de capture d’état de flots de contrôle Java basés sur un préprocesseur qui
instrumente le code intermédiaire de l’application [SAK 00, TRU 00] ;