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.