Quando viene avviato un processo, ottiene il proprio spazio di indirizzamento virtuale. La dimensione dello spazio di indirizzamento virtuale dipende dal tuo sistema operativo. In generale i processi a 32 bit ottengono 4 indirizzi GiB (4 giga binari) e i processi a 64 bit ottengono 18 indirizzi EiB (18 exa binari).
Non è possibile accedere in alcun modo a qualcosa che non è mappato nello spazio degli indirizzi virtuale poiché per definizione tutto ciò che non è mappato non ha un indirizzo per voi. Puoi provare ad accedere alle aree dello spazio degli indirizzi virtuali che al momento non sono mappate a nulla, nel qual caso ottieni un'eccezione segfault.
Non tutto lo spazio degli indirizzi è mappato a qualcosa in qualsiasi momento. Inoltre, non tutti possono essere mappati (la quantità di esso può essere mappata dipende dal processore e dal sistema operativo). Su processori Intel di generazione corrente possono essere mappati fino a 256 TiB del proprio spazio indirizzo. Si noti che i sistemi operativi possono limitarlo ulteriormente. Ad esempio per processi a 32 bit (con un massimo di 4 indirizzi GiB) Windows di default riserva 2 GiB per il sistema e 2 GiB per l'applicazione (ma c'è un modo per renderlo 1 GiB per il sistema e 3 GiB per l'applicazione).
Quanta parte dello spazio indirizzo viene utilizzata e la quantità di modifiche mappate durante l'esecuzione dell'applicazione. Gli strumenti specifici del sistema operativo consentono di monitorare ciò che la memoria attualmente allocata e lo spazio degli indirizzi virtuali sono per un'applicazione in esecuzione.
La sezione di codice, la sezione dati, BSS ecc. Sono termini che fanno riferimento a diverse aree del file eseguibile creato dal linker. In generale il codice è separato dai dati statici immutabili, che è separato dai dati allocati staticamente ma mutabili. Stack e heap sono separati da tutto quanto sopra. La loro dimensione è calcolata dal compilatore e dal linker. Si noti che ogni file binario ha le proprie sezioni, quindi tutte le librerie collegate dinamicamente verranno mappate nello spazio indirizzo separatamente ciascuna con le proprie sezioni mappate da qualche parte. Heap e stack, tuttavia, non fanno parte dell'immagine binaria, in genere c'è solo uno stack per processo e un heap.
La dimensione della pila (almeno lo stack iniziale) è generalmente fissa. I compilatori e/o i linker in genere hanno alcuni flag che è possibile utilizzare per impostare la dimensione dello stack che si desidera in fase di esecuzione. Gli stack generalmente "crescono indietro" perché è così che funzionano le istruzioni dello stack del processore. La crescita degli stack in una direzione e la crescita degli altri nell'altra rendono più facile organizzare la memoria in situazioni in cui si desidera che entrambi siano illimitati, ma non si sa quanto ciascuno può crescere.
Heap, in generale, fa riferimento a tutto ciò che non è preassegnato all'avvio del processo. Al livello più basso ci sono diverse operazioni logiche che riguardano la gestione dell'heap (non tutte sono implementate come descrivo qui in tutti i sistemi operativi).
Mentre lo spazio indirizzo è fisso, alcuni SO tengono traccia di quali parti sono attualmente recuperate dal processo. Anche se questo non è il caso, il processo stesso deve tenerne traccia. Quindi l'operazione di livello più basso è effettivamente decidere che verrà utilizzata una determinata area dello spazio degli indirizzi.
La seconda operazione di basso livello è di istruire il sistema operativo per mappare quella regione su qualcosa.Questo in generale può essere
alcuna memoria che non è sostituibile a
memoria che è sostituibile e mappato al file system scambio
memoria che è sostituibile e mappato a qualche altro file
memoria che è scambiabile e mappata su un altro file in modalità di sola lettura
la stessa mappatura che un'altra regione indirizzo virtuale è mappato
la stessa mappatura che un'altra regione indirizzo virtuale è mappato, ma in modalità di sola lettura
la stessa mappatura che un'altra regione indirizzo virtuale è mappato , ma in copia in modalità di scrittura con i dati copiati mappati per il file di swap di default
ci possono essere altre combinazioni ho dimenticato, ma questi sono quelli principali.
Ovviamente lo spazio totale utilizzato dipende davvero da come lo si definisce. La RAM attualmente utilizzata è diversa dallo spazio indirizzo attualmente mappato. Ma come ho scritto sopra, gli strumenti dipendenti dal sistema operativo dovrebbero farti scoprire cosa sta succedendo attualmente.
Non è una domanda di programmazione. – unwind