mémoire maximale que malloc peut allouer
j'essayais de comprendre combien de mémoire je peux malloc à l'étendue maximale sur ma machine (1 Go de RAM 160 Go de plate-forme Windows HD).
j'ai lu que la mémoire maximale que malloc peut allouer est limitée à la mémoire physique (sur tas).
aussi quand un programme dépasse la consommation de mémoire à un certain niveau, l'ordinateur cesse de fonctionner parce que d'autres applications n'obtiennent pas assez de mémoire dont elles ont besoin.
donc pour confirmer, J'ai écrit un petit programme en C:
int main(){
int *p;
while(1){
p=(int *)malloc(4);
if(!p)break;
}
}
j'espérais qu'il y aurait un moment où l'allocation de la mémoire échoue et la boucle serait briser, mais mon ordinateur accroché car c'est une boucle infinie.
j'ai attendu environ une heure et finalement j'ai dû forcer l'arrêt de mon ordinateur.
quelques questions:
- malloc alloue-t-il aussi de la mémoire HD?
- quelle était la raison pour laquelle au-dessus de comportement?
- pourquoi boucle ne s'est-elle pas rompue?
- pourquoi n'y a-t-il pas eu d'échec?
7 réponses
j'ai lu que la mémoire maximale
malloc
peut affecter est limitée à la mémoire physique (sur tas).
Faux: la plupart des ordinateurs/OSs support virtuel de la mémoire, soutenu par l'espace disque.
quelques questions: est-ce que
malloc
alloue aussi la mémoire de HDD?
malloc
demande L'OS, qui à son tour peut très bien utiliser un certain espace disque.
quelle était la raison de ce comportement? Pourquoi la boucle ne s'est-elle jamais rompue?
pourquoi n'y a-t-il pas eu d'échec?
vous avez juste demandé trop peu à la fois: la boucle aurait fini par se briser (bien après que votre machine a ralenti à un crawl en raison du grand excès de mémoire virtuelle vs physique et l'accès disque super-fréquent qui en résulte, un problème connu sous le nom de "thrashing") mais il tu as épuisé ta patience bien avant. Essayez d'obtenir par exemple un megabyte à la fois à la place.
Lorsqu'un programme dépasse la consommation de mémoire à un certain niveau, l'ordinateur cesse de fonctionner parce que les autres applications n'obtiennent pas assez de mémoire dont elles ont besoin.
un arrêt total est peu probable, mais lorsqu'une opération qui prendrait normalement quelques microsecondes finit par prendre (par exemple) des dizaines de millisecondes, ces quatre ordres de grandeur peuvent certainement en faire feel comme si l'ordinateur s'était pratiquement arrêté, et ce qui prendrait normalement une minute pourrait prendre une semaine.
je sais que ce fil est vieux, mais pour quiconque est prêt à l'essayer, utilisez ce code snipped
#include <stdlib.h>
int main() {
int *p;
while(1) {
int inc=1024*1024*sizeof(char);
p=(int*) calloc(1,inc);
if(!p) break;
}
}
exécuter
$ gcc memtest.c
$ ./a.out
lors de l'exécution, ce code remplit les RAM jusqu'à ce qu'elles soient tuées par le noyau. Utiliser calloc au lieu de malloc pour prévenir "l'évaluation paresseuse". Idées tirées de ce fil: Malloc Les Problèmes De Mémoire
ce code a rapidement rempli ma mémoire vive (4 Go) puis environ 2 minutes ma partition d'échange de 20 Go avant sa mort. 64bit Linux bien sûr.
malloc
fait sa propre gestion de mémoire, la gestion de petits blocs de mémoire elle-même, mais finalement il utilise le Win32 fonctions tas pour allouer la mémoire. Vous pouvez penser à malloc
comme une "mémoire revendeur".
le sous-système de mémoire windows comprend la mémoire physique (RAM) et la mémoire virtuelle (HD). Lorsque la mémoire physique devient rare, certaines pages peuvent être copiés de la mémoire physique de la mémoire virtuelle sur le disque dur. Windows ne cela de manière transparente.
par défaut, la mémoire virtuelle est activée et consomme l'espace disponible sur la HD. Ainsi, votre test continuera de fonctionner jusqu'à ce qu'il ait alloué la pleine quantité de mémoire virtuelle pour le processus (2Go sur les fenêtres de 32 bits) ou rempli le disque dur.
Essayez cette
#include <stdlib.h>
#include <stdio.h>
main() {
int Mb = 0;
while (malloc(1<<20)) ++Mb;
printf("Allocated %d Mb total\n", Mb);
}
Inclure stdlib et stdio.
Cet extrait est tiré de de profondeur c secrets .
Je ne sais pas vraiment pourquoi cela a échoué, mais une chose à noter est que `malloc(4)" peut ne pas vous donner en fait 4 octets, donc cette technique n'est pas vraiment une façon précise de trouver votre taille maximale de tas.
j'ai trouvé cela dans ma question ici .
par exemple, lorsque vous déclarez 4 octets de mémoire, l'Espace directement avant votre mémoire pourrait contenir l'entier 4, comme indication au noyau de combien de mémoire vous l'avez demandé.
selon la norme C90 garantit que vous pouvez obtenir au moins un objet 32 kBytes de taille, et cela peut être statique, dynamique, ou la mémoire automatique. C99 garantit au moins 64 kBytes. Pour toute limite supérieure, référez-vous à la documentation de votre compilateur.
aussi, l'argument de malloc est un size_t et la gamme de ce type est [0,SIZE_MAX], de sorte que le maximum que vous pouvez demande est SIZE_MAX, dont la valeur varie lors de la mise en œuvre et est défini dans <limits.h>
.
lorsque vous attribuez pour la première fois n'importe quelle taille à *p, chaque fois que vous quittez cette mémoire pour être non référencé. Ça veut dire
une fois que votre programme est l'allocation de mémoire de 4 octets seulement
. alors comment pouvez-vous chose que vous avez utilisé la RAM entière, c'est pourquoi dispositif de SWAP( espace temporaire sur HDD) est hors de discussion. Je connais un algorithme de gestion de mémoire dans lequel quand aucun programme n'est en se référant au bloc mémoire, ce bloc est admissible à allouer pour les programmes demande mémoire. C'est pourquoi vous restez occupé à RAM Driver et c'est pourquoi il ne peut pas donner la chance de servir d'autres programmes. Aussi cette une balançant de référence de problème.
Ans: vous pouvez tout au plus allouer la mémoire de votre taille de mémoire vive. Parce qu'aucun programme n'a accès à un swap.
j'espère que toutes vos questions ont des réponses satisfaisantes.