L3

Sujet

Il y a N processus qui exécutent tous :

while (true) {
  access_tampon(i)
  // Utiliser le tampon
  liberer_tampon(i)
}

Écrire des procédures access_tampon(i) et liberer_tampon(i) de sorte que un seul processus utilise le tampon à la fois.

Faire ensuite en sorte que les processus utilisent le tampon de manière circulaire.

Faire ensuite en sorte qu'un seul exécute à la fois en partant du principe que les processus paires sont plus prioritaires que les processus impaires.


Un seul processus utilise le tampon à la fois

// On utilise un sémaphore ; que l'on initialise
// dans le programme principal et non dans les fonctions
S = 1

void acces_tampon(int i) {
  P(S)
}

void liberer_tampon(int i) {
  V(S)
}

Les processus utilisent un tampon de manière circulaire

// Sémaphore via un tableau int T[N]

T[1] = 1

for (i = 2; i < N; i++)
  T[i] = 0;

void acces_tampon(int i) {
  P(T[i])
}

// Chaque processus va réveiller le suivant
void liberer_tampon(int i) {
  if (i < N)
    V(T[i+1])
  else
    V(T[1])
}

Un seul à la fois avec plus grande priorité pour les processus paires

// On utilise une variable qui va compter le nombre
// de processus père
compteur = 0;
S1 = 0;
S2 = 1;
S3 = 1;

void access_tampon(int i) {
  if (i % 2 == 1)
    P(S2);
  else {
    P(S3);
    compteur++;
    V(S3);
    P(S2);
  }
}

void liberer_tampon(int i) {
  V(S2);

  if (i % 2 == 0) {
    P(S3);
    compteur--;

    if (compteur == 0)
      V(S1);

    V(S3);
  } else
    V(S1);
}