« Mémoire cache » : différence entre les versions

Contenu supprimé Contenu ajouté
m suppression d'une répétition
Pano38 (discuter | contributions)
précision + wikif partiel + ref
Ligne 14 :
La mémoire cache, plus rapide et plus proche du matériel informatique qui demande la donnée, est plus petite — en raison de ses performances et donc de son coût — que la mémoire pour laquelle elle sert d'intermédiaire. Commercialement, la notion de cache est apparue sur le [[mainframe]] [[IBM 360 et 370|IBM 360/85]] en 1968.
 
Des mécanismes de mémoires cache peuvent être placés entre tous producteurs et consommateurs de données fonctionnant de façon asynchrone, par exemple [[processeur]] et [[mémoire vive]], [[réseau informatique|réseau]] et espace applicatif, [[disque dur]], {{etc.}}
 
Techniquement, il est avantageux de gérer séparément les données non modifiables (illustrations d'un site distant, section de code d'un programme) et celles qui sont modifiables (formulaire, sections de données, {{etc.}}). Les processeurs ont par exemple le plus souvent des caches séparés pour le code et les données.
 
Sa rapidité nécessaire rend la mémoire cache coûteuse, et pour cette raison limitée. Dans le cas des [[microprocesseurs]], taille et performance de ces caches, externes ou internes, peuvent très fortement influencer la vitesse de traitement des programmes. Il est possible de le mesurer par inhibition totale ou partielle du cache, ou par changement de sa taille s'il est externe.
 
Dans le cas des caches internes, la place utilisée par les transistors du cache dans le [[wafer]] conditionne son coût de fabrication. La mémoire cache est d'autant plus utile que l'algorithme à exécuter demande des accès répétitifs à de petites zones de mémoire :
Ligne 28 :
 
== Dénomination ==
''Mémoire cache'' est la même expression que celle utilisée en [[anglais]], à savoir ''cache memory''<ref>l'expression est apparue dans « Structural aspects of the system/360 model 85 (II) the cache », J. S. Liptay, IBM Systems Journal, janvier 1968</ref>, qui a remplacé « slave-memory », donné par son inventeur [[Maurice Vincent Wilkes]] en 1965. L'[[Académie française]] propose plutôt le terme antémémoire<ref>[http://www.culture.fr/franceterme/result?francetermeSearchTerme=ant%C3%A9m%C3%A9moire&francetermeSearchDomaine=0&francetermeSearchSubmit=rechercher&action=search antémémoire], franceterme, consulté le {{date-|11 12 2022}}</ref>.
 
La différence entre ''mémoire cache'' et ''[[mémoire tampon]]'' réside dans le fait que la mémoire cache duplique l'information, tandis que le tampon peut exprimer l'idée d'une salle d'attente, sans impliquer nécessairement de duplication. Le ''cache buffer'' (tampon de cache) du disque ou ''disk cache'' (cache de disque) est à la fois un tampon où transite l'information et une mémoire cache qui recopie sous forme électronique les données stockées dans le disque sous forme magnétique.
Ligne 37 :
 
== Fonctionnement ==
 
Le cache contient une copie des données originelles lorsqu'elles sont coûteuses (en termes de temps d'accès) à récupérer ou à calculer par rapport au temps d'accès au cache. Une fois les données stockées dans le cache, on y accède directement par le cache plutôt qu'en les récupérant ou en les recalculant, ce qui diminue le temps d'accès moyen.
 
Ligne 54 ⟶ 53 :
== Divers niveaux de mémoire cache ==
On trouve une zone de cache :
* dans les disques durs et la plupart des périphériques ;
* dans les [[serveur proxy|serveurs proxy]] (dont les [[squid (logiciel)|squids]]) ;
* dans les [[serveur informatique|serveurs]] de pages dynamiques ;
Ligne 66 ⟶ 65 :
 
