malloc
alloca memoria sull'heap, punto.
La tua libreria C in genere mantiene un elenco (o qualche struttura di dati più intricata) di blocchi di memoria disponibili, trovando un blocco adatto per soddisfare un malloc
(possibilmente suddividendo un pezzo più grande in un numero di pezzi più piccoli) e restituendo free
'd memory all'elenco (possibilmente unendo alcuni blocchi più piccoli in uno più grande)
Solo quando l'elenco non contiene un pezzo abbastanza grande da soddisfare il tuo malloc
, la libreria chiederà al sistema operativo più memoria, ad es. utilizzando la chiamata di sistema sbrk. L'indirizzo restituito da questa chiamata di sistema può essere un indirizzo virtuale o reale, a seconda del tuo hardware, ma come programmatore non puoi (e non devi) saperlo.
Dicendo quel malloc
alloca lo spazio dell'indirizzo virtuale piuttosto che un blocco nell'heap è come dire che read
legge dal tuo disco rigido piuttosto che da un file:è irrilevante dal punto di vista del chiamante e non sempre vero.
Ci sono almeno 3 modi per misurare il consumo di memoria:
- spazio degli indirizzi virtuali - la quantità di spazio degli indirizzi del tuo processo consumato dall'allocazione. questo influisce anche sulla frammentazione e sulle allocazioni future contigue massime che puoi effettuare.
- commit charge - questa è la contabilità del sistema operativo della massima memoria fisica possibile richiesta per mantenere tutta la memoria scrivibile, non supportata da file/dispositivo allocata al tuo processo. se il sistema operativo gli consente di superare la memoria fisica totale + swap, potrebbero accadere cose molto brutte la prima volta che viene scritto l'eccesso.
- memoria fisica - la quantità di risorse fisiche (potenzialmente incluso lo scambio, a seconda della tua interpretazione) che il tuo processo sta attualmente occupando. Questo potrebbe essere inferiore all'addebito di impegno a causa di pagine zero vergini e mappe di file scrivibili private vergini, o superiore all'addebito di impegno a causa di mappature non scrivibili o condivise utilizzate dal processo (ma queste sono generalmente scambiabili/eliminabili).
malloc
generalmente li riguarda tutti.
Modifica: Quindi, il modo migliore in cui posso pensare di rispondere alla tua domanda è dire:
malloc
alloca la memoria virtuale .
E la memoria virtuale consuma:
- spazio degli indirizzi virtuali,
- commettere l'addebito e
- risorse fisiche, se sono state scritte.
malloc
è una chiamata in biblioteca. Su Linux, a sua volta chiama sbrk
chiamata di sistema. sbrk
aumenterà la dimensione dell'heap ma in realtà non allocherà la memoria fisica. Quando il processo tenta di accedere a questo indirizzo, un page fault
viene generato e quindi in quel momento il kernel alloca la pagina fisica effettiva e mappa l'indirizzo virtuale.
TL;DR:malloc
restituisce un indirizzo virtuale e NON alloca memoria fisica.
Dai un'occhiata.