Ecologie Informatique

le livre de Philippe Guglielmetti

1:l’Environnement

Cosmologie informatique

L’Univers informatique est en expansion très rapide. A la fin des années 1950, le Big Bang a commencé dans quelques armoires IBM sous la forme de mémoires à tores, de cartes perforées et de processeurs effectuant quelques centaines d’instructions par seconde. 50 ans plus tard, un ordinateur de bureau standard dispose de centaines de megaoctets de mémoire RAM rapide, d’un disque dur qui pourrai sans mal contenir toutes les cartes perforées du monde de 1960, et d’un processeur effectuant plus d’un milliard d’opérations par seconde.

Gordon Moore, un ingénieur d’Intel, a postulé en 1965 que le nombre de transistors sur un circuit intégré double tous les ans. On a ensuite étendu sa loi à la puissance des processeurs, qui double tous les 18 mois. La loi de Moore a été remarquablement vérifiée pendant 30 ans, pendant lesquels la puissance a été multipliée par 2 à la puissance 20 (30 ans / 18 mois) donc 2×2x2×2x2×2x2×2x2×2x2×2x2×2x2×2x2×2x2×2 = environ 1 million!

Loi de Moore, selon le site d'intel

Loi de Moore, tirée de [1]

Mais le plus incroyable est que tous les autres éléments constitutifs d’un ordinateur ont également évolué dans la même proportion, que l’on considère la vitesse ou la taille des mémoires, ou le débit des communications avec d’autres ordinateurs dans les réseaux.

Le nombre des ordinateurs a également augmenté au-delà de toute prévision. En 1960, le directeur d’IBM estimait le marché des ordinateurs à une centaine par an aux alentours de l’an 2000… Aujourd’hui, des millions d’ordinateurs accèdent à des téraoctets d’information dans le monde entier grâce au réseau Internet avec des temps d’accès plus courts que ceux des mémoires à tores de 1950.

La tortue primitive

La cosmologie des Babyloniens reposait sur la carapace d’une tortue, l’univers informatique aussi! Tous les ordinateurs modernes sont basés sur la théorie de la “machine de Turing”. Conceptuellement, il imagina une « tortue » capable de se déplacer en avant ou en arrière sur un ruban comportant des cases comportant chacune un « bit » 0 ou 1. Le comportement de la tortue est « programmé » avec une « machine à états » qui peut être définie par une table telle que celle-ci:

Etat courant Bit lu Bit écrit Déplacement Nouvel état
1 1 0 +1 2
1 0 1 +1 2
2 1 1 +1 1
2 0 0 +1 1

Si on lance la tortue ans l’état 1 sur le premier chiffre à gauche de la séquence 10111001, elle va fonctionner ainsi:

  1. étant dans l’état 1 et lisant un 1 sur la case, la tortue le remplace par un 0, se déplace d’une case vers la droite et passe dans l’état 2
  2. elle lit le 0, écrit un 0 (donc ne change pas le bit), se déplace à droite et repasse dans l’état 1
  3. le troisième 1 est remplacé par un 0, décalage à droite, passage dans l’état 2
  4. on lit un 1, on ne le change pas (on remarque que l’état 2 ne modifie pas le bit lu alors que l’état 1 l’inverse), et on repasse en état 1
  5. en continuant sur ce principe, la tortue va inverser les bits impairs de la séquence, et on va donc obtenir 00010011 lorsque la tortue va sortir du ruban par la droite.

Turing a démontré tout un ensemble de choses passionnantes à propos de sa tortue, notamment:

  1. qu’elle pouvait effectuer toutes les opérations logiques et arithmétiques imaginables
  2. qu’on pouvait combiner des opérations simples pour faire des programmes plus compliqués
  3. que la table définissant le « programme » de la tortue peut elle-même être codée sur le ruban. Il est alors possible de faire une tortue dotée d’un programme fixe qui aille lire la portion du ruban correspondant à son état puis d’exécuter les instructions correspondantes
  4. qu’il était impossible de prévoir le nombre d’étapes nécessaires à l’exécution d’un programme quelconque sans l’effectuer effectivement.

Architecture des processeurs

En 1946, Von Neumann, un étudiant de Turing, proposa une “architecture” de machine à calculer universelle basée sur le concept de la tortue de Turing, mais plus facile à réaliser pratiquement, et surtout à programmer. Ceci sera étudié en détail au chapitre 3.

Peu de gens réalisent aujourd’hui que les ordinateurs existants sont tous basés sur cette architecture, donc sur la théorie de la tortue de Turing, et que par conséquent, ils ne sont pas capables de faire quoi que ce soit que la tortue ne puisse aussi faire!

Un microprocesseur moderne lit 32 bits à la fois sur un ruban de « mémoire de travail » comportant jusqu’à 32 milliards de bits (4 giga-octets). Il effectue en un milliardième de seconde des “instructions” simples qui demanderaient chacune des centaines de mouvements de la tortue, il gère même une hiérarchie de mémoires de taille et de temps d’accès différents, on peut même mettre plusieurs tortues/processeurs sur le même ruban/mémoire au prix d’un dispositif anti-collision, mais toute cette haute technologie n’est qu’un artifice pour faire des tortues extraordinairement rapides, mais sans aucune innovation fondamentale depuis plus de 60 ans.

La hiérarchie mémoire