== Mémoire cache des microprocesseurs ==
[[Fichier:Mem hierarchy.svg|vignette|upright|Différents niveaux de mémoire d'un microprocesseur|600px]]
 
Elle est très rapide, mais aussi très chère. Il s'agit souvent de [[Static Random Access Memory|SRAM]].
 
[[Fichier:Mem hierarchy.svg|vignette|Différents niveaux de mémoire d'un microprocesseur|600px]]
 
La présence de mémoire cache permet d'accélérer l'exécution d'un programme. De ce fait, plus la taille de la mémoire cache est grande, plus la taille des programmes accélérés peut être élevée. Il y a cependant une limite au-delà de laquelle l'augmentation de la taille du cache ne sert plus à rien. En effet, dans les codes, il y a des branchements qui ne peuvent pas être prédits par les processeurs. À chaque branchement, la partie du code peut faire appel à une zone mémoire différente. C'est la raison pour laquelle, « l'horizon » au-delà duquel le microprocesseur ne peut voir s'il aura besoin de certaines données limite l’efficacité du cache. La taille du cache est un élément souvent utilisé par les constructeurs pour faire varier les performances d'un produit sans changer d'autres matériels. Par exemple, pour les microprocesseurs, on trouve des séries bridées (avec une taille de mémoire cache volontairement réduite), tels que les [[Duron]] chez [[Advanced Micro Devices|AMD]] ou [[Celeron]] chez [[Intel]], et des séries haut de gamme avec une grande mémoire cache comme les processeurs [[Opteron]] chez AMD, ou [[Pentium 4EE]] chez Intel. Autrement dit, la taille de la mémoire cache résulte d'un compromis coût/performance.
Ligne 89 ⟶ 86 :
 
=== Différents types de défauts de cache (''miss'') ===
 
Il existe trois types de défauts de cache en système monoprocesseur et quatre dans les environnements multiprocesseurs. Il s'agit de :
* les défauts de cache obligatoires : ils correspondent à la première demande du processeur pour une donnée/instruction spécifique et ne peuvent être évités ;
Ligne 97 ⟶ 93 :
 
=== La correspondance (ou ''mapping'') ===
 
La mémoire cache ne pouvant contenir toute la mémoire principale, il faut définir une méthode indiquant à quelle adresse de la mémoire cache doit être écrite une ligne de la mémoire principale. Cette méthode s'appelle le mapping. Il existe trois types de mapping répandus dans les caches aujourd'hui :
* les mémoires caches complètement associatives ('en ngalis 'fully associative cache'') ;
* les mémoires caches directes (en anglais ''direct mapped cache'').
* les mémoires caches N-associatives (en anglais ''N-way set associative cache'') ;
 
==== Cache pleinement associatif (''fully associative cache'') ====
 
[[Image:Fully associative.jpg|centré|600px]]
 
==== Cache pleinement associatif (en anglais ''fully associative cache'') ====
[[Image:Fully associative.jpg|centréthumb|600pxupright]]
[[Image:Addr fully associative.svg|centréthumb|500pxupright]]
Chaque ligne de la mémoire de niveau supérieur peut être écrite à n'importe quelle adresse de la mémoire cache. Cette méthode requiert beaucoup de logique car elle donne accès à de nombreuses possibilités. Ceci explique pourquoi l'associativité complète n'est utilisée que dans les mémoires cache de petite taille (typiquement de l'ordre de quelques [[kibioctet]]s). Cela donne le découpage suivant de l'adresse :
 
[[Image:Addr fully associative.svg|centré|500px]]
 
==== Cache à correspondance préétablie (''direct-mapped cache'') ====
[[Image:Direct mapped cache.JPG|cadre|Mapping direct]]
 
Chaque ligne de la mémoire principale ne peut être enregistrée qu'à une seule adresse de la mémoire cache, par exemple associée au [[Modulo (opération)|modulo]] de son adresse. Cela crée de nombreux défauts de cache si le programme accède à des données en collision sur les mêmes adresses de la mémoire cache. La sélection de la ligne où la donnée sera enregistrée est habituellement obtenue par: ''Ligne'' = ''Adresse'' mod ''Nombre de lignes''.
 
[[Image:Direct mapped cache.JPG|cadre|Mapping direct]]
 
Une ligne de cache est partagée par de nombreuses adresses de la mémoire de niveau supérieur. Il nous faut donc un moyen de savoir quelle donnée est actuellement dans le cache. Cette information est donnée par le ''tag'', qui est une information supplémentaire stockée dans le cache. L'index correspond à la ligne où est enregistrée la donnée. En outre, le contrôleur de la mémoire cache doit savoir si une adresse donnée contient une donnée ou non. Un bit additionnel (appelé bit de validité) est chargé de cette information.
 
Prenons l'exemple d'une adresse de {{nobr|32 bits}} donnant accès à une mémoire adressable par octet, d'une taille de ligne de {{unité|256| bits}} et d'une mémoire cache de {{unité|2{{exp|s}} kibioctets}}. La mémoire cache contient donc {{unité|2{{exp|s+13}} bits}} ({{nobr|1 kio {{=}} 2{{exp|10}} octets}} et {{nobr|1 octet {{=}} 2{{3}} bits). Sachant qu'une ligne est de {{unité|256| bits}} soit {{unté|2{{8}} bits}}, nous déduisons qu'il y a 2{{exp|s+5}} lignes stockables en mémoire cache. Par conséquent, l'index est de s+5 bits.
 
L'adresse de {{unité|32|bits}} permet d'accéder à une mémoire de 2{{exp|32}} octets, soit 2{{exp|35}} bits. L'index étant de s+5 bits, il faut distinguer 2{{exp|22-s}} éléments de la mémoire principale par ligne de cache. Le tag est donc de 22-s bits.
Ce document provient de « https://fr.wikipedia.org/wiki/Mémoire_cache ».