verdy_p a écrit :
Il y a des cas où même l'allocation dans le tas ne réponds pas au problème pour les gros besoins en mémoire, car l'espace de mémoire virtuel autorisé pour un processus est limité: 2 gigas en théorie sur un système 32 bits, en pratique cela dépend de la place disponible sur la partition de swap.
La bonne solution est alors d'utiliser un fichier mappé en mémoire, le fichier étant créé sur une partition où on est certain d'avoir de la place. Windows 95 OSR2 et Windows 98, 98SE, et NT ou 2000 supportent les fichiers mappés en mémoire, de même que la majorité des systèmes Unix (mais avec des noms de fonctions système différents).
Si le système ne dispose pas des fichiers mappés (systèmes 16 bits tels que DOS, ou temps réel, ou Win32s, ou sous-système WOW16 sous NT, ainsi que tout système qui ne gère pas la notion de mémoire virtuelle), il faut soi-même gérer le cache en mémoire et les entrées-sorties, et cela complique le programme qui utilise la mémoire ainsi étendue, car la commutation sur disque n'est plus automatique mais doit être prévue dans le code qui utilise cette mémoire (afin de savoir si le segment de données qu'on va accéder est bien présent, et savoir quel segment moins sollicité on peut basculer efficacement sur disque).
En C++, on peut facilement créer un allocateur qui utilise un tas sur fichier mappé, et l'utilisation des fichiers mappés est TRES conseillée pour les programmes ayant besoin de beaucoup de mémoire de travail, si on ne veut pas solliciter trop lourdement le swap et tout le système d'exploitation.
Sachez que les performances d'un programme qui utilise un fichier mappé sont sensiblement identiques à celles d'un programme qui utilise l'allocation classique en mémoire virtuelle, même pour de toutes petites quantités de mémoire. En effet, le système ne procède aux échanges sur disque que quand cela est nécessaire, et n'accède pas du tout au disque si la mémoire virtuelle utilisée par le processus pour accéder au fichier mappé tient entièrement dans la mémoire physique. La seule différence est que l'échange de mémoire sur disque a lieu dans un fichier distinct utilisé par le processus, et non dans le fichier ou la partition de swap standard du système.
Mieux: le swap standard du système est généralement fragmenté en pages pour servir simultanément toutes les applications, et les pages sont mélangées entre tous les processus, et au sein des espaces réservés à chacun des processus eux-mêmes, et le swap peut ainsi s'avérer lors des accès BEAUCOUP plus lent qu'un fichier mappé dont le programme contrôle lui-même la disposition et la fragmentation interne (en allouant à des positions précises dans le bloc de mémoire virtuelle correspondant au fichier mappé) !!!
Dès lors, on n'a pas de raison de se priver des fichiers mappés et il est possible d'y allouer en une seule fois une grosse matrice du type double[3000][3000] sans fragmenter l'allocation: le programme n'en sera que plus performant, car il n'y a pas de table de pointeurs intermédiaires...
[edit]--Message édité par verdy_p--[/edit]
|