© 2000-2015 LHERBAUDIERE

7 pages à l'impression

dernière mise à jour
22 mars 2013
Hit-Parade

complément sur LES MEMOIRES

problématique
l'occupation de la mémoire, les limitations
mémoire paginée
une solution provisoire
mémoire étendue
la solution actuelle et ses limites
mémoire cache
optimisation pour aller plus vite
les RAM actuelles
une liste très incomplète et forcément évolutive
une collection d'icônes pour visiter tout le site


En janvier 1968, le plus gros ordinateur de France, celui du Centre de Calcul Scientifique de l'Armement, basé au fort de Montrouge, possédait une unité centrale dont la mémoire était de 4096 koctets, et cette unité occupait cependant une armoire double de 2 fois 19 pouces de largeur et de 2 mètres de haut. Elle évolua rapidement dans les mois suivants. Après l'introduction du circuit intégré quelques années plus tard, puis l'apparition en 1980 du 8086 la révolution de la microinformatique a vraiment démarré et la course à la mémoire l'a accompagnée.

Revenons sur cette histoire.

Le 8086 premier microprocesseur à pouvoir adresser un mégaoctet disposait effectivement de 20 lignes d'adresse contre seulement 16 à tous ses prédécesseurs qui se contentaient de 64Koctets. Lorsque IBM décida de développer son premier PC, apparu sur le marché en 1981, les pavés de RAM dynamique avaient une taille de 32Koctets et il parut largement suffisant aux concepteurs du PC de le doter de 512Ko de RAM ce qui représentait la bagatelle de 16 boitiers sur la carte mère. Mais, anticipant quand même un peu sur l'avenir ils convinrent que 640Ko de RAM pourraient être installés et par conséquent que 384Ko sur le 1Mo que pouvait adresser le processeur seraient inutilisés par les programmes et réservés aux extensions. La première carte d'extension fut bien évidemment la carte écran qui occupait alors environ 100Ko pour un écran de 12 pouces doté au mieux de 16 couleurs.

les limitations

Les programmes d'alors ne dépassaient que rarement la dizaine de Koctets, mais très vite de nouveaux langages virent le jour et la complexité des programmes s'accrut. Mais la capacité de stockage des disques durs était très limitée puisque le premier PC n'avait qu'un disque de 5Mo et que, pendant quelques années, le record fut de 20Mo. Les programmes étaient alors disponibles sur disquettes et fréquemment ils nécessitaient plusieurs disquettes.

On commença aussi à ressentir la nécessité d'outils plus conviviaux en particulier du type gestionnaire de fichiers affiché graphiquement (Dosshell) et il fallut commencer à partager la mémoire vive entre plusieurs programmes actifs séparément (en particulier ceux qu'on appellera plus tard les TSR).

C'est aussi l'époque où l'idée qu'il n'était pas nécessaire de charger l'intégralité du programme en mémoire vive, mais seulement la partie active à l'instant de celui-ci, fit son chemin.


partager les fichiers en tranches

En fait on n'avait pas le choix on disposait au plus de 640K de RAM et certains logiciels commençaient à dépasser cette taille. La pratique de l'overlay, c'est à dire du recouvrement d'un bout de programme par un autre au fur et a mesure de l'exécution, commença à se généraliser, mais comme les logiciels étaient sur disquette cela entraina la multiplication des manipulations de disquette et donc des temps d'attente gigantesques.

C'est alors que quelques concepteurs s'avisèrent qu'entre 640K et 1M toute la place disponible n'était pas utilisée. Ils imaginèrent alors un concept appellé mémoire expansée (EMS expanded memory system) qui permettrait de transgresser la limite des 640K très largement et même bien au dela du mégaoctet reconnu par le processeur. Comment cela est-il possible? En fait c'est très simple dès lors qu'on dispose de pavés de mémoire et de circuits de décodage. L'idée a été d'utiliser une plage de 64K située dans la zone dite de mémoire haute c'est à dire entre 640Ko et 1Mo et non utilisée par la carte écran.

