Je viens d'exécuter un programme que Mallocs 13 Mo dans une machine de 12 Mo (QEMU émulé!). Non seulement cela, j'ai même parcouru la mémoire et j'ai rempli de la malquette ...
void large_mem(void) { #define LONGMEM 13631488 long long *ptr = (long long *)malloc(LONGMEM); long long i; if(!ptr) { printf("%s(): array allocation of size %lld failed.\n",__func__,LONGMEM); ASSERT(0); } for(i = 0 ; i < LONGMEM ; i++ ) { *(ptr+i)=i; } free(ptr); }
4 Réponses :
Ça s'appelle Mémoire virtuelle forte> qui est attribué à votre programme. Ce n'est pas la mémoire réelle em> que vous appelez RAM. P>
Il existe également une limite maximale pour la mémoire virtuelle, mais elle est supérieure à la RAM. Il est mis en œuvre (et défini) par votre système d'exploitation. p>
Donc, il n'y a pas de limite maximale ou quelque chose?
Les nouvelles pages seront-elles échangées pendant que je continue à demander le système d'exploitation?
@raj: La limite théorique est déterminée par la taille d'un pointeur. Pratiquement, la plupart des systèmes d'exploitation vous donneront moins de mémoire que n'importe quel espace d'adresse la taille du pointeur. Et oui, si vous allouez plus de mémoire que physiquement présent dans la machine, vous obtiendrez un échange.
! Woah! C'est comme si je discute avec vous les gars .. une telle réponse rapide .. C Communauté est tellement rapide. :) merci beaucoup tout ..
Son stupide que je dois attendre 10 minutes pour accepter votre réponse en SOP
Cette réponse est plutôt incomplète sans mentionner Overcummit. Sur un système configuré pour gérer commit la charge, malloc code> échouerait ici.
@raj: Il y a une raison pour laquelle vous devez attendre avant accepter une réponse .
@Ln Silico. Pauvre Guy .. Demanda cette question et obtenu -14 votes: p
sons comme votre système d'exploitation est Pages d'échange : P>
La pagination est une partie importante de la mise en œuvre de la mémoire virtuelle dans la plupart des systèmes d'exploitation à usage général contemporain, leur permettant d'utiliser Stockage de disque pour les données qui ne correspondent pas à un accès aléatoire physique mémoire (RAM). P> blockQuote>
En d'autres termes, le système d'exploitation utilise certains de votre espace disque dur pour satisfaire votre demande d'allocation de 13 Mo (à grande dépense de vitesse, car le disque dur est beaucoup, beaucoup plus lent em> que RAM ). p>
Ceci est appelé comme une allocation paresseuse. p>
La plupart des systèmes d'exploitation comme Linux ont un modèle de mémoire d'allocation paresseux dans lequel l'adresse de mémoire renvoyée est une adresse virtuelle et l'allocation réelle ne se produit qu'au temps d'accès. Le système d'exploitation suppose qu'il sera capable de fournir cette allocation à l'heure d'accès. P>
La mémoire allouée par tandis que, puisque calloc fort> initialise la mémoire à 0, vous pouvez être assuré que le système d'exploitation a déjà soutenu l'allocation avec la RAM (ou le swap). p>
Essayez d'utiliser calloc code> et surtout, il vous retournera hors de la mémoire, à moins que votre fichier / partition de swap ne soit assez grand pour satisfaire la demande. P>
Je pense qu'il voulait dire temps d'accès.!
Sauf si le système d'exploitation virtualisé a été échangé, ce que vous rencontrez est appelé OverCommit Strong>, et il existe essentiellement parce que le moyen facile de gérer les ressources dans un système avec une mémoire virtuelle et une demande / copie -La pages de brite n'est pas de les gérer. Overcommit est beaucoup comme une banque prêtant plus d'argent que ce qu'il semble travailler pendant un certain temps, alors les choses se heurtent à s'écraser. La première chose à faire lors de la configuration d'un système Linux est corrigée avec la commande suivante: vm.overcommit_memory=2
BTW, j'ai fourni un exemple concret qui invoque le tueur de mémoire hors de la mémoire à: Stackoverflow.com/questions/7880784/...
! Woah! Je viens de réaliser que le code à l'intérieur de la boucle de la boucle est faux ... toujours toujours .. !. !.! Pourquoi pas de faute SEG?