CompLit - Journal of European Literature, Arts and Society - n. 7 - Table of ...
Architecture des ordinateurs 3
1. architecture des ordinateurs 3
Langage de programmation
• Le langage machine est le langage compris par le microprocesseur. Ce
langage est difficile à maîtriser puisque chaque instruction est codée par une
séquence propre de bits. Afin de faciliter la tâche du programmeur, on a créé
différents langages plus ou moins évolués.
• Le langage assembleur est le langage le plus « proche » du langage machine.
Il est composé par des instructions en général assez rudimentaires que l’on
appelle des mnémoniques. Ce sont essentiellement des opérations de transfert de
données entre les registres et l'extérieur du microprocesseur (mémoire ou
périphérique), ou des opérations arithmétiques ou logiques. Chaque instruction
représente un code machine différent. Chaque microprocesseur peut posséder un
assembleur différent.
• La difficulté de mise en œuvre de ce type de langage, et leur forte dépendance
avec la machine a nécessité la conception de langages de haut niveau, plus
adaptés à l'homme, et aux applications qu'il cherchait à développer. Faisant
abstraction de toute architecture de machine, ces langages permettent
l'expression d'algorithmes sous une forme plus facile à apprendre, et à dominer
(C, Pascal, Java, etc.…). Chaque instruction en langage de haut niveau
correspondra à une succession d’instructions en langage assembleur. Une fois
développé, le programme en langage de haut niveau n’est donc pas
compréhensible par le microprocesseur. Il faut le compiler pour le traduire en
assembleur puis l’assembler pour le convertir en code machine compréhensible
par le microprocesseur. Ces opérations sont réalisées à partir de logiciels
spécialisés appelés compilateur et assembleur.
Performances d’un microprocesseur
• On peut caractériser la puissance d’un microprocesseur par le nombre
d’instructions qu’il est capable de traiter par seconde. Pour cela, on définit :
o Le CPI (Cycle Par Instruction) qui représente le nombre moyen de cycles
d’horloge nécessaire pour l’exécution d’une instruction pour un microprocesseur
donné.
o Le MIPS (Millions d'Instructions Par Seconde) qui représente la puissance
de traitement du microprocesseur :
• Pour augmenter les performances d’un microprocesseur, on peut donc soit
augmenter la fréquence d'horloge (limitation matérielle), soit diminuer le CPI
(choix d'un jeu d'instruction adapté).
2. Notion d’architecture CISC et RISC
• Actuellement l’architecture des microprocesseurs se compose de deux
grandes familles :
o L’architecture CISC (Complex Instruction Set Computer)
o L’architecture RISC (Reduced Instruction Set Computer)
L’architecture CISC
pourquoi
• CISC est l’architecture la plus ancienne, était la seule envisageable pour les
machines à microprocesseur.
• En effet, vu que la mémoire travaillait très lentement par rapport au
processeur, on pensait qu’il était plus intéressant de soumettre au
microprocesseur des instructions complexes.
• Ainsi, plutôt que de coder une opération complexe par plusieurs instructions
plus petites (qui demanderaient autant d’accès mémoire très lent).
• Il semblait préférable d’ajouter au jeu d’instructions du microprocesseur une
instruction complexe qui se chargerait de réaliser cette opération.
• On a donc eu tendance à incorporer au niveau processeur des instructions
plus proches de la structure de ces langages.
comment
• C’est donc une architecture avec un grand nombre d’instructions où le
microprocesseur doit exécuter des tâches complexes par instruction unique.
• Pour une tâche donnée, une machine CISC exécute ainsi un petit nombre
d’instructions mais chacune nécessite un plus grand nombre de cycles d’horloge.
• Le code machine de ces instructions varie d’une instruction à l’autre et
nécessite donc un décodeur complexe (micro-code).
L’architecture RISC
pourquoi
• Des études statistiques menées au cours des années 70 ont clairement montré
que les programmes générés par les compilateurs se contentaient le plus souvent
d'affectations, d'additions et de multiplications par des constantes.
• Ainsi, 80% des traitements des langages de haut niveau faisaient appel à
seulement 20% des instructions du microprocesseur.
• D’où l’idée de réduire le jeu d’instructions à celles le plus couramment
utilisées et d’en améliorer la vitesse de traitement.
comment
• C’est donc une architecture dans laquelle les instructions sont en nombre
réduit (chargement, branchement, appel sous-programme).
• Les architectures RISC peuvent donc être réalisées à partir de séquenceur
câblé. Leur réalisation libère de la surface permettant d’augmenter le nombre de
registres ou d’unités de traitement par exemple.
• Chacune de ces instructions s’exécutent ainsi en un cycle d’horloge.
• Les accès à la mémoire s’effectuent seulement à partir de deux instructions
(Load et Store). Par contre, les instructions complexes doivent être réalisées à
partir de séquences basées sur les instructions élémentaires, ce qui nécessite un
compilateur très évolué dans le cas de programmation en langage de haut
3. niveau.
comparaison
Le choix dépendra des applications visées. En effet, si on diminue le nombre
d'instructions, on crée des instructions complexes (CISC) qui nécessitent plus de
cycles pour être décodées et si on diminue le nombre de cycles par instruction, on
crée des instructions simples (RISC) mais on augmente alors le nombre
d'instructions nécessaires pour réaliser le même traitement.
Amélioration de l’architecture de base
• L'ensemble des améliorations des microprocesseurs visent à diminuer le
temps d'exécution du programme :
1. La première idée qui vient à l’esprit est d’augmenter tout simplement la
fréquence de l’horloge du microprocesseur. Mais l’accélération des fréquences
provoque un surcroît de consommation ce qui entraîne une élévation de
température. On est alors amené à équiper les processeurs de systèmes de
refroidissement ou à diminuer la tension d’alimentation.
2. Une autre possibilité d’augmenter la puissance de traitement d’un
microprocesseur est de diminuer le nombre moyen de cycles d’horloge nécessaire
à l’exécution d’une instruction :
o Dans le cas d’une programmation en langage de haut niveau, cette
amélioration peut se faire en optimisant le compilateur. Il faut qu’il soit capable
de sélectionner les séquences d’instructions minimisant le nombre moyen de
cycles par instructions.
o Une autre solution est d’utiliser une architecture de microprocesseur qui
réduise le nombre de cycles par instruction.
Architecture Pipeline
principe
• L’exécution d’une instruction est décomposée en une succession d’étapes et
4. chaque étape correspond à l’utilisation d’une des fonctions du microprocesseur.
Lorsqu’une instruction se trouve dans l’une des étapes, les composants associés
aux autres étapes ne sont pas utilisés. Le fonctionnement d’un microprocesseur
simple n’est donc pas efficace.
• L’architecture pipeline permet d’améliorer l’efficacité du microprocesseur.
En effet, lorsque la première étape de l’exécution d’une instruction est achevée,
l’instruction entre dans la seconde étape de son exécution et la première phase de
l’exécution de l’instruction suivante débute.
• Il peut donc y avoir une instruction en cours d’exécution dans chacune des
étapes et chacun des composants du microprocesseur peut être utilisé à chaque
cycle d’horloge.
• Une machine pipeline se caractérise par le nombre d’étapes utilisées pour
l’exécution d’une instruction, on appelle aussi ce nombre d’étapes le nombre
d’étages du pipeline
Gain de performance
• Dans cette structure, la machine débute l’exécution d’une instruction à
chaque cycle et le pipeline est pleinement occupé à partir du quatrième cycle.
• Le gain obtenu dépend donc du nombre d’étages du pipeline.
• En effet, pour exécuter n instructions, en supposant que chaque instruction
s’exécute en k cycles d’horloge, il faut :
o n.k cycles d’horloge pour une exécution séquentielle.
o k cycles d’horloge pour exécuter la première instruction puis n-1 cycles pour
les n-1 instructions suivantes si on utilise un pipeline de k étages.
Donc lorsque le nombre n d’instructions à exécuter est grand par rapport à k,
on peut admettre qu’on divise le temps d’exécution par k.
Exemples :
• Les Pentium 2, 3 et 4 d’Intel comprennent respectivement un pipeline de 10,
12 et 20 étages.
Notion de cache mémoire
Principe
• Depuis le début des années 80, une des solutions utilisées pour masquer cette
latence est de disposer une mémoire très rapide entre le microprocesseur et la
mémoire. Elle est appelée cache mémoire.
• On compense ainsi la faible vitesse relative de la mémoire en permettant au
microprocesseur d’acquérir les données à sa vitesse propre.
• Au départ cette mémoire était intégrée en dehors du microprocesseur mais
elle fait maintenant partie intégrante du microprocesseur.
• Le principe de cache est très simple : le microprocesseur n’a pas conscience
de sa présence et lui envoie toutes ses requêtes comme s’il agissait de la mémoire
principale:
o Soit la donnée ou l’instruction requise est présente dans le cache et elle est
alors envoyée directement au microprocesseur. On parle de succès de cache.
o Soit la donnée ou l’instruction n’est pas dans le cache, et le contrôleur de
cache envoie alors une requête à la mémoire principale. Une fois l’information
récupérée, il la renvoie au microprocesseur tout en la stockant dans le cache. On
5. parle de défaut de cache.
Architecture superscalaire
• Une autre façon de gagner en performance est d’exécuter plusieurs
instructions en même temps.
• L'approche superscalaire consiste à doter le microprocesseur de plusieurs
unités de traitement travaillant en parallèle.
• Les instructions sont alors réparties entre les différentes unités d'exécution.
Remarque :
C'est le type d'architecture mise en œuvre dans les premiers Pentium d'Intel
apparus en 1993.
Architecture pipeline et superscalaire
• Le principe est d’exécuté les instructions de façon pipeliné dans chacune des
unités de traitement travaillant en parallèle.
Etude du processeur 8088
• Le processeur 8086 d'Intel est à la base des processeurs Pentium actuels. Les
processeurs successifs (de PC) se sont en effet construits petit à petit en
ajoutant à chaque processeurs des instructions et des fonctionnalités
supplémentaires, mais en conservant à chaque fois les spécificités du
processeur précédent.
Architecture externe du 8088
6. • Nombre de broches : 40.
• Bus de données de AD0 à AD7 : 8 broches.
• Bus d’adresses de AD0 à AD7 et de A8 à A19 : 20 broches.
(AD0 à AD7 représente à la fois le bus de données et une partie du bus
d’adresses).
• Capacité de la mémoire centrale adressable est : 220bit = 1 MégaOctet.
• L’adresse d’un mot mémoire est sur 5 bits : de 00000 H à FFFFF H.
Bus de Commande:
: Broche de lecture mémoire ou interface.
7. Si le microprocesseur effectue une lecture de données à partir de la mémoire ou
d’une interface d’E/S.
WR : Broche d’écriture.
Si le microprocesseur effectue une écriture dans la mémoire ou dans l’interface
d’E/S.
: Broche de selection.
Si c’est la mémoire qui est sélectionnée pour une lecture ou une écriture.
Si c’est l’interface qui est sélectionnée pour une lecture ou une écriture.
• ALE : validité du bus d’adresse AD0 à AD7.
o Si ALE = 1, AD0 à AD7 représente l’octet faible d’une adresse : AD0 à AD7 et
AD8 à AD19 (20 broches).
o Si ALE = 0, AD0 à AD7 représente le bus de données.
• READY : Broche de synchronisation.
o Si READY = 1, la mémoire ou l’interface d’E/S est prête à recevoir des
informations où à fournir des informations au microprocesseur.
o Si READY = 0, mémoire où interface d’E/S non prête pour le dialogue.
8. • INTR : Interruption masquable (considérée ou non par le microprocesseur).
o Si INTR = 1, une interruption est demandée.
Remarque : au niveau du registre d’état, il y a un bit appelé IF. Il est utilisé pour
accepter l’interruption demandée.
• Si IF = 1, l’interruption sera prise en compte par le microprocesseur →
saut au sous programme de dialogue : microproc – Interface d’E/S.
• Si IF = 0, l’interruption ne sera pas prise en compte par le
microprocesseur → pas de saut au sous programme de dialogue :
microproc – Interface d’E/S.
Si INTR est acceptée → INTR = 1 et IF = 1.
• : Broche de réponse
o Si , pour informer l’interface d’E/S que l’interruption
demandée a été acceptée.
• NMI : Broche d’interruption non masquable.
o Si NMI = 1, saut obligatoire à un sous programme de dialogue avec
l’interface d’E/S qui a générée l’interruption NMI.
• HOLD : Broche de demande des bus de données, d’adresses et de
commande.
o Si HOLD = 0, les bus de données, d’adresses et de commande effectuent la
9. liaison entre le microprocesseur et la mémoire.
→ Echange d’information entre le microprocesseur et la mémoire.
o Si HOLD = 1, le contrôleur du disque dur demande les bus de données,
d’adresses et de commande (liaison entre le contrôleur et la mémoire).
→ Echange d’information entre le contrôleur et la mémoire.
Utilisation : dans le cas d’un transfert d’une grande quantité d’informations
entre une interface d’E/S et la mémoire. Ceci pour augmenter la vitesse de
transfert d’informations.
• HOLDA : Broche de réponse à HOLD.
o Si HOLDA = 1, le microprocesseur informe l’interface qu’il est déconnecté
de ses bus.
→ Elle pourra faire l’échange d’informations avec la mémoire
Architecture interne du 8088
Il existe deux unités internes distinctes: l'UE (Unité d'Exécution) et l'UIB
(Unité d'Interfaçage avec le Bus).
UIB
• Elle est constituée d’un ensemble de registres d’adressage, d’un
générateur d’adresse (compteur ordinal) et d’une file d’attente (registre
d’instruction), son rôle est de chercher séquentiellement les instructions
et les données stockées dans la mémoire.
UE
• Elle est destinée au traitement de données, elle se compose essentiellement
d’une UAL, d’une unité de commande et des registres opérationnels et
d’adressage. Son rôle est de lire les instructions stockées dans la file d’attente
pour décodage et d’exécution.
Les registres du 8088
• Un registre est une petite partie de mémoire intégrée au microprocesseur,
dans le but de recevoir des informations spécifiques, notamment des adresses
et des données stockées durant l'exécution d'un programme.
• Les registres peuvent être utilisés dans toutes les opérations arithmétiques et
logiques que le programmeur insère dans le code assembleur.
• Un registre complet présente une grandeur de 16 bits.
• chaque registre est en réalité divisé en deux registres distincts de 8 bits.
• De cette façon, nous pouvons utiliser une partie du registre si nous désirons y
stocker une valeur n'excédant pas 8 bits.
• Si, au contraire, la valeur que nous désirons y ranger excède 8 bits,
nous utiliserons le registre complet, c'est à dire 16 bits.
• Le programmeur dispose de 8 registres internes de 16 bits qu'on peut diviser
en deux groupes :
o Groupe de données : formé par 4 registres de 16 bits (AX, BX, CX, et DX)
chaque registre peut être divisé en deux registres de 8 bits (AH, AL, BH,
BL, CH, CL, DH et DL).
o Groupe de pointeur et indexe : formé de 4 registres de 16 bits (SI, DI, SP, BP)
et font généralement référence à un emplacement en mémoire.
10. Groupe de données
Registre AX : (Accumulateur)
• Toutes les opérations de transferts de données avec les entrées-sorties ainsi
que le traitement des chaînes de caractères se font dans ce registre, de même les
opérations arithmétiques et logiques.
Registre BX : (Registre de Base)
• Il contient une adresse de décalage par rapport à une adresse de référence.
Par exemple, l'adresse de début d'un tableau.
Registre CX : (Le Compteur)
• Lors de l'exécution d'une boucle on a souvent recours à un compteur de
boucles pour compter le nombre d'itérations, le registre CX a été fait pour servir
comme compteur lors des instructions de boucle.
Registre DX :
• On utilise le registre DX pour les opérations de multiplication et de division
mais surtout pour contenir le numéro d'un port d'entrée/sortie pour
adresser les interfaces d'E/S.
Groupe de pointeurs et indexes
• Ces registres sont plus spécialement adaptés au traitement des éléments
dans la mémoire. Ils sont en général munis de propriétés d'incrémentation
et de décrémentation.
Registre SP : pointeur sommet de la pile (Stack Pointer)
• Une pile est un ensemble de cases mémoire définie dans une RAM pour
stocker temporairement les données d’un programme et les contenues des
registres interne du microprocesseur. Elle est utilisée dans le cas d’une rupture
de séquence d’un programme, saut à un sous programme ou appel à une
procédure.
• Si on n’effectue pas l’empilement des registres interne (AX, BX, CX et DX)
utilisés par un programme, leurs contenues peuvent être détruits par les
instructions du sous programme ou de la procédure appelée.
• Le registre SP (Pointeur de Pile) à une longueur de 16 bits, il permet
l’adressage des cases mémoire de la pile. Il pointe toujours sur la première case
mémoire libre de la pile.
• La pile a une structure LIFO (Last In First Out), dernier entré premier
sortie, ainsi :
o Lors d’un empilement du contenu d’un registre interne, le contenu du
registre SP est décrémenté par 2 (SP=SP-2).
o Lors du dépilement, le contenu du registre SP est incrémenté par 2
(SP=SP+2).
Registre SP : pointeur sommet de la pile (Stack Pointer)
• Une pile est un ensemble de cases mémoire définie dans une RAM pour
stocker temporairement les données d’un programme et les contenues des
registres interne du microprocesseur. Elle est utilisée dans le cas d’une
rupture de séquence d’un programme, saut à un sous programme ou
appel à une procédure.
• Si on n’effectue pas l’empilement des registres interne (AX, BX, CX et
11. DX) utilisés par un programme, leurs contenues peuvent être détruits par
les instructions du sous programme ou de la procédure appelée.
• Le registre SP (Pointeur de Pile) à une longueur de 16 bits, il permet
l’adressage des cases mémoire de la pile. Il pointe toujours sur la
première case mémoire libre de la pile.
• La pile a une structure LIFO (Last In First Out), dernier entré premier
sortie, ainsi :
o Lors d’un empilement du contenu d’un registre interne, le contenu
du registre SP est décrémenté par 2 (SP=SP-2).
o Lors du dépilement, le contenu du registre SP est incrémenté par 2
(SP=SP+2)