GNU/Linux >> Linux Esercitazione >  >> Linux

malloc restituisce la memoria o lo spazio degli indirizzi virtuali

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.


Linux
  1. Spazio degli indirizzi del processo a 32 bit su Linux a 64 bit

  2. Come accedere agli indirizzi fisici dallo spazio utente in Linux?

  3. Malloc su Linux senza eseguire l'overcommit

  4. come viene determinata la dimensione della pagina nello spazio degli indirizzi virtuali?

  5. Memoria massima utilizzabile da un sistema RHEL 6 a 32 bit

Comprensione del supporto degli indirizzi virtuali a 52 bit nel kernel Arm64

Come trovare l'indirizzo IP di una macchina virtuale KVM

Come aumentare lo spazio su disco virtuale della VM su VirtualBox

Linux:come viene suddiviso uno spazio di indirizzi virtuali di processo a 64 bit in Linux?

Gestione della memoria Linux:memoria virtuale e paginazione della domanda

Come aumentare lo spazio su disco virtuale VM su VirtualBox e VMware