Beruflich Dokumente
Kultur Dokumente
SIGNAL(S)
S = S +1
Si S >= 0 alors
Extraire le descripteur situ en sortie de F(S) et passage
ltat prt de la tache correspondante
Finsi
Poursuite du programme : sortie de la section critique
La section critique doit donc tre encadre par lappel de la fonction WAIT en dbut de section et de la fonction SIGNAL
en fin de section :
II- EXERCICE 1 :
Soit un systme ordonnancement premptif sans priorit (horloge systme T=10ms). Trois tches T1, T2, T3
sont en activit, les tches T1 et T2 accdent une ressource non partageable R :
T1
T2
T3
Date de dmarrage
de la tche (ms)
0
5
8
Priode accs R
50
50
60
Si une tche est bloque au cours dune tranche de temps par un processus dexclusion le systme
dexploitation provoque alors une attente jusqu la fin de la tranche de temps.
Reprsentez le chronogramme dexcution des diffrentes tches dans les cas suivants :
- Gestion de lexclusion mutuelle par blocage des interruptions
- Gestion de lexclusion mutuelle par un verrou
- Gestion de lexclusion mutuelle par un smaphore
III- EXERCICE 2 : gestion dune ressource non partageable sous windows
Mettre en uvre l'accs une ressource non partageable, partir du programme suivant bas sur une
application de type Console.
La Ressource Non Partageable sera modlise par une variable entire globale RNP.
// td2.cpp : gestion d'une ressource non partageable / question 1
//#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
// ressource non partageable reprsente par une variable globale RNP
int RNP ;
// fonction de temporisation
int tempo()
{ int j, k ;
for(j=0; j<1000000;j++) k=j+1;
return 0;
}
// fonction associe au thread_1
DWORD Fct_Thread_1(LPDWORD lp)
{ char c ;
int i, j ;
i=0;
do {//dbut section critique
printf("debut_acces RNP Thread1\n") ;
RNP = 0 ; j = 0 ;
do { printf("RNP%d ",RNP) ; tempo() ; j++ ; RNP++ ; } while (j<10) ;
printf("\nfin_acces RNP Thread1\n\n") ;
// fin section critique
i++;
} while (i<10) ;
c = (char)getchar() ;
return 0 ;
}
DWORD main(void)
{ char c ;
int i,j ;
DWORD dwthreadid, dwthrdparam ;
HANDLE hthread_1 ;
// cration du thread_1
hthread_1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Fct_Thread_1,
&dwthrdparam,0, &dwthreadid) ;
// traitement du thread principal associ la fonction main (Main_Thread)
i=0;
do {//dbut section critique
printf("debut_acces RNP Main_Thread\n") ;
RNP = 0 ; j = 0 ;
do { printf("RNP%d ",RNP) ; tempo() ; j++ ; RNP++ ; } while (j<10) ;
printf("\nfin_acces RNP Main_Thread\n\n") ;
// fin section critique
i++;
} while (i<10) ;
c = (char)getchar() ;
}
1) Mise en route
A partir du programme prcdent visualiser les conflits d'utilisation de la ressource non partageable.
Quel devrait tre le bon rsultat ?
2) Gestion par blocage des autres tches
Agir sur la priorit de la tche au moment de l'utilisation de la ressource non partageable pour lui donner tous les
droits relativement l'accs CPU.
Est-ce que cela marche tous les coups ?
Quel est le problme sur un accs relativement long sur la ressource ?
3) Cration d'un verrou logiciel.
Dfinir une variable verrou pour empcher l'accs simultan la ressource non partageable.