Je veux allouer mes tampons en fonction de la mémoire disponible. Ainsi, lorsque j'effectue un traitement et que l'utilisation de la mémoire augmente, elle reste toujours dans les limites de la mémoire disponible. Existe-t-il un moyen d'obtenir la mémoire disponible (je ne sais pas si l'état de la mémoire virtuelle ou physique fera une différence ?) La méthode doit être indépendante de la plateforme car elle sera utilisée sous Windows, OS X, Linux et AIX. (Et si possible, je voudrais aussi allouer une partie de la mémoire disponible pour mon application, quelqu'un qui ne change pas pendant l'exécution).
Edit : Je l'ai fait avec une allocation de mémoire configurable. Je comprends que ce n'est pas une bonne idée, car la plupart des systèmes d'exploitation gèrent la mémoire pour nous, mais mon application était un framework ETL (destiné à être utilisé sur un serveur, mais qui était également utilisé sur un ordinateur de bureau comme un plugin pour Adobe Indesign). J'ai donc été confronté au problème suivant : au lieu d'utiliser le swap, Windows renvoyait une mauvaise allocation et d'autres applications commençaient à échouer. Et comme on m'a appris à éviter les pannes et ainsi de suite, j'essayais juste de me dégrader gracieusement.
13 votes
Il n'y a aucun intérêt à faire cela. Sur tous les systèmes d'exploitation modernes, la mémoire utilisée par une application n'affecte pas la mémoire disponible pour les autres applications, car elle est entièrement virtuelle. N'allouez que ce dont vous avez besoin.
9 votes
@LokiAstari : faux bien sûr. un système n'a qu'une quantité limitée qu'il peut allouer. J'ai choisi de ne pas avoir de fichiers de swap, donc mon système a 8GiB, après cela, les appels C++ à
new
lancezbad_alloc
et d'autres applications échouent. Dans Linux et les Windows récents, il existe un tueur d'OOM qui choisit une application à tuer. Un virus pourrait allouer beaucoup de choses dans plusieurs processus et utiliser ce fait pour faire planter d'autres applications. Sans parler du fait que si vous avez un fichier de page, le système va se détruire et se figer jusqu'à devenir inutilisable. (En général, seul le WM meurt, mais sous Windows, il n'y a pas de Ctrl-Alt-F1).1 votes
@v.oddou : Rien de tout cela n'est pertinent dans le contexte de la question. Mon commentaire est donc maintenu.
2 votes
@v.oddou Le tueur d'OOM de Linux tuerait en fait le virus imagenary assez rapidement ; faible temps de fonctionnement, faible utilisation du CPU, forte utilisation de la mémoire, beaucoup de processus enfants. Ce virus inutile peindrait en fait une grande croix rouge sur sa poitrine et sur celle de ses enfants.
2 votes
@Loki Astari Tout le monde n'est pas là pour la même raison, et il est prétry utile d'écrire un garbage collector qui collecte plus souvent quand la mémoire est faible.
1 votes
@MartinYork personne ne vous a dit que faire des hypothèses est une chose stupide à faire ? Un exemple de cas d'utilisation est de vérifier la mémoire système libre ... si le serveur est faible, l'application pourrait arrêter les services non essentiels ou redémarrer le service httpd - dans mon cas d'utilisation particulier.
0 votes
@martin-york (Vieux commentaire, mais vous ne l'avez pas supprimé.) Windows commencera à faire du swapping si un programme utilise trop de mémoire, ralentissant ainsi l'ensemble du système et toutes les autres applications. Il peut donc être nécessaire de limiter l'utilisation de la mémoire.
0 votes
@Elliot Ce n'est pas une nouvelle information. Les OS font ça depuis les années 60.
0 votes
@Elliot La taille du fichier d'échange est limitée dans la plupart des cas, et son existence n'est pas garantie. Obtenir un tas disponible est essentiel pour les jeux sandbox comme les clones de Minecraft.
0 votes
Il est assez important pour les systèmes de bases de données fonctionnant sur un serveur d'utiliser toute la mémoire disponible pour les caches de pages. Parfois, le serveur peut exécuter une autre charge qui utilise une partie de la mémoire, c'est-à-dire un script nocturne qui effectue un travail, ou des mises à jour, etc. Pouvoir surveiller l'utilisation de la mémoire et modifier dynamiquement la taille du cache des pages est une fonctionnalité assez importante d'un moteur de base de données.