# Out of memory

Out of memory ( OOM ) (angl. mémoire insuffisante) est un état souvent indésirable du fonctionnement de l'ordinateur où aucune mémoire supplémentaire ne peut être allouée pour son utilisation par des programmes ou par le système d'exploitation. Ce dernier ne pourra pas charger de programmes supplémentaires, et comme de nombreux programmes doivent charger des données supplémentaires en mémoire pendant leur exécution, ceux-ci cesseront de fonctionner correctement. Cette situation se produit généralement quand toute la mémoire disponible, y compris l'espace d'échange du disque (swap), a été allouée.

## Histoire

Historiquement, la situation d'insuffisance de mémoire était plus courante qu'elle ne l'est aujourd'hui, car les premiers ordinateurs et systèmes d'exploitation étaient limités à de petites quantités de mémoire vive (RAM) en raison de l'incapacité des premiers processeurs à gérer de grandes quantités de mémoire, ainsi que de considérations de coût. Depuis que l'avènement de la mémoire virtuelle a ouvert la porte à l'utilisation de l'espace de swap, la condition est moins fréquente. Presque tous les programmes modernes s'attendent à pouvoir allouer et désallouer de la mémoire librement en cours d'exécution, et ont tendance à échouer de manière incontrôlée (crash) lorsque cette attente n'est pas satisfaite; les plus anciens n'allouaient souvent de la mémoire qu'une seule fois, vérifiaient s'ils en avaient assez pour faire tout leur travail, puis ne s'attendaient plus à en avoir. Par conséquent, soit ils échouaient immédiatement avec un message d'erreur "out of memory", soit ils s'exécutaient comme prévu.
Les premiers systèmes d'exploitation tels que MS-DOS ne prenaient pas en charge le multitâche . Les programmes se voyaient allouer de la mémoire physique qu'ils pouvaient utiliser selon leurs besoins. La mémoire physique était souvent une ressource rare, et lorsqu'elle était épuisée par des applications telles que celles dotées des fonctionnalités Terminer et Rester résident, aucune autre application ne pouvait être démarrée tant que les applications en cours d'exécution n'étaient pas fermées.
Les systèmes d'exploitation modernes fournissent une mémoire virtuelle, dans laquelle les processus reçoivent une plage de mémoire, mais où la mémoire ne correspond pas directement à de la RAM. La mémoire virtuelle peut être mappée sur de la RAM, sur un fichier via mmap ou un espace d'échange, et le système d'exploitation peut déplacer les pages de mémoire virtuelle selon ses besoins. Comme la mémoire virtuelle n'a pas besoin d'être adossée à de la mémoire physique, son épuisement est rare, et il existe généralement d'autres limites imposées par le système d'exploitation à la consommation des ressources.
Comme le prédit la loi de Moore, la quantité de mémoire physique dans tous les ordinateurs a augmenté de façon presque exponentielle, bien que cela soit compensé dans une certaine mesure par l'augmentation de la taille des programmes et des fichiers eux-mêmes. Dans certains cas, un ordinateur doté d'une mémoire virtuelle où la majorité des données chargées réside sur le disque dur, peut manquer de mémoire physique mais pas de mémoire virtuelle, provoquant ainsi une pagination excessive. Cette condition, connue sous le nom de thrashing, rend généralement l'ordinateur inutilisable jusqu'à ce que certains programmes soient arrêtés ou que la machine soit redémarrée. Pour ces raisons, un message d'insuffisance de mémoire est rarement rencontré par les applications sur des ordinateurs modernes.
Il est cependant toujours possible de rencontrer une condition de OOM avec un ordinateur moderne. Le cas typique d'OOM dans les ordinateurs modernes se produit lorsque le système d'exploitation ne peut plus créer de mémoire virtuelle, parce que tous ses dispositifs de sauvegarde potentiels sont pleins ou lorsque l'utilisateur final les a désactivés.

## Gestion de l'absence de mémoire

Les noyaux des systèmes d'exploitation tels que Linux tenteront de se récupérer de ce type de condition OOM en mettant fin à un ou plusieurs processus, mécanisme connu sous le nom d'OOM Killer.
Linux 4.6 (sorti en mai 2016) a introduit des changements dans les situations d'OOM, améliorant la détection et la fiabilité$^,$. La prise en charge des cgroups dans OOM killer a été implémentée dans le noyau Linux 4.19 sorti en octobre 2018, qui a ajouté la possibilité de tuer un cgroup de manière unitaire.

## Limites de mémoire par processus

Outre les limites de mémoire physique à l'échelle du système, certains systèmes limitent la quantité de mémoire que chaque processus peut utiliser. Habituellement, une telle limitation peut également se produire lorsque le système d'exploitation dispose d'un espace d'adressage plus grand que celui disponible au niveau des processus. Certains systèmes 32 bits haut de gamme (tels que ceux avec l' extension d'adresse physique activée) sont livrés avec 8 gigaoctets ou plus de mémoire système, même si un seul processus ne peut accéder qu'à 4 Go de celui-ci dans un modèle de mémoire plate (en) 32 bits.
Un processus qui dépasse sa limite par processus et tente ensuite d'allouer de la mémoire supplémentaire rencontrera une condition d'erreur. Par exemple, la fonction standard C pour l'allocation de mémoire, malloc, renverra NULL et une application correcte devrait gérer cette situation.