2013-06-29 11 views

risposta

3

In genere, i programmatori a livello di applicazione che chiamano memoria sono in realtà solo uno spazio di indirizzi. Quindi l'heap, lo stack, anche i segmenti del programma sono solo insiemi di indirizzi. I nostri programmi, compresi quelli in nodo, leggono e scrivono dati usando quegli indirizzi. Chiamiamo cose come malloc un "gestore della memoria", ma in realtà dovrebbe essere "address manager". Un sistema separato di "memoria virtuale" determina se questi set di indirizzi sono o meno mappati su RAM, disco o niente. Il set residente è quegli indirizzi che sono supportati dalla RAM. La dimensione del set residente è quanto grande è quel set.

7

A un processo viene assegnata memoria per l'esecuzione da parte del sistema operativo. Sui moderni sistemi a 32 bit e 64 bit, questo spazio di memoria sembra un campo aperto di tutti i possibili indirizzi di memoria che possono essere indirizzati. In realtà, il sistema operativo sta "mentendo" al processo e spesso può supportare questo impegno con solo parte della memoria che può essere potenzialmente indirizzata dal processo. Il resto è "virtuale".

Poiché la CPU può eseguire solo su e da dati e codice in RAM, il sistema operativo lavora con la CPU per tenere traccia di quale memoria il programma sta utilizzando è in RAM e cosa viene salvato su un file speciale sul disco in RAM virtuale (cioè il file di paging/swapfile). Ciò che è in RAM è chiamato set "residente" o "funzionante".

Questo è importante sapere come sviluppatore poiché il tempo necessario per accedere alla memoria che è già nella RAM è di molti ordini di grandezza più veloce rispetto a quando il sistema operativo deve prima caricare la memoria dal disco nella RAM. La progettazione di programmi che mantengono i dati critici residenti ha caratteristiche di prestazioni più elevate rispetto ai programmi che sono incuranti su come la memoria viene allocata e acceduta.

L'heap è il partizionamento della memoria ad ampia apertura che il sistema operativo presenta a un processo, organizzato in data structure bearing the same name. Il processo utilizza questa organizzazione mentre viene eseguita per accedere (e tenere traccia per una versione successiva) solo di piccoli pezzi alla volta. Ad esempio, se il processo vuole memorizzare una matrice di numeri interi, ha bisogno di un blocco di memoria con tanti byte quanti sono gli elementi moltiplicati per la dimensione del numero intero.

Questo partizionamento è al di sopra di ciò che il sistema operativo fa con lo scambio. Accedo all'heap per archiviare allocazioni di byte di memoria per i miei oggetti e strutture dati in fase di esecuzione, ma questa allocazione di heap vive ancora nella memoria che il sistema operativo mi ha dato, che considera in termini di 4096 "pagine" di byte che possono essere spostate avanti e indietro dal disco.

Lo stack è un'altra struttura di dati speciale che il sistema operativo fornisce un processo ma è diverso in quanto ottiene tutto lo stack in una volta e come un processo mette gli elementi in pila in sequenza, incrementa (o diminuisce) un puntatore speciale (di solito un registro CPU speciale) per tenere traccia di dove si trova in questo stack. Ad un livello più alto, ogni thread tiene traccia di uno stack e in cui il puntatore si trova in quella pila. Variabili locali, parametri di funzione e indicatori di ritorno sono memorizzati qui e il puntatore viene incrementato e decrementato su questa memoria mentre il processo viene eseguito per tenere traccia di queste cose.

Problemi correlati