GNU/Linux >> Tutoriels Linux >  >> Linux

malloc renvoie de la mémoire ou de l'espace d'adressage virtuel

malloc alloue de la mémoire sur le tas, point.

Votre bibliothèque C conserve généralement une liste (ou une structure de données plus complexe) des blocs de mémoire disponibles, en trouvant un bloc approprié pour satisfaire un malloc (éventuellement en divisant un gros morceau en un certain nombre de plus petits) et en retournant free 'd mémoire à la liste (éventuellement en fusionnant quelques petits morceaux en un plus gros)

Seulement lorsque la liste ne contient pas un morceau assez grand pour satisfaire votre malloc , la bibliothèque demandera au système d'exploitation plus de mémoire, par ex. en utilisant l'appel système sbrk. L'adresse renvoyée par cet appel système peut être une adresse virtuelle ou réelle, selon votre matériel, mais en tant que programmeur, vous ne pouvez pas (et n'avez pas besoin de) le savoir.

Dire que malloc alloue un espace d'adressage virtuel plutôt qu'un bloc sur le tas revient à dire que read lit à partir de votre disque dur plutôt qu'à partir d'un fichier :cela n'a aucune importance du point de vue de l'appelant et n'est pas toujours vrai.


Il existe au moins 3 façons de mesurer la consommation de mémoire :

  • espace d'adressage virtuel - la quantité d'espace d'adressage de votre processus consommée par l'allocation. cela affecte également la fragmentation et les allocations futures contiguës maximales que vous pouvez effectuer.
  • frais de validation - il s'agit de la comptabilisation par le système d'exploitation du stockage physique maximal possible requis pour conserver toute la mémoire inscriptible, non sauvegardée sur des fichiers/dispositifs, allouée à votre processus. si le système d'exploitation lui permet de dépasser la mémoire physique totale + swap, de très mauvaises choses peuvent se produire la première fois que l'excédent est écrit.
  • mémoire physique - la quantité de ressources physiques (y compris potentiellement l'échange, selon votre interprétation) que votre processus occupe actuellement. Cela peut être inférieur aux frais de validation en raison de pages zéro vierges et de cartes vierges inscriptibles privées de fichiers, ou supérieur aux frais de validation en raison de mappages non inscriptibles ou partagés que le processus utilise (mais ceux-ci sont généralement échangeables/jetables).

malloc les affecte généralement tous.

Modifier : Donc, la meilleure façon que je puisse penser pour répondre à votre question est de dire :

malloc alloue la mémoire virtuelle .

Et la mémoire virtuelle consomme :

  • espace d'adressage virtuel,
  • engager des frais, et
  • ressources physiques, si elles ont été écrites.

malloc est un appel à la bibliothèque. Sous Linux, il appelle à son tour sbrk appel système. sbrk augmentera la taille du tas mais n'allouera pas réellement de mémoire physique. Lorsque le processus tente d'accéder à cette adresse, un page fault est déclenché, puis à ce moment-là, le noyau alloue la page physique réelle et la mappe à l'adresse virtuelle.

TL ; RD :malloc renvoie une adresse virtuelle et n'alloue PAS de mémoire physique.

Vérifiez ceci.


Linux
  1. Commandes Linux :explorer la mémoire virtuelle avec vmstat

  2. La machine virtuelle avec le système d'exploitation CentOS 5 32 bits n'adresse pas plus de 3 Go de mémoire physique

  3. Comment obtenir une adresse mémoire spécifique en utilisant C

  4. Comment implémenter malloc déterministe

  5. realloc conserve-t-il l'alignement mémoire de posix_memalign ?

Comprendre la prise en charge des adresses virtuelles 52 bits dans le noyau Arm64

Comment trouver l'adresse IP d'une machine virtuelle KVM

Comment augmenter l'espace disque virtuel de la machine virtuelle sur VirtualBox

Linux - Comment un espace d'adressage virtuel de processus 64 bits est-il divisé sous Linux ?

Gestion de la mémoire Linux - Mémoire virtuelle et pagination à la demande

Comment augmenter l'espace disque virtuel de la machine virtuelle sur VirtualBox et VMware