L’évolution principale dans l’architecture des ordinateurs s’est faite sur le constat que le ruban mémoire de la tortue de Von Neumann est utilisé très inégalement. N’importe quel octet d’une mémoire RAM moderne peut être lu ou écrit en quelques millionièmes de secondes, ce qui signifie qu’il faut plusieurs secondes pour balayer toute la mémoire disponible. En fait les programmes “utiles” utilisent intensivement de petites portions de mémoire, et plus rarement des portions plus grandes.

Les touts premiers processeurs déjà ont été dotés de registres de mémoire stockant quelques octets de données servant aux opérations rapides, d’une mémoire principale de travail et d’une plus grosse mémoire de stockage destinée à conserver les informations entre les utilisations de l’ordinateur, ou de les transporter de l’un à l’autre.

Un PC moderne est doté de 5 à 6 niveaux hiérarchiques de mémoire : il y a toujours des registres, mais le processeur contient également un ou deux niveaux de mémoire ultrarapide dite « cache » qui contient des copies de zones de la mémoire de travail utilisées intensivement à un moment donné.

D’ailleurs, comme la mémoire disque coûte bien moins cher qu’une quantité équivalente de RAM, les systèmes d’exploitation modernes offrent un mécanisme de « mémoire virtuelle » qui constitue de fait une couche de hiérarchie mémoire supplémentaire. L’idée est d’utiliser une partie du disque dur pour simuler une mémoire de travail plus grande à l’aide d’un fichier d’échange (« swap file »).

Par extension, bien que n’étant pas directement accessible par le processeur, la mémoire de stockage du (des) disque(s) dur(s) peut être vue comme une extension de la mémoire de travail. Cette optique non conventionnelle permet de ramener les bases de données sur le même plan que les structures de données, comme nous le ferons au .

Le transit des informations entre RAM et disque est accéléré par une mémoire cache qui stocke les informations en transit sans avoir à attendre que la mécanique du disque dur, affreusement lente en proportion, ait effectivement réalisé l’opération.

On peut de même voir un réseau comme Internet comme une couche mémoire supplémentaire, d’une taille colossale. Ici aussi, la lenteur des réseaux peut être considérablement masquée par l’utilisation de serveurs « proxy » qui gardent en mémoire les pages web fréquemment demandées.

Les ressources et leur utilisation

Tout programme informatique consomme au moins deux types de ressources

  1. du temps processeur, pouvant être compté en nombre d’instructions nécessaires à l’exécution du programme
  2. de la mémoire, pouvant être comptée en octets nécessaires en mémoire de travail et sur disque dur.

Les programmes utilisant le réseau consomment également une troisième ressource précieuse : la bande passante, mesurée en bits/seconde.

Dans un ordinateur moderne où cohabitent de nombreux programmes, la consommation des ressources est règlementée par le système d’exploitation, qui s’occupe:

  1. de partager la puissance du processeur entre les programmes en exécutant chacun d’eux pendant une fraction du temps. Le “changement de contexte” d’un programme a un autre est une opération très rapide aujourd’hui, si bien que des centaines de tâches se succèdent chaque seconde dans un PC actuel.
  2. d’allouer la mémoire aux programmes qui en ont besoin, et de la récupérer ensuite. Ceci se fait également très rapidement, mais reste une opération dont il ne faut pas abuser sous peine de voir les performances de l’ordinateur entier chuter. La gestion de la mémoire, que ce soit en RAM ou sur disque, est abordée en détail dans le Chapitre 7 : Structures de données.
  3. de réguler le trafic réseau. En fait de régulation, la gestion du trafic se résume principalement à des files d’attente.

La programmation écologique

Programmer d’une façon “écologique”, c’est utiliser le minimum de ces ressources de manière à:

  1. ne pas prétériter les autres programmes fonctionnant sur le même ordinateur
  2. ne pas limiter la mémoire disponible pour les autres utilisateurs, ou leur part de la bande passante du réseau
  3. permettre le fonctionnement correct du programme sur une machine qui n’est pas forcément de la dernière génération
  4. offrir à l’utilisateur une réelle amélioration de performances lorsqu’il exécutera la programme sur un nouveau PC dernier cri.

Pour ce faire, il faut essentiellement:

  1. produire un logiciel fiable. Les « crashs » peuvent déstabiliser d’autres programmes et génère souvent une perte de mémoire (memory leak) due au fait que de la mémoire allouée n’est pas désallouée. Les « plantages » utilisent énormément de puissance du processeur pour tourner en rond, souvent sans que l’utilisateur ne le remarque ou ne sache quoi faire.
  2. Utiliser la mémoire parcimonieusement, en évitant de dupliquer l’information ou en la structurant l’information de manière adéquate. J’ai encore vu hier un programme chargeant en mémoire un fichier texte de plusieurs mégaoctets pour chercher un mot dedans…
  3. Mettre en œuvre des algorithmes efficaces, résister à la tentation d’utiliser des fonctions de librairie existantes mais dont le fonctionnement n’est pas très clair.
  4. Cultiver l’art du compromis. Comme le paragraphe sur la hiérarchie mémoire l’a suggéré, on peut économiser du temps processeur et de la bande passante en utilisant de la mémoire comme « cache ». A l’inverse, l’emploi d’algorithmes de compression permet de réduire taille mémoire et bande passante, alors qu’une bande passante élevée permettra de répartir la charge processeur ou mémoire sur un réseau.

Références:

  1. http://www.intel.com/research/silicon/mooreslaw.htm