Différence entre l’utilisation de while () et sleep () pour mettre le programme en mode veille

J’ai créé un object partagé et y accéder à partir de deux programmes différents et en mesurant le temps.

Le tableau DATA est l’object partagé entre deux processus.

Cas 1: Utilisation de While à l’intérieur du programme1

programme1:

access shared DATA array ;// to load into memory and avoid page fault during access time calculation start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program1, Time1=%d\n",Time_needed); start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program1, Time2=%d\n",Time_needed); while(1){}; // I replace this by sleep(1000) in CASE-2 

Programme2:

 access shared DATA array ;// to load into memory and avoid page fault during access time calculation start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program2, Time1=%d\n",Time_needed); start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program2, Time1=%d\n",Time_needed); 

SORTIE: je lance d’abord programme1, puis programme2

 Inside Program1, Time1 = 17620 Inside Program1, Time1 = 17680 Inside Program2, Time1 = 7620 Inside Program2, Time1 = 7600 

Cas 2: Utilisation de sleep () dans programme1

programme1:

 access shared DATA array ;// to load into memory and avoid page fault during access time calculation start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program1, Time1=%d\n",Time_needed); start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program1, Time2=%d\n",Time_needed); sleep(1000); 

Programme2:

 access shared DATA array ;// to load into memory and avoid page fault during access time calculation start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program2, Time1=%d\n",Time_needed); start=timer; access shared DATA array end=timer; Time_needed= end-start printf("Inside Program2, Time1=%d\n",Time_needed); 

SORTIE: je lance d’abord programme1, puis programme2

 Inside Program1, Time1 = 17620 Inside Program1, Time1 = 17680 Inside Program2, Time1 = 17620 Inside Program2, Time1 = 17600 

De la sortie dans le cas -1, je peux dire que le tableau DATA de données partagées est chargé dans la mémoire / cache par le premier programme et que le second programme y accède depuis le cache. Cela vaut également pour CASE-2, mais le résultat semble être vidé de la mémoire cache pendant que Programme1 entre en veille.

J’utilise GCC sous Linux.

Un indice? Merci d’avance .

    Vous n’avez pas décrit exactement comment vous exécutez les différentes versions (processus différents?), Mais en supposant qu’elles soient séquentielles – il est possible que vous voyiez l’effet de sleep ()

    Cela dépend bien sûr de l’implémentation exacte et du matériel, mais il est très probable que votre processeur sera dans un état d’économie d’énergie / de veille (c’est ce pour quoi il est conçu). Si tel est le cas, les caches de base devront être vidés dans le cadre du processus, et vous vous réveillerez avec des caches froids. La boucle whie, quant à elle, est conçue pour faire une boucle d’attente chargée tout en gardant votre processeur actif (ainsi que les caches), sauf en cas de changement de contexte.

    Les détails exacts dépendent à nouveau de l’implémentation. Sur x86, vous pouvez utiliser un assemblage en ligne pour appeler des instructions monitor + mwait vous permettant de spécifier la profondeur exacte de l’état C que vous souhaitez obtenir. Plus il est profond, plus de caches seront fermés (surtout pour la L3).

    Je suis d’avis que nous ne pouvons prédire le comportement du cache selon votre cas.

    Cela dépend également de votre matériel dont vous n’avez pas parlé (comme le nombre de cœurs de processeur (physiques ou logiques présents)).

    Nous ne pouvons pas dire que programme_2 sera planifié sur le même kernel et juste après programme_1 car tout dépend du planificateur de système d’exploitation. Ainsi, programme_2 peut utiliser le cache rempli par programme_1 ou non.

    Il est possible que le cache soit vidé en raison d’un autre programme planifié juste après le programme_1.