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