2010-03-13 10 views
44

Capisco che la memoria deve essere prenotata prima di essere impegnata. E quando è riservato, nessun altro processo può usarlo. Tuttavia, la memoria riservata non conta contro la RAM disponibile. Ma non dovrebbe? Perché se nessun altro può usarlo, allora a cosa serve "disponibile"?Qual è la differenza tra la memoria riservata e quella impegnata?

Oppure c'è qualche differenza più grande?

+0

Puoi fornire un riferimento per dove hai trovato quella definizione di "riservato"? –

+0

http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx – glutz78

+3

Controlla la presentazione di Mark Russinovich su PDC 10. Si chiamava 'PDC10: Misteri di gestione memoria di Windows Revealed: Part Uno.' Parla ampiamente di questo. http://player.microsoftpdc.com – NigelTufnel

risposta

44

Nel contesto di Win32, "riservato" significa che lo spazio indirizzo è allocato all'interno del processo che lo ha richiesto. Questo può essere usato, ad esempio, per riservare spazio per un buffer di grandi dimensioni che non è tutto necessario immediatamente, ma quando è necessario dovrebbe essere contiguo.

La prenotazione di memoria non interagisce con altri processi, poiché ogni processo ha il proprio spazio di indirizzamento privato. Quindi l'affermazione che "quando è riservata, nessun altro processo può usarla" è priva di significato, poiché i processi normalmente non possono allocare memoria nello spazio degli indirizzi di un altro processo.

Quando si richiede il commit delle pagine riservate (backing-store assegnato per esse), tale operazione può potenzialmente fallire a causa della mancanza di memoria fisica (o file di paging).

+1

"backing store assegnato per loro": intendi quando i dati che sono memorizzati solo nella cache vengono chiamati riservati e quando vengono scritti in RAM o in un file di paging viene chiamato commit? – idbrii

+7

@pydave: No, "cache" e "riservato" sono concetti non correlati. La prenotazione di memoria è una specie di proprietà di uno sviluppatore immobiliare che rivendica terreni che in seguito contengano case. Non c'è ancora niente, ma nessun altro può costruire case lì. L'impegno è in realtà la costruzione delle case e la creazione di infrastrutture come elettricità e fogna. D'altra parte, la cache è un'ottimizzazione per far funzionare le CPU più velocemente, tutti i dati sono ancora memorizzati da qualche parte nella RAM. –

+1

Quindi scrivere i dati su una pagina di memoria causa il commit di quella pagina? (Quindi la differenza tra riservata e impegnata è quella riservata è stata allocata, ma è stato eseguito il commit.) – idbrii

4

Process Virtual Memory (Spazio indirizzo) e RAM effettiva sono entrambi diversi. è possibile avere una RAM fisica da 512 MB, ma il processo può comunque occupare spazio di indirizzi virtuali da 4 GB (spazio utente da 2 GB) Ogni indirizzo in un processo può essere considerato libero, riservato o impegnato in qualsiasi momento.

Un processo inizia con tutti gli indirizzi liberi, nel senso che sono liberi di essere impegnati di memoria o riservata per future use.Before qualsiasi indirizzo libero può essere usato, si deve innanzitutto essere classificato come riservato O commesso. Ma non ha bisogno di essere riservato in modo che possa essere commesso.

riservare memoria significa riservare spazio indirizzo virtaul per scopi futuri. non è associato alla RAM fisica (mappata agli indirizzi RAM). Quando memorizzata come memoria significa che sarà associata alla RAM effettiva in modo da poter memorizzare i dati al suo interno.

http://msdn.microsoft.com/en-us/library/ms810627.aspx

+2

Un cavillo: la memoria virtuale non ha bisogno di essere riservata _in un passaggio separato_ prima che sia impegnata. VirtualAlloc può prenotare e impegnarsi in una sola chiamata. Ma la "riserva" deve essere fatta. Inoltre, il commit in realtà non "alloca" la RAM; solo un errore di pagina successivo lo fa. I (provato a?) Modifica "sarà associato" a "può essere associato" di conseguenza. Aggiungerei anche la seguente frase alla fine: "La RAM effettiva non viene allocata fino a quando non si accede alla regione impegnata, e viene eseguita su base pagina per pagina." E un'altra cosa: un altro modo di usare le pagine libere è per la memoria mappata. –

7

mi piace per visualizzare Reserved come prenotazione del indirizzo spazio in modo che nessun altro può allocare (ma non posso utilizzare la memoria a quell'indirizzo, perché non è ancora disponibile). E Committed come mapping che indirizza lo spazio alla memoria fisica in modo che possa essere utilizzato.

Perché dovrei voler riserva? Perché non ti impegni a memoria? Ci sono diversi motivi che ho in mente:

  1. Alcuni applicazione necessita di un intervallo di indirizzo specifico, ad esempio da 0x400000 a 0x600000, ma non ha bisogno della memoria per memorizzare nulla. È usato per intercettare l'accesso alla memoria. Ad esempio, se qualche codice accede a tale area, verrà catturato. (Utile per qualche motivo.)

  2. Alcuni thread devono memorizzare dati progressivamente in espansione. E i dati devono essere in un unico blocco contiguo di memoria. Si preferisce non commettere grandi quantità di memoria fisica in una volta sola perché non è necessaria e sarebbe un tale spreco. La memoria può essere utilizzata prima da alcuni altri thread.La memoria fisica è impegnata solo su richiesta.

Problemi correlati