e. Qu'est-ce que c'est la multitâche de préemption et de non-préemption? Linux est un système d'exploitation qui utilise la
préemption ou non préemption (Note: considère les processus d'utilisateurs et du noyau «kernel»)?
f. Définissez les notions d'action atomique, de section critique, de l'état de course (race condition)? Expliquez chaque cas.
g. Quelles sont les propriétés à assurer dans une section critique?
h. Expliquez les notions suivantes:
Busy waiting
Barrier
Sémaphore
Monitors
i. Expliquez les primitives send et receive . Quelles sont les modalités de synchronisation de ces primitives?
j. Donnez votre définition personnelle de RPC et Rendez-vous? Vous pouvez utiliser une figure pour expliquer.
3. La Programmation concurrente en Java: Threads
a. Expliquez les méthodes suivantes de la classe Thread: run, start, join, sleep et yield.
b. Écrivez un programme en Java qui utilise deux threads et un buffer limité et circulaire avec les comportements suivants
(vous pouvez utiliser un sémaphore ou un moniteur pour implémenter la section critique):
Un premier thread va lire au clavier un message et va l’écrire dans un buffer limité et circulaire.
Le second thread va lire à partir du buffer limité et circulaire son contenu. Après, le thread va l ‘écrire dans un
fichier.
c. Utiliser une barrier et plusieurs threads pour implémenter un programme en Java qui réalise l’addition de tous les
éléments d'un tableau A[m, n].
Suggestion:
La manière plus simple de résoudre ce problème est d’utiliser un programme séquentiel.
program addition_elements
{
int sum, a[m,n];
...
sum = 0 ;
for (int i=0; i < m; i++)
for (int j=0; j < n; j++)
sum= sum + a[i, j];
...
print(sum);
}
Quand on utilise plusieurs threads et une barrier, on peut diviser le tableau en régions et donner chaque région par
un thread différent. La barrier est utilisée pour assurer que l’addition de tous les résultats partiaux sera exécutée,
seulement après que le dernier thread est finis l’addition de sa région.
program addition
{
int number_workers=m;
int sum_total, sum[m], a[m,n]; // sum_total=0; sum[0...m-1]=0; a[0...m, 0...n]=?
barrier b(m);
...
read_all_elements(a); // read m*n values and put them into the array 'a'
...
for(int i=0; i < m; i++)
create_thread( worker(b, sum, i, a, i, n) );
...
while(get(barrier) > 0) yield();
for(int i=0; i < m; i++)
sum_total= sum_total + sum[i];
print(sum_total);
}
worker(barrier b, int sum[],int index_sum, int a[ ], int m, int n )
{
for (int j=0; j < n; j++)
sum[index_sum]= sum[index_sum] + a[m, j];