Pourquoi 64K et non une autre valeur, tout simplement parce qu'à l'époque le boitier mémoire le plus gros qu'on savait intégrer faisait 64K. Le 8086 pouvait effectivement reconnaitre ce pavé de 64Ko et en adresser toutes les cases dès lors qu'elles se situaient quelque part dans sa plage inférieure à 1Mo.

64Ko c'est mieux que rien mais ça ne résolvait pas le problème du chargement d'un programme de 1 voire 2 Moctets, et c'est là que l'idée de chargement de la seule partie qui sert à un instant donné se révèle utile.

le concept de mémoire paginée

Supposons qu'on ait réalisé une carte EMS de 2Moctets, c'est à dire comportant 32 boitiers de 64K, assemblés de telle sorte qu'on puisse y ranger un logiciel de 2Moctets. L'idée c'est de ne faire voir au 8086 qu'une plage de 64K dont l'adresse relative par rapport au 8086 sera située à une valeur fixe 800K-864K par exemple. Et entre le connecteur de la carte mère et la mémoire physique de 32 boitiers on va mettre un aiguillage qui sera piloté par un logiciel spécifique chargé en mémoire basse sur la carte mère. Donc lorsque le programme pour fonctionner aura besoin des données qui sont situées dans le boitier numéro n de la carte EMS il enverra à celle-ci un ordre pour placer l'aiguillage en position telle que ce boitier n soit accessible sur le bus du 8086 aux adresses 800K-864K. On pourra ainsi par tranches successives de 64K(on parle de pages mémoires ou par extension de mémoire paginée) exploiter une mémoire EMS qui pourrait être gigantesque. En pratique on n'a pas réalisé de cartes de plus de 2Moctets pour des raisons de coût essentiellement.

Parallèlement on s'est avisé que dans la même plage de mémoire haute il restait encore de la place disponible et on a commencé à rajouter sur la carte mère des boitiers mémoires (sur les cartes de deuxième génération des slots spécifiques ont été prévus pour cela) jusqu'à 1Moctet. Et on a ainsi pu placer dans cette zone des morceaux de logiciels résidents pendant toute la session. Une partie du système d'exploitation MSDOS pouvait ainsi être déportée ce qui libérait un même volume dans la partie basse alors dévolu aux programmes utilisateurs.

Configuration

Précisons que si on avait ajouté 384K de RAM on ne disposait pas de 640+384= 1M de mémoire utilisable car la carte écran qui dispose d'une certaine quantité de mémoire se situe dans la zone entre 640K et 1M. C'est pourquoi dans les programmes de configuration de la machine config.sys on va trouver les instructions du type

DEVICE = HIMEM.SYS qui charge le gestionnaire de mémoire haute.

DEVICE = EMM386.exe qui indique que l'on va utiliser EMM386 qui est à la fois un gestionnaire de mémoire paginée et un gestionnaire du coprocesseur mathématique,

sur la même ligne on va voir apparaitre :
une indication concernant la mémoire EMS qui pourra être NOEMS pour indiquer qu'on n'utilise pas de mémoire paginée mais seulement le coprocesseur,
qui pourrait être au contraire 1024 RAM ce qui signifie alors que la mémoire paginée sera utilisée et que sa taille est de 1024 K (soit 1M). Notons que c'est emm386 qui va être chargé de définir l'adresse de la plage de 64K par laquelle on accède à la mémoire paginée.
Mais emm386 ne sait pas identifier qu'il existe une carte écran et où elle se trouve. Il faudra donc lui fournir cette information. On trouvera donc sur la ligne DEVICE = EMM386.exe aussi une information d'exclusion de zone mémoire par exemple x = D400-D7FF correspondant à l'emplacement défini en hexadécimal occupé par la carte écran
et inversement on pourra lui signifier une zone disponible qu'il risquerait de ne pas exploiter sous la forme I = E000 - ECFF. Dans ces commandes X signifie exclusion et I au contraire include (ou inclure en français).
La ligne de commande complète serait alors du type :
device = emm386.exe 1024 ram x = d400 - d7ff i = e000 - ecff
Notez que l'on peut écrire en majuscules ou en minuscules ou mélanger car DOS ou Windows ne font pas la différence (ce qui n'est pas le cas sous un autre système d'exploitation tel Unix par exemple).

