Département INFormatique 
  CSC4508/M2 : Concepts des systèmes d'exploitation et mise en œuvre sous Unix
    Évaluation

Institut National des Télécommunications
Télécom INT 2è année

TP Noté CS21 du 18/05/04

Corrigés

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

cd votreRepertoireDeTravailPourCS21
cp ~simatic/CS21/tPNote2004.tgz .
tar xvfz tPNote2004.tgz
cd TPNote2004

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...

Page mise à jour le 15 mai 2006