4.1. Utilisation de l'horloge physique

Un dispositif extérieur déclenche une interruption toutes les millisecondes. La prise en compte de cette interruption par le système entraîne l'exécution du programme suivant:
{ programme sous IT horloge }
cpt_mes := ( cpt_mes + 1 ) mod 1000;
si cpt_mes = 0 alors
	cpt_sec := ( cpt_sec + 1 ) mod 60;
	si cpt_sec = 0 alors
		cpt_min := ( cpt_min + 1 ) mod 60;
		si cpt_min = 0 alors
			cpt_h := ( cpt_h + 1 ) mod 24;
			si cpt_h = 0 alors cpt_j := cpt_j + 1;
			finsi;
		finsi;
	finsi;
finsi;
A- Dé1finir la fonction système qui délivre dans un tableau de 5 entiers la date exacte, à la milliseconde près, au moment de l'appel. On prendra garde au fait que l'interruption d'horloge peut survenir pendant l'exécution de cette fonction.
B- Dans le cas d'un système en monoprogrammation, comment vous proposeriez-vous d'utiliser cette fonction système pour optimiser la durée d'exécution d'un programme?
C- Dans le cas d'un système en multiprogrammation, qu'est-ce qui empêche d'utiliser cette fonction pour aider à optimiser la durée d'exécution d'un programme?
Solution de l’exercice 4.1

4.1.1. Question A

L'interruption d'horloge pouvant intervenir à tout moment, si elle est prise en compte pendant l'appel de la fonction système, certains des entiers transmis seront relatifs au temps précédant l'interruption, d'autres à celui qui le suit, et il y aura incohérence dans les données. Pour éviter que l'interruption soit prise en compte pendant l'exécution de la fonction, il suffit de masquer les interruptions au début et de les démasquer à la fin. Si on ne veut pas perdre d'interruption d'horloge, il faut que la durée de ce masquage soit assez bref. Étant donné que cette exécution est plus simple que le programme de prise en compte de l'interruption elle-même, on peut penser que ce sera bien le cas, sinon la machine passerait son temps à mettre à jour les compteurs de l'horloge!
fonction temps ( var t: tableau [1..5] de entier);
début
	masquer_IT_horloge;
	t [1] := cpt_mes;
	t [2] := cpt_sec;
	t [3] := cpt_min;
	t [4] := cpt_h;
	t [5] := cpt_j;
	démasquer_IT_horloge;
fin;

4.1.2. Question B

Cette fonction permet donc de connaître à tout moment l'heure exacte. Si on l'appelle à différents endroits d'un programme, on peut alors, par différence, calculer le temps écoulé entre deux appels successifs. En monoprogrammation, le programme étant seul en mémoire, ce temps est donc la durée d'exécution (temps Unité Centrale et temps d'entrées-sorties) du programme. En faisant de telles mesures, il est donc possible de savoir quelles parties du programme prennent le plus de temps, et essayer d'optimiser ces parties.

4.1.3. Question C

Dans le cas d'un système en multiprogrammation, un processus passe successivement dans trois états: prêt, élu, bloqué. La mesure de durée obtenue par différence entre deux appels à la fonction temps, mesure en fait le temps pendant lequel le processus a utilisé l'unité centrale, et le temps d'attente des entrées-sorties (bloqué), mais aussi le temps pendant lequel il a été en attente du processeur attribué à un autre processus. Ce dernier temps, imprévisible et sans lien avec le comportement du programme, doit pouvoir être éliminé des mesures, si on désire les utiliser pour savoir les endroits du programme qui sont les plus coûteux. Les mesures importantes pour optimiser la durée d'exécution d'un programme sont en fait le temps virtuel, représentant le temps pendant lequel le processus a été actif, et le temps pendant lequel le processus est resté bloqué. Ceux-ci peuvent être mesurés par le système chaque fois qu'il change l'état du processus suivant le graphe ci-dessus.