Si l'on veut imposer le positionnement de la plage de 64K émulant la mémoire paginée on doit indiquer l'adresse de base de cette zone par exemple :

device = emm386.exe 512 frame = d000

signifie que la mémoire paginée est de 512K et que l'adresse de base du bloc de 64K est d000. Attention si vous utilisez cette technique soyez absolument certain qu'il y a bien 64K de disponible à partir de d000 en un bloc contigüe, car si tel n'était pas le cas et que ce bloc de 64K chevauche par exemple votre carte écran (ou une carte réseau) les conséquences seraient un plantage : mais si vous n'avez plus d'écran vous ne savez plus où vous en êtes, alors prudence!

Si par contre vous n'avez pas spécifié le positionnement de votre zone de 64K emm386 va le rechercher et s'il ne trouve pas un bloc suffisant il vous affichera un message d'erreur, vous ne pourrez pas utiliser de mémoire paginée mais votre machine ne sera pas plantée. Pour éviter ce problème on recommande de placer l'instruction device = emm386.exe juste après himem.sys et toujours avant dos = high et dos = umb

On trouvera aussi dans le fichier de configuration la commande DOS = HIGH, UMB. High signifie que l'on transfère 64K du DOS en mémoire haute (HMA: high memory area) et UMB (upper memory blocks) que l'on pourra utiliser tout le reste de la mémoire haute disponible pour les programmes d'application. Notez cependant que ce transfert de msdos est de 64K au maximum, si la mémoire haute disponible est inférieure à 64K le gestionnaire ne mettra en mémoire haute que ce qu'il pourra y placer et ce n'est que s'il reste encore de la place que la commande UMB pourra être effective et s'appliquer en particulier aux programmes résidents tels mouse.com, display.sys, etc.


la mémoire étendue

Bien sûr ce qui précède était vrai pour un PC à base de 286, car le 8086 n'était quasiment déjà plus utilisé lorsque le concept de mémoire paginée a été inventé.

Les processeurs suivants 386 486 et pentium ont vu leur bus d'adresse passer à 32 bits et même 64 pour les pentiums récents. Il était alors possible d'adresser directement jusqu'à 4Go en 32 bits sans avoir besoin de passer par l'artifice de la mémoire paginée


fig.la mémoire dans un ordinateur standard des années 80-90

Mais pour des raisons de compatibilité matérielle et logicielle avec les processeurs précédents la plage réservée à un programme utilisateur est toujours comprise entre 0 et 640K. Intel a donc utilisé l'idée qui prévalait dans le concept EMS de faire croire au processeur qu'une information est à une adresse alors que cette adresse est décalée par un décodage secondaire, mais au lieu d'utiliser ce principe sur une petite zone de 64K l'idée a été de le faire sur toute la plage de 1M.

Donc dans le 486 le processeur travaille toujours sur1M, mais on dispose de n fois 1Mo de RAM sur la carte mère et on a pris l'habitude de parler de mémoire étendue pour tout ce qui est au delà du premier mégaoctet (d'où le symbole XMS pour eXtended Memory System). En fait c'est comme si l'on avait n processeurs de type 8086 travaillant non en parallèle mais successivement. Le gain est essentiellement dans les chargements en mémoire puisque plusieurs programmes peuvent cohabiter c'est à dire être chargés en mémoire simultanément (typiquement un dans chaque bloc de 1Mo) et le processeur se branche successivement à chaque bloc. On parle souvent de machines virtuelles pour expliciter le fait qu'un seul bloc de 1Mo est en relation avec le processeur et que les autres sont en attente. C'est un peu un abus de langage.

Il n'y a évidemment aucune limitation à la taille de la mémoire XMS en théorie (4Go en 32 bits) mais il est évident qu'il ne sert à rien de dépasser une valeur raisonnable (256Mo semble largement suffisant en pratique) car le processeur ne continue à traiter qu'une instruction à la fois (même si on peut charger une instruction en même temps qu'on en exécute une autre et que des algorithmes très sophistiqués cherchent à anticiper l'instruction suivante) et l'utilisateur n'est évidemment pas capable de suivre l'exécution de plus d'une dizaine de programmes en pratique.


mémoire cache

