e DUT Informatique 2 année Dec. Système & Réseaux - ASR6 10 novembre 2008 ASR6 : Sujet d'examen écrit 1h30min, 10 Novembre 2008 IUT Informatique 2, Décalés -- UNSA - 2008 Tous documents (cours, notes personnelles, sujets de TPs, programmes imprimés, etc.) autorisés Partie Programmation Concurrente Exercice 1. Programme multi-thread Java offrant la notion de Semaphore L'objectif de cet exercice est d'implanter en Java multi-thread l'equivalent de l'API Semaphore disponible dans le package java.util.concurrent depuis la version 5 de Java, et d'illustrer la manière d'utiliser un tel outil de synchcronisation généraliste . L'ensemble de cet exercice devra être résolu en faisant uniquement appel à la notion de Moniteur disponible dans le langage Java (pas de sémaphores, pas d'attente active, etc). L'ensemble des méthodes que l'on vous demande de décrire se trouvera dans une seule classe Java. Commencer par définir le constructeur de la classe. Puis : 1. Donner le code Java permettant d'implanter la méthode acquire() (equivalent du P()) 2. Donner le code Java permettant d'implanter la méthode release() (equivalent du V()) 3. Donner le code Java permettant d'obtenir le nombre de "billes" actuellement disponibles Pour toutes ces méthodes, expliquer clairement pourquoi vous avez besoin de les placer dans un moniteur. 4. A présent, donner une deuxième version pour la méthode acquire(), qui puisse prendre en paramètre un nombre de billes positif que l'on veut prendre "d'un seul coup" (soit toutes d'un coup, soit aucune). Bien sur, cette nouvelle méthode a une signature différente de celle de la première version. A votre avis, ces deux versions de acquire() doivent elles être implantées par une même méthode dans votre classe, ou peuvent-elles être clairement séparées ? 5. Pour finir cette classe, donner le code d'une méthode tryAcquire(int nbBilles) qui permet de tenter d'acquérir le nombre de billes passe en paramètre (ou 1 bille en l'absence de paramètre). Si le nombre de billes disponibles permet de satisfaire la requête, le comportement de tryAcquire est exactement similaire a celui d'un acquire(nbBilles). Autrement, la méthode renvoie une valeur false pour montrer qu'aucune bille n'a été retirée. e DUT Informatique 2 année Dec. Système & Réseaux - ASR6 10 novembre 2008 Exercice 2. Utilisation de votre classe Semaphore Cet exercice, malgré les apparences, est indépendant du premier ! Vous pouvez donc supposer que l'on dispose d'une classe Semaphore qui a la même API que celle disponible dans le package java.util.Concurrent (et dont vous aurez normalement donne une implantation dans l'exercice 1, mais que vous allez utiliser dans cet exercice, même si vous n'avez pas réussi a en faire une implementation dans l'exercice 1). Le but est d'utiliser un objet semaphore, instance de cette classe Semaphore afin de résoudre un problème nécessitant de synchroniser des threads entre elles. Commencer par : 1. écrire une méthode main qui instancie cet objet sémaphore, 2. décrire (le squelette de) deux codes (types) différents pour des threads: • • Le premier type de thread a le comportement suivant : Elle fabrique des objets un a un, qu'elle dépose en vrac dans une zone de stockage commune, cad une sorte d'entrepôt. Vous supposerez qu'un entrepôt n'a pas de taille limite, et qu'il dispose d'une interface très simple comprenant deux méthodes "put" et "get" que vous utiliserez pour respectivement, déposer un objet, ou en récupérer un. L'autre type de thread quant a lui, simule le fonctionnement d'une machine qui fait des lots d'objets, d'une taille prédéfinie (par exemple, des lots de 5 objets identiques pour une thread, ou de 3 pour d'autres threads de ce type). 3. Modéliser par du code Java ces 2 types de threads. 4. Créer un méthode main et démarrer l'exécution de 2 thread de chaque type, chacune ayant un de ceux comportement différent dans une boucle de 1000 iteractions 5. Faire se terminer proprement la thread "main" Partie Admin. Système Exercice 3 : services et démarrage Expliquez ce que contient le répertoire /etc/rc.d/init.d A quoi correspondent les runlevel ? Quel est l'utilité de la commande /sbin/service ? Donnez un équivalent de la commande /sbin/service/httpd status e DUT Informatique 2 année Dec. Système & Réseaux - ASR6 10 novembre 2008 Exercice 4 : gestion des utilisateurs Soit la ligne suivante extraite du fichier /etc/passwd : john:x:501:501::/home/john:/bin/bash Que faut-il faire en plus d'insérer cette ligne dans /etc/passwd pour que le login john soit opérationnel? Quel est le résultat de la commande suivante ? cat passwd.liste | /usr/sbin/chpasswd Quel fichier contient les mots de passe des utilisateurs (dans les mêmes conditions que les Tps) ? Exercice 5: partage de fichiers Donnez la liste des opérations qui permettent de partager par NFS le répertoire /net de la machine pcsrv avec la machine pcclt. Partie Programmation Distribué avec RMI Exercice 6: Une application distribuée avec RMI Le but de cet exercice est de programmer une application de chat basée sur un serveur central. Le protocole de l’application est simple: chaque client s’inscrit sur le serveur en donnant un pseudonyme, et ensuite lorsque un client envoie un message, le serveur le communique à tous les clients. 1. Faire le schéma de l’application. 2. Soit l’interface utilisateur suivante: e DUT Informatique 2 année Dec. Système & Réseaux - ASR6 10 novembre 2008 public class ClientUI { public static void main (String[]args){ try{ Client cl = new Client (); if(args.length != 2){ System.out.println(”Mauvais arguments !”); System.exit(-1) ; } cl.connect(args[0], args[1]) ; LineNumberReader in = new LineNumberReader (new InputStreamReader(System.in)); String str = null; while((str = in.readLine())!= null){ if(str.equals(”x”)){ cl.disconnect(); System.exit(-1) ; }else{ cl.send(str) ; } } }catch(Exception e){ e.printStackTrace(); } } } Remplir la classe Client: public class Client extends ............ implements ..... { ....... public Client ( ).... public void connect (String url , String pseudo) throws ...... { ...... } public void send (String str){ ...... } public void disconnect (){ ...... } } 3. Écrire les classes et les interfaces du serveur, ainsi que celles manquantes pour le client, en décrivant lesquelles sont nécessaires du côté serveur et lesquelles sont nécessaires du côté client. 4. Identifiez les objets distants. 5. D'écrire comment compiler et exécuter le programme obtenu.