|
|
Institut National des Télécommunications
Télécom INT 2è année
TP Noté CS21 du 18/05/04
Modalités
Durée : 3 heures
Les questions sont indépendantes les unes des autres.
Le barême est donné à titre indicatif des poids entre les différentes
questions.
Seront notés :
- La clarté du code,
- Le fait que le code compile (sans warning),
- Le fait que le code répond correctement à la question posée,
- Le fait que le retour de chaque appel système, s'il y en a un,
est
testé et géré (traitement d'erreur)
,
- Le fait que les ressources système réservées pendant l'exécution
du
programme sont libérées à la fin de l'exécution.
La «livraison» de votre travail en fin de TP noté se fera par remise de
votre copie à l'enseignant et par
envoi d'un
mail
à Michel.Simatic@int-evry.fr
(sujet «CS21:TP noté») avec en pièce jointe le fichier d'extension tgz
constitué de la manière suivante :
cd votreRepertoireDeTravailPourCS21 tar cvfz $USER.tgz TPNote2004
Préparation
Question 1 : Optimisation (4 points)
Modifier le programme Q1/matAlea.c listé ci-après pour
améliorer son temps d'exécution.
À titre indicatif, le programme actuel s'exécute en une vingtaine de
secondes sur une machine à 1 Ghz ; après modifications, il s'exécute en
moins d'un centième de seconde.
/* Ce programme matAlea calcule aleatoirement les coefficients d'une matrice N*M et stocke cette matrice dans le fichier "matAlea.dat" NB : quand matAlea a termine son execution, on lance un autre programme (qui est hors du contexte de cet exercice) qui utilise la matrice stockee dans matAlea.dat pour faire un traitement. */
#define NOMFIC "/tmp/matAlea.dat" #define N 50 #define M 40
int mat[N][M];
int main() { int fd; int i,j;
/* Initialisation du generateur aleatoire */ srand(getpid());
/* Calcul aleatoire des coefficients de la matrice */ for (i=0 ; i<M ; i++){ for (j=0 ; j<N ; j++){ mat[j][i] = rand(); } }
/* Stockage dans fichier */ fd = open(NOMFIC, O_WRONLY|O_CREAT|O_TRUNC|O_SYNC, S_IRUSR|S_IWUSR); if (fd < 0){ perror("open"); return EXIT_FAILURE; }
for (i=0 ; i<N ; i++){ for (j=0 ; j<M ; j++){ if (lseek(fd, (j+i*M)*sizeof(int), SEEK_SET) < 0){ perror("lseek"); return EXIT_FAILURE; } if (write(fd, &mat[i][j], sizeof(int)) != sizeof(int)){ perror("write"); return EXIT_FAILURE; } } } if (close(fd) < 0){ perror("close"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
Question 2 : Un tramway (nommé désir ?) (8 points)
On imagine que le futur tramway qui reliera Évry à Corbeil aura une
section de voie
unique (nommée SVU dans la suite) sur 2 kilomètres au niveau de l'INT.
De ce fait, une société est en charge d'écrire un simulateur de
circulation sur les différentes voies. Elle fait appel à vos services
pour la conception de la fonction circulationECSurSVU (respectivement
circulationCESurSVU) qui gère l'accès à la SVU pour les tramway venant
d'Évry (respectivement Corbeil), l'utilisation de cette voie et la
sortie de la SVU.
Pour les questions suivantes (qui sont autant d'hypothèses
d'utilisation de la SVU), vous devrez donc écrire les algorithmes (pas
de code !) des fonctions circulationECSurSVU et
circulationCESurSVU en utilisant des fonctions P() et V() sur des
sémaphores.
Question 2.1 : Un seul train sur la SVU (2 points)
Dans cette question, on souhaite qu'à tout instant, il ne puisse y
avoir au maximum qu'un tramway sur la SVU.
Écrire les algorithmes (et initialisations) sur votre copie.
Question 2.2 : Plusieurs trains dans le sens EC sur la SVU (2
points)
Dans cette question, on souhaite que plusieurs tramways EC puisse
circuler simultanément sur la SVU. En revanche, à tout instant, au plus
un tramway CE peut
circuler sur la SVU. De plus, on ne peut jamais avoir un tramway EC
et un tramway CE simultanément sur la SVU.
NB : On veillera à ce qu'il n'y ait jamais de tramway qui attende
indéfiniment parce qu'il y a des tramways qui s'engagent constamment
sur la SVU, mais dans l'autre sens.
Écrire les algorithmes (et initialisations) sur votre copie.
Question 2.3 : Plusieurs trains sur la SVU (4 points)
Dans cette question, on souhaite que plusieurs tramways EC
(respectivement CE) puisse
circuler simultanément sur la SVU. En revanche, on ne peut jamais avoir
un tramway EC et un tramway CE simultanément sur la SVU.
NB : On veillera à ce qu'il n'y ait jamais de tramway qui attende
indéfiniment parce qu'il y a des tramways qui s'engagent constamment
sur la SVU, mais dans l'autre sens.
Écrire les algorithmes (et initialisations) sur votre copie.
Question 3 : Monsieur, Madame et les threads (8 points)
Reprendre le code réalisé à la question 3 de l'exercice ClientServeur/1
et
programmer le serveur de sorte qu'il crée 26 threads (chacun
étant
chargé des «M. et Mme» commençant par une certaine lettre
de
l'alphabet) :
- Chaque thread cherche,
dans le fichier, la première et la
dernière
ligne commençant par sa lettre.
- Il se met ensuite en attente de requêtes.
- Sur réception d'une requête, le thread
distributeur la fait suivre au thread
correspondant à la première
lettre
du «M. et Mme» :
- Le thread ne cherche
que dans les lignes qui le concernent ;
- Il répond au client ;
- Il attend une requête du thread
distributeur.
Le médium utilisé pour les communications thread distributeur/thread chargé de traiter une lettre
est libre : tube, mémoire...
|