GNU/Linux >> Znalost Linux >  >> Linux

malloc vrací paměť nebo virtuální adresový prostor

malloc alokuje paměť na hromadě, tečka.

Vaše knihovna C obvykle uchovává seznam (nebo nějakou složitější datovou strukturu) dostupných paměťových bloků a najde vhodný blok, který uspokojí malloc (možná rozdělení větší části na několik menších) a vrácení free 'd paměti do seznamu (možná sloučení několika menších kousků do většího)

Pouze když seznam neobsahuje dostatečně velký kus, aby vyhovoval vašim malloc , knihovna požádá OS o více paměti, např. pomocí sbrk syscall. Adresa vrácená tímto syscall může být virtuální adresa nebo skutečná, v závislosti na vašem hardwaru, ale jako programátor to nemůžete (a nemusíte) vědět.

Řekněme, že malloc alokuje virtuální adresní prostor spíše než blok na hromadě je jako říkat, že read čte z vašeho pevného disku spíše než ze souboru:z pohledu volajícího je to irelevantní a ne vždy pravdivé.


Existují alespoň 3 způsoby měření spotřeby paměti:

  • virtuální adresní prostor – množství adresního prostoru vašeho procesu spotřebovaného alokací. to také ovlivňuje fragmentaci a maximální souvislé budoucí alokace, které můžete provést.
  • poplatek za potvrzení – jedná se o zaúčtování maximálního možného fyzického úložiště vyžadovaného k udržení veškeré zapisovatelné paměti nezálohované soubory/zařízením přidělené vašemu procesu operačním systémem. pokud mu operační systém dovolí překročit celkovou fyzickou paměť + swap, při prvním zápisu nadbytku se mohou stát velmi špatné věci.
  • fyzická paměť – množství fyzických zdrojů (potenciálně včetně swapu, v závislosti na vaší interpretaci), které váš proces aktuálně zabírá. To může být nižší než poplatek za potvrzení kvůli původním nulovým stránkám a původním soukromým zapisovatelným mapám souborů nebo vyšší než poplatek za potvrzení kvůli nezapisovatelným nebo sdíleným mapováním, které proces používá (ale ty jsou obvykle vyměnitelné/zahozené).

malloc obecně je ovlivňuje všechny.

Upravit: Nejlepší způsob, jak odpovědět na vaši otázku, je tedy říct:

malloc alokuje virtuální paměť .

A virtuální paměť spotřebovává:

  • virtuální adresní prostor,
  • zavázat poplatek a
  • fyzické zdroje, pokud byly napsány.

malloc je volání do knihovny. Na linuxu zase volá sbrk systémové volání. sbrk zvětší velikost haldy, ale ve skutečnosti nepřiděluje fyzickou paměť. Když se proces pokusí získat přístup k této adrese, zobrazí se page fault je aktivována a poté jádro alokuje skutečnou fyzickou stránku a mapy na virtuální adresu.

TL;DR:malloc vrací virtuální adresu a NEAlokuje fyzickou paměť.

Podívejte se na to.


Linux
  1. Jak získat konkrétní adresu paměti pomocí C

  2. Jak implementovat deterministický malloc

  3. Adresový prostor 32bitového procesu v 64bitovém linuxu

  1. Udržuje realloc zarovnání paměti posix_memalign?

  2. Malloc na linuxu bez přetížení

  3. Potřebujete vysvětlení ohledně velikosti rezidentní sady/virtuální velikosti

  1. Linuxové příkazy:prozkoumávání virtuální paměti pomocí vmstat

  2. jak se určuje velikost stránky ve virtuálním adresovém prostoru?

  3. Maximální paměť využitelná 32bitovým systémem RHEL 6