Qu'advient-il du contenu du cache sur un commutateur de contexte?

50

Dans un processeur multicœur, qu'advient-il du contenu du cache d'un coeur (disons L1) lorsqu'un changement de contexte se produit sur ce cache?

Le comportement dépend-il de l'architecture ou s'agit-il d'un comportement général suivi par tous les fabricants de puces?

Ankit
la source

Réponses:

42

Cela dépend à la fois du processeur (pas seulement de la série de processeurs, cela peut varier d’un modèle à l’autre) et des systèmes d’exploitation, mais il existe des principes généraux. Qu'un processeur soit multicœur n'a pas d'impact direct sur cet aspect; le même processus peut être exécuté simultanément sur plusieurs cœurs (s'il est multithread) et la mémoire peut être partagée entre les processus. La synchronisation du cache est donc inévitable, quel que soit le déroulement du changement de contexte.

Lorsqu'un processeur recherche un emplacement de mémoire dans le cache, s'il existe une MMU , il peut utiliser l'adresse physique ou l'adresse virtuelle de cet emplacement (parfois même une combinaison des deux, mais ce n'est pas vraiment pertinent ici).

Avec les adresses physiques, peu importe le processus accédant à l'adresse, le contenu peut être partagé. Il n'est donc pas nécessaire d'invalider le contenu du cache lors d'un changement de contexte. Si les deux processus mappent la même page physique avec des attributs différents, cela est géré par la MMU (agissant en tant que MPU (unité de protection de la mémoire)). L'inconvénient d'un cache à adresse physique est que la MMU doit s'asseoir entre le processeur et le cache, de sorte que la recherche dans le cache est lente. Les caches L1 ne sont presque jamais des adresses physiques; les caches de niveau supérieur peuvent être.

La même adresse virtuelle peut désigner différents emplacements de mémoire dans différents processus. Par conséquent, avec un cache virtuellement adressé, le processeur et le système d'exploitation doivent coopérer pour s'assurer qu'un processus trouvera la bonne mémoire. Il existe plusieurs techniques courantes. Le code de commutation de contexte fourni par le système d'exploitation peut invalider la totalité du cache. c'est correct mais très coûteux. Certaines architectures de CPU disposent dans leur ligne de cache d’un ASID (identificateur d’espace d’adresse), de la version matérielle d’un ID de processus, également utilisé par la MMU. Cela sépare efficacement les entrées de cache de différents processus et signifie que deux processus mappant la même page auront des vues incohérentes de la même page physique (il existe généralement une valeur ASID spéciale indiquant une page partagée, mais ceux-ci doivent être vidés s'ils ne sont pas mappés à la même adresse dans tous les processus où ils sont mappés). Si le système d'exploitation veille à ce que différents processus utilisent des espaces d'adressage ne se chevauchant pas (ce qui empêche parfois l'utilisation de la mémoire virtuelle, mais peut parfois l'être), les lignes de cache restent valides.

La plupart des processeurs ayant une MMU ont également un TLB . Le TLB est un cache de mappages d'adresses virtuelles en adresses physiques. Le TLB est consulté avant les recherches dans les caches à adresse physique, afin de déterminer l'adresse physique rapidement lorsque cela est possible; le processeur peut lancer la recherche en mémoire cache avant la fin de la recherche TLB, car les lignes de mémoire cache candidates peuvent souvent être identifiées à partir des bits centraux de l'adresse, entre les bits déterminant le décalage dans une ligne de la mémoire cache et les bits déterminant la page. Les caches à adresse virtuelle contournent le TLB en cas de réussite du cache, bien que le processeur puisse lancer la recherche du TLB pendant qu'il interroge le cache, en cas d'erreur.

Le TLB lui-même doit être géré lors d'un changement de contexte. Si les entrées TLB contiennent un ASID, elles peuvent rester en place. le système d'exploitation n'a besoin de vider les entrées TLB que si leur ASID a changé de sens (par exemple, parce qu'un processus s'est terminé). Si les entrées TLB sont globales, elles doivent être invalidées lors du basculement vers un contexte différent.

Gilles, arrête de faire le mal
la source
2
Très informatif. Si vous pouviez ajouter quelques exemples de la manière dont cela est fait dans de vraies architectures, ce serait encore mieux.
JohnTortugo
2
@JohnTortugo Ce que j'ai écrit correspond assez étroitement à ce que vous pouvez faire sur ARMv7 (par exemple, le processeur de votre smartphone) (la seule architecture dans laquelle j'ai jamais écrit du code de gestion MMU). Je m'attends à ce que d'autres plates-formes telles que x86 soient assez similaires mais je ne pourrais pas écrire à leur sujet. Si vous cherchez des informations concrètes sur une véritable plate - forme, informatique n'est pas le bon site, vous pouvez demander sur Stack Overflow ou génie électrique ou Embeddedd (proposé) .
Gilles, arrête de faire le mal
10

Le cache est généralement inconscient d'un changement de contexte. Seule la séquence d'adresses de mémoire consultées détermine les lignes de cache à remplacer.

La politique de remplacement est généralement une heuristique dépendant du fabricant et de la microarchitecture particulière. Le problème est que l'heuristique ne permet pas de prédire l'avenir, l'adresse et donc la ligne de cache seront ensuite utilisées.

L'heuristique peut être aussi simple que LRU (moins récemment utilisé). Mais avec les CPU modernes, les heuristiques sont plus complexes.

Jetez un coup d'œil aux architectures Intel® 64 et IA-32 - Manuel du développeur du logiciel Volume 3 Le chapitre 11 explique le cache mémoire et les mécanismes de contrôle du cache. AMD l’a inscrit au chapitre 7 du Manuel du programmeur d’architecture AMD64, volume 2: Programmation système . Pour les processeurs basés sur ARM, il semble que les PDF ne soient disponibles que pour les clients enregistrés.

Uli
la source
Pouvez-vous donner une référence pour le premier paragraphe? Ou les documents liés font-ils référence à ce problème?
Raphaël
Le comportement dépend fortement de savoir si le cache est adressé physiquement ou virtuellement. La politique de remplacement n'est pas pertinente ici. Pour ARM, les manuels techniques des processeurs contiennent des informations publiques, par exemple L1 sur Cortex-A9 (ce que vous obtenez dans les téléphones cellulaires de dernière génération), bien que cela puisse être difficile à comprendre sans le manuel de référence d'architecture non public .
Gilles 'SO- arrête d'être méchant'
1
@Raphael J'ai écrit «typiquement» parce qu'avec les processeurs que j'ai rencontrés, le cache en soi n'a aucune connaissance sur les threads, les processus, les contextes, etc. Il ne fait que réagir aux accès à la mémoire. Si le cache de données est vidé et le cache d'instruction invalidé sur un commutateur de contexte, c'est le système d'exploitation qui déclenche cette action, pas le cache. Si vous installez un autre système d'exploitation, ce comportement peut changer.
Uli
@Gilles Pour une fois, j'ai essayé de donner une réponse courte et j'ai décidé de ne pas écrire sur la mémoire virtuelle, car cela impliquait immédiatement le système d'exploitation. Et il y a aussi le calendrier à prendre en compte. «Rien ne change» pourrait être une réponse pour le temps écoulé entre le changement de contexte et le prochain accès à la mémoire, car le contenu du cache pourrait être invalidé mais pas du tout changé.
Uli