2017-08-29 2 views
0

J'ai écrit un morceau de code où je suis allouer de la mémoire à la variable Bextradata (qui est membre de la structure qui est également allouée à l'aide malloc) commeComment fonctionne CPU lit les données de la mémoire? Comment cache joue un rôle important

Bextradata = (U8_WMC *) malloc(Size); 
memset(Bextradata, 0,Size); 
memcpy(BextraData,pdata + 18,Size); 

et plus tard en essayant de lire cette variable dans un autre fichier que trop juste une fois. Alors comment cette variable va lire de la mémoire.elle placera cette variable dans un cache ou il va le lire de la mémoire principale.

Merci à l'avance

+0

Dépend de la plate-forme processeur + système d'exploitation que vous utilisez. Je travaille sur une plate-forme où nous n'avons pas de cache du tout. – Vagish

+0

Systèmes avec mémoire cache de lecture de mémoire principale par des lignes de mémoire cache (par exemple 32 ou 64 octets à la fois). Donc, même si vous n'accédez pas à votre variable, il y a toujours une chance, elle est déjà lue par un autre code. –

Répondre

1

Avant de comprendre le fonctionnement d'une unité centrale de traitement, vous devez comprendre quelques termes. La CPU se compose de l'ALU (pour les opérations arithmétiques et logiques), de l'unité de contrôle et d'un ensemble de registres. Le nombre de registres dans une CPU dépend de l'architecture et varie. Les types de registres présents sont les registres à usage général, les registres d'instruction à usage spécial et quelques autres. Vous pouvez lire à leur sujet. Maintenant, quand nous disons généralement processeur 32 bits ou processeur 64 bits, nous faisons référence à la taille des registres de la CPU.

Maintenant, regardons le code suivant:

int a = 10; 
int b = 20; 
a = a + b; 

Lorsque le programme ci-dessus est chargé, il est des instructions sont stockées dans la mémoire principale. Chaque instruction d'un programme est stockée dans un emplacement de la mémoire principale. Chaque emplacement a une taille spécifique (dépend de l'architecture à nouveau, mais supposons que c'est un octet). Chaque endroit a une adresse. La taille de l'adresse de l'emplacement particulier dans la RAM est égale à la taille du pointeur d'instruction. Dans les systèmes 64 bits, la taille du pointeur d'instruction sera de 64 bits. Cela signifie qu'il peut adresser jusqu'à 2^64-1 emplacements. Et puisque 1 emplacement est généralement de 1 octet, la RAM totale, en théorie pour les systèmes 64 bits, pourrait être de 16 exaoctets. (pour les systèmes 32 bits: 2^32-1 ~ 4 Go)

Regardons maintenant la première instruction a = 10. Il s'agit d'une opération de stockage. Un ordinateur peut effectuer les opérations de base suivantes: ajouter, multiplier, soustraire, diviser, stocker, sauter, etc. Vous pouvez lire le jeu d'instructions de n'importe quel processeur, pour en savoir plus. Encore une fois, le jeu d'instructions diffère d'un système à l'autre. En revenant, Lorsque le programme est chargé en mémoire, le pointeur d'instruction pointe vers la première adresse ou l'adresse de base. Dans ce cas, c'est a = 10. Le contenu de cet emplacement est amené à l'un des registres généraux de la CPU. A partir de cela, il est pris à l'ALU qui comprend qu'il s'agit d'une opération de stockage (des bits supplémentaires sont ajoutés qui le représentent comme une opération de magasin). L'ALU le stocke ensuite dans l'un des emplacements dans la RAM et également dans le cache. La décision de le stocker dans le cache dépend du compilateur et d'un concept appelé prélecture de matériel. Lorsque le compilateur analyse un programme, il voit les variables fréquemment utilisées et permet de les stocker dans le cache. Dans ce cas, nous pouvons voir que la variable 'a' sera utilisée à nouveau afin que le compilateur ajoute des instructions intermédiaires supplémentaires au programme, pour le stocker également dans le cache. Pourquoi? Pour un accès plus rapide. (En termes de vitesse, souvenez-vous toujours des registres> Cache> RAM> Disque)

Après l'exécution de la première instruction, le pointeur d'instruction est incrémenté et pointe vers la seconde instruction, c'est-à-dire b = 20. La même chose arrive avec ça aussi.

La troisième est a = a + b. Pour cela, il y a en fait quatre opérations (si vous regardez le niveau de l'assemblage), à ​​savoir: 1) Récupérer un, 2) Récupérer b, 3) Ajouter un et b, 4) stocker le résultat dans a. Maintenant que les variables a et b sont présentes dans le cache, elles proviennent de ces emplacements. Ils sont ensuite ajoutés et le résultat est stocké dans un.

J'espère que vous avez compris comment cela fonctionne.

Vous devez également savoir que lorsqu'un programme est chargé dans la mémoire principale, il occupe un certain espace. Cet espace est appelé un segment. Il a une adresse de base et une adresse finale. Vous pouvez considérer l'adresse de base comme la première instruction et l'adresse finale comme dernière instruction. Si à partir de votre programme vous essayez de déréférencer un pointeur qui pointe de l'extérieur de ce segment, vous obtenez la fameuse erreur - Erreur de segmentation. Par exemple:

int *ptr = NULL; 
printf(*ptr); 

Cela me donnera une erreur de segmentation que je suis en train de déréférencer un pointeur qui stocke une adresse dont la valeur est NULL et puisque NULL est pas dans le segment, il donnera une faute de SEG.

+0

Maintenant que les variables a et b sont présentes dans le cache, elles sont amenées à partir de ces emplacements. Ils sont ensuite ajoutés et le résultat est stocké à un.:->Ce résultat est mis à jour dans les deux endroits? Je veux dire la RAM ainsi que le cache – prashant

+0

Cela dépend d'un concept appelé pré-chargement du cache. Lorsque le compilateur compile le code, il analyse la récurrence d'une variable particulière. Si, par exemple, après cette instruction, c'est-à-dire a = a + b, vous avez une autre instruction qui utilise la variable a, alors il est logique de la stocker également dans le cache, n'est-ce pas? Le compilateur ferait cela pour vous en ajoutant des instructions supplémentaires, lors de la compilation. C'est ce qu'on appelle la préextraction de logiciels. –

+0

Bien que ce soit un peu correct au niveau conceptuel, même le compilateur optimiseur le plus simple réalisera que le code est le même que 'int a = 30;' et qu'il n'a pas à stocker 'b' n'importe où. Et peut-être pas «a» non plus, selon ce qui se passe ensuite. –