IUT Nancy-Charlemagne Université de Nancy 2 Syst`eme Automate

Transcription

IUT Nancy-Charlemagne Université de Nancy 2 Syst`eme Automate
I.U.T. Nancy-Charlemagne
Université de Nancy 2
Système Automate Processus – D.U.T. Informatique S3
Mardi 3 novembre 2009
Durée de l’épreuve : 2 heures.
Dominique Colnet
Emmanuel Nataf
Barème donné à titre indicatif.
Seules les notes manuscrites prises durant les cours sont autorisées (ni photocopies, ni listing,
ni documents imprimés). Lire complètement le sujet avant de commencer.
1
1.1
Copie numéro 1 sur une feuille séparée (8 points)
Automate pour les nombres écrits en binaire
Faire le dessin d’un automate capable de reconnaı̂tre les nombres binaires correctement écrits. On considère
qu’un nombre binaire est correctement écrit s’il est écrit avec uniquement des caractères 0 ou 1. Le nombre
binaire ne comporte jamais de signe et il peut y avoir des caractères espaces avant et/ou après le nombre.
Pas d’espaces dans le nombre lui-même. Dessinez un automate capable de reconnaı̂tre les nombres binaires
correctement écrits en utilisant un nombre minimum d’états. On fait le plus petit automate possible.
Rappels : pour le schéma de l’automate, nous prenons les mêmes conventions que celles vues en cours :
– S0 est l’état de départ,
– l’état dont le numéro est le plus grand correspond à l’état de satisfaction et cet état est doublement
entouré,
– le symbole a correspond à la fin de chaı̂ne,
– on ne dessine pas les cas d’erreurs.
1.2
Expression régulière
Donnez l’expression régulière correspondant à l’automate de la question précédente (automate de la question
1.1).
1.3
Calculs et modification de l’automate
On souhaite que l’automate calcule la valeur en décimal du nombre binaire ainsi qu’une valeur booléenne
indiquant la parité du nombre de bits à 1 dans le nombre binaire. Exemples :
110
111
0111
1001
11000
valeur
6
7
7
9
24
parité
true
false
false
true
true
On souhaite simplifier au maximum le codage des calculs de valeur et parité. Si on utilise directement
l’automate précédent (automate minimal de la question 1.1), il est assez difficile de calculer valeur et
parité sans faire de tests (i.e. sans instruction if then else). Il est donc demandé pour cette question de faire
un autre automate, avec un ou plusieurs états supplémentaires, dans le but de pouvoir calculer sans tests
valeur et parité. Bien entendu, la modification de l’automate ne doit pas changer l’ensemble des nombres
binaires acceptés préalablement par l’automate de la question 1.1. Donnez le schéma du nouvel automate
ainsi que les instructions C (ou Java) qui doivent se déclencher sur le passage des transitions.
1
1.4
Codage de l’automate
Donnez le code C (ou Java) de l’automate qui calcule valeur et parité (automate de la question 1.3 incluant
le calcul de valeur et parité).
1.5
L’étoile (*) du shell
Soit l’extrait de session sous l’interprète de commande bash suivant :
% find . *.java
projet1/titi.java
projet2/toto.java
% touch plop.java
% find . *.java
plop.java
%
Sachant que la commande touch a pour effet de créer un fichier, expliquez ce qui se passe. Pourquoi les
fichiers titi.java et toto.java ne sont ils plus affichés par la commande find ? Comment faut il corriger
la commande find ?
2
2
Copie numéro 2 sur une feuille séparée (6 points)
Synchronisation de processus en langage C. Soit le code C suivant :
#include
#include
#include
#include
<stdio.h>
<sys/types.h>
<sys/wait.h>
<unistd.h>
int main (int argc, char* argv[]) {
int compteur = 0;
int pid = -1;
pid = fork(); // fork #1
if ( pid == 0 ) {
sleep(3); // sleep 3 secondes
printf("compteur=%d\n", compteur);
}
else {
compteur++;
waitpid(pid, NULL, 0); // wait #1
printf("compteur=%d\n", compteur);
pid = fork(); // fork #2
if ( pid == 0 ) {
compteur++;
printf("compteur=%d\n", compteur);
}
else {
compteur++;
waitpid(pid, NULL, 0); // wait #2
compteur++;
printf("compteur=%d\n", compteur);
}
}
printf("compteur=%d\n", compteur);
return 0;
}
2.1
Dessin de l’arbre des processus
Faire le dessin de l’arbre des processus du code C qui précède. Indiquez le nombre total de processus créés.
2.2
Affichage du programme
Si l’on ne modifie pas le programme C, l’affichage est-il toujours le même ? Selon votre réponse, donnez le
seul affichage possible ou tous les affichages possibles.
2.3
Influence de l’appel à sleep
Quel est l’impact de l’appel à sleep sur l’exécution du programme ? Expliquez ce qui se passe si on enlève
complètement l’appel à sleep du programme initial. L’affichage change-t-il ?
3
3
Copie numéro 3 sur une feuille séparée (8 points)
Synchronisation de Threads en java. Soit le code java suivant :
public class TestJoueur {
public static void main (String[] args) {
Balle balle = new Balle ();
Joueur ping = new Joueur("Ping", balle);
Joueur pong = new Joueur("Pong", balle);
System.out.println("Start");
ping.start();
pong.start();
System.out.println("Stop");
}
}
public class Joueur extends Thread {
private String nom;
private Balle balle;
public Joueur (String n, Balle b) {
super(n);
nom = n;
balle = b;
}
public void run() {
int compteur = 0;
while ( compteur <= 1 ) {
balle.tape(nom);
compteur ++;
}
}
}
public class Balle {
private String memoire;
public Balle () {
memoire = null;
}
public synchronized void tape ( String message) {
this.notifyAll(); // #1
while ( memoire == message ) {
this.notifyAll(); // #2
try {
wait();
} catch (InterruptedException e) { }
}
System.out.println(message);
memoire = message;
this.notifyAll(); // #3
}
}
4
3.1
Affichage numéro 1
Sans modification du programme précédent, l’affichage suivant est-il possible ?
% java TestJoueur
Start
Ping
Pong
Ping
Pong
Stop
%
3.2
Affichage numéro 2
Sans modification du programme précédent, l’affichage suivant est-il possible ?
% java TestJoueur
Start
Ping
Pong
Stop
Ping
Pong
%
3.3
Affichage numéro 3
Sans modification du programme précédent, l’affichage suivant est-il possible ?
% java TestJoueur
Start
Ping
Pong
Pong
Ping
Stop
%
3.4
Sans aucun notifyAll
Si on modifie le code et que l’on supprime tous les appels à la méthode notifyAll, le prompt du shell
(%) ne revient pas. L’absence de retour du prompt indique qu’au moins un des Threads ne se termine pas.
Ceci étant dit, même si le prompt ne revient pas, le programme affiche quelque chose. Donner un affichage
possible du programme ainsi modifié (i.e. sans aucun appel à notifyAll). Justifiez votre réponse.
3.5
Avec un et un seul appel à notifyAll
Pour obtenir un affichage similaire au programme original non modifié, il est possible de ne garder qu’un
seul des trois appels à notifyAll. Quel est l’appel qu’il faut conserver pour ne pas changer l’affichage ? On
garde uniquement l’appel #1 ? ou uniquement le #2 ? ou encore uniquement le #3 ?
Après avoir donné votre réponse, indiquez ce qui se passe si l’on conserve un autre appel seul (i.e. sans celui
indiqué dans votre réponse). Quel est l’affichage possible ? Le prompt revient il ? Justifiez votre réponse.
5