Académique Documents
Professionnel Documents
Culture Documents
: 2022/2023
Niveau : 3ème année
Département de Génie Informatique Enseignant : Y. SALAH
Systèmes d’exploitation
TP02 : Synchronisation des tâches
Objectifs :
- Synchronisation des tâches en utilisant le mécanisme Attendre/Signaler ou sémaphore.
- Application sur le mécanisme rédacteurs/lecteurs.
Algorithme C++
Prio SetThreadPriority(handle_tache, n) //n = priorité
ATTENDRE(ev) WaitForSingleObject(ev,INFINITE)
ATTENDRE(1s) Sleep(1000) // temps en ms
SIGNALER(ev) SetEvent(ev)
P(Mutex) WaitForSingleObject(Handle_Mutex, INFINITE)
V(Mutex) ReleaseMutex(Handle_Mutex)
Travail demandé:
- Compléter le programme ci-dessous.
- Exécuter le programme et afficher les résultats.
- Qu’est ce que vous remarquez ? Résoudre ce problème en utilisant un Mutex.
# include "stdio.h"
# include "windows.h"
HANDLE ev1;
HANDLE Handle_Mutex;
DWORD wMutex;
5
DWORD WINAPI nom_tache(LPVOID param)
{
// code de la tâche
return 0;
}
void main( )
{
HANDLE htache[3];
DWORD Data1, Data2, Data3;
CloseHandle(htache);
}
Tâche VéhiculeSensOuest
{
SensOuest_demande_VU( ) ;
Accéder sur la voie unique ;
SensOuest_libére_VU( ) ;
}
- Créer les deux tâches : VehiculeSensEst et VehiculeSensOuest
VehiculeSensEst
{
for(int i=0; i<25; i++)
{
Sleep(rand()%100); // rand() donne une valeur aléatoire
0<r<1
SensEst_demande_VU() ;
6
Sleep(rand()%100) ; // durée de passage dans la voie
unique
SensEst_libére_VU() ;
}
}
VehiculeSensOuest
{
for(int i=0; i<25; i++)
{
Sleep(rand()%100); // rand() donne une valeur aléatoire
0<r<1
SensOuest_demande_VU() ;
Sleep(rand()%100) ; // durée de passage dans la voie
unique
SensOuest_libére_VU() ;
}
}
On se donne comme objectif de résoudre ce problème de synchronisation dans les deux cas
suivants :
• Un seul véhicule à la fois sur la voie unique,
• La capacité de la voie est limitée à 5 véhicules.
Pour chaque cas développez les procédures SensEst_demande_VU( ) , SensEst_libére_VU( ),
SensOuest_demande_VU( ) , SensOuest_libére_VU( ).
Ces procédures doivent afficher à chaque fois l’état de la voie unique (c-à-d le nombre de
véhicule dans le sens Est et le nombre de véhicules dans le sens Ouest). On peut utiliser la
fonction suivante :
void printEtat( )
{
printf("%d Sens Est , %d Sens Ouest \n", nbEst, nbOuest);
}
On peut utiliser deux Sémaphores Se et So pour contrôler l’accès des véhicule dans le sens Est et
les véhicules dans le sens Ouest, à la voie unique, et un Mutex pour protéger les zones de
traitement.