Il n'y a quasiment plus de limite à la mémoire, mais le constat c'est que le processeur continue à échanger des informations avec les mémoires et que c'est cela qui pénalise le plus l'exécution d'un programme parce que les boitiers mémoires sont loin du processeur et que sur les bus qui relient ces boitiers au processeur l'information circule relativement lentement (133MHz maxi et souvent beaucoup moins). L'analyse d'un programme informatique montre que nombre d'opérations sont itératives on a donc imaginé d'intégrer dans le processeur ou à son voisinage immédiat, c'est à dire dans le même boitier une certaine quantité de mémoire dans laquelle on stockerait les infos qui servent le plus et ainsi on perdrait moins de temps à aller les chercher.

C'est ainsi qu'est né le concept de mémoire cache, appellation pas très heureuse d'ailleurs. Les progrès de l'intégration des composants électroniques ont permis d'imaginer pour les derniers pentiums un double niveau de cache : d'une part, une mémoire de 256K réalisée indépendamment de la puce pentium mais intégrée dans le même boitier et communiquant avec le pentium par un bus optimisé, et d'autre part, une mémoire plus petite mais intégrée directement dans la puce processeur et donc d'accès infiniment plus rapide. On va ainsi mettre dans la mémoire intégrée les infos les plus pertinentes et dans la seconde celles qui servent beaucoup mais quand même un peu moins.

Le double niveau de cache permet en outre plus facilement le chargement d'une instruction pendant qu'on traite la précédente ce qui est l'un des moyens les plus efficaces de gagner du temps en faisant presque deux choses à la fois.

Précisons que cette gestion des caches est transparente pour l'utilisateur, leur plage d'adresse en particulier n'est généralement pas connue (sauf si vous étudiez avec beaucoup d'attention les sites web d'Intel ou de ses concurrents), mais il ne faut pas rêver : le processeur n'est pas un devin, il ne sait pas à l'avance quelles infos seront à mettre dans le cache, ni que vous allez changer d'application, le gain est donc généralement limité, sauf dans le cas d'un processus itératif dont le programme tient intégralement dans le cache.

Dans les nouveaux processeurs Intel à double coeur qui peuvent donc traiter effectivement 2 opérations simultanément puisqu'ils ont 2 unités centrales on dispose de 3 caches : 2 de niveau 1 de 32 Koctets et 1 de niveau 2 de 2 ou 4 Moctets selon la version. Et en 2010 on commence à exploiter des processeurs à 4 coeurs et prochainement 8 qui multiplient les possibilités, mais les logiciels et systèmes d'exploitation sont eux-mêmes de plus en plus complexes et gourmands en ressources et le gain en terme de performances est donc très sensiblement moindre que ce que l'on pourrait imaginer.


les mémoires RAM actuelles

Depuis quelques années on assiste à une augmentation gigantesque de la fréquence d'horloge des processeurs, mais alors que leurs performances augmentent de plus de 50% par an celles des mémoires n'ont eu longtemps qu'un rythme d'amélioration de 7% par an. Ce n'est que relativement récemment que le domaine de la RAM a beaucoup bougé passant en trois ans de la mémoire EDO à la DDR de deuxième génération. Le résultat c'est qu'il existe aujourd'hui près d'une centaine de technologies différentes sur le marché. Nous donnons ci-dessous quelques précisions concernant les plus courantes.

Burst EDO DRAM. DRAM EDO fonctionnant en mode « burst », c'est-à-dire par rafale, à toute vitesse, mais sur de courtes périodes (après, elle doit se resynchroniser avec le bus), et pas sur un bus allant à plus de 66 MHz.

DRDRAM Direct Rambus Dynamic RAM. DRAM mise au point par Rambus et Intel, avec pour objectif de tourner à 800 MHz, comme la SLDRAM, avec un bus de 16 bits de large seulement.

SyncLink Dynamic RAM. DRAM cousine de la DRDRAM de Rambus. Leur idée est de faire passer tous les signaux de contrôle de la mémoire sur une seule ligne, en série, de façon à pouvoir se passer de synchronisation entre les canaux, et finalement d'aller beaucoup plus vite, jusqu'à 800 MHz. Contrairement aux RAM de Rambus, la SLDRAM est conçue comme un standard industriel ouvert, développé par le consortium SyncLink.

SDRAM Synchronous Dynamic Random Access Memory. Mémoire environ 5 fois plus rapide que la DRAM. Elle se trouve sur des barrettes à 168 broches en 64 bits, qui s'installent à l'unité (contrairement à d'autres types de mémoire qui vont par paire de barrettes). On la trouve en divers modules jusqu'à 128 Mbits.


DDR-SDRAM (Double Data Rate) : SDRAM de deuxième génération, plus couramment connue sous le nom de DDR. Ce nouveau type de mémoire est un type avancé de SDRam, le standard équipant la majorité des PC actuels. La mémoire DDR permet de transférer dans un cycle d'horloge 2 données au lieu d'une seule. Elle offre donc une capacité de traitement doublée par rapport à la SDRAM classique. Cadencée à 266 MHz, cette dernière multiplie par deux le débit de la SDRAM avec un gain de performance significatif pour les PC équipés de processeurs cadencés à plus de 1 Gigahertz. Le surcoût lié à la nouvelle mémoire DDR aurait peu d'impact sur le prix total des PC, car la DDR ne serait pas beaucoup plus chère que la SDRAM. Le diagramme ci-dessous emprunté à Marc Prieur donne une idée des prix extrêmement fluctuants de ces mémoires, fluctuants mais cependant orientés à la baisse.


La mémoire DDR SDRAM est utilisée aussi par les constructeurs de cartes graphiques qui l'exploitent sur leurs modèles haut de gamme en raison de son débit de communication élevé. En juin 2001, Intel a proposé un nouveau jeu de composants (chipset) le i845A, qui permet enfin d'accoupler un P4 avec des mémoires en technologie DDR ou SDRAM (Synchronous DRAM). Il vient concurrencer le chipset 850 qui ne supporte que de la mémoire Rambus.

PC2100 Nom des barrettes de mémoire SDRAM - DDR conçues pour être branchées sur un bus à 133 MHz.

et pour les cartes graphiques :

On trouve aussi plusieurs types de mémoire vidéo, mais la tendance récente consiste à utiliser la mémoire DDR SDRAM dont les performances sont élevées et comme le montre le graphique ci-dessus les prix bien orientés. Les technologies ci-dessous seront donc réservées aux machines plus bas de gamme vendues en supermarché.

Video RAM. mémoire vive pour la vidéo fonctionnant à double entrée, donc plus rapidement que les autres types de mémoire, puisqu'on peut y écrire et y lire en même temps. Ca a été la mémoire standard des cartes graphiques jusqu'à récemment.

Rambus DRAM. Type de RAM spécialisée dans la vidéo à l'origine. Elle utilise un bus particulier (et propriétaire) pour accéder plus rapidement au frame buffer. Cette mémoire est rapide, mais chère et ne dispose pas de seconde source.

SGRAM Synchronous Graphics Random Access Memory. Type de SDRAM, spécialisée pour les applications graphiques, avec des taux de transferts suffisants pour supporter la 3D.

WRAM Windows RAM. VRAM évoluée, intégrant des fonctions d'optimisation pour le fonctionnement sous interface graphique.

Précisons que l'extrême miniaturisation des composants électroniques (la technologie de 1980 concernait des circuits intégrés dans lesquelles les interconnexions entre transistor s'exprimaient en micron, en 2010 le standard bas de gamme est 65nanomètres et nombre de circuits commencent à employer des liaisons de 45 voire 35 nanomètres) permet aujourd'hui d'avoir dans un emballage de 5cm de long sur moins de 2cm de largeur et 4 mm d'épaisseur jusqu'à 16 gigaoctets de mémoire dans une clé USB à comparer avec les 4096 octets de 1968 qui occupaient un espace de 50x20 cm2 sur une épaisseur de plus de 1cm, ce qui représente une diminution d'un facteur d'environ 100 millions. Mais cette miniaturisation s'approche des limites possibles de la technologie silicium et sauf changement complet de principes (c'est-à dire de matériaux) et donc de technologie on ne gagnera plus grand chose en terme de miniaturisation dans les prochaines années.



Hit-Parade