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.