2016-05-18 11 views
5

Mi sono imbattuto nel seguente paragrafo in an article about malloc.Qual è la differenza tra regione mappata e area non mappata nello spazio di memoria?

Il mucchio è continuo (in termini di indirizzi virtuali) Spazio di memoria con tre limiti: un punto di partenza, un limite massimo (gestiti attraverso sys/di ressource.h funzioni getrlimit (2) e setrlimit (2)) e un punto finale chiamato break. L'interruzione segna la fine dello spazio di memoria mappato , ovvero la parte dello spazio degli indirizzi virtuali con la corrispondenza nella memoria reale.

enter image description here

Vorrei capire meglio il concetto di regione mappata e della regione non mappata.

+0

Puoi allegare un link per questo articolo? – Aviv

+0

http://www.learnme.in/malloc-c/ – Tordek

+0

dopo aver letto attentamente le pagine man di 'linux', quando si usa' setrlimit' per cambiare la dimensione 'segmento di dati' (che è heap, BSS e sezione di dati inizializzata), sembra che solo il 'limite morbido '- che è il punto di interruzione menzionato nella domanda - abbia qualche effetto dichiarato - es ritorna 'ENOMEM'. Tuttavia non riesco a scoprire quale ruolo l'hardlimit - probabilmente il 'rlimit' menzionato nella domanda, suona. – Aviv

risposta

9

Se gli indirizzi di memoria sono lunghi 64 bit, come in molti computer moderni, sono disponibili 18446744073709551616 indirizzi di memoria. (Dipende dall'architettura del processore quanti bit possono effettivamente essere usati, ma gli indirizzi sono memorizzati usando 64 bit.) Si tratta di oltre 17 miliardi di gigabyte, che è probabilmente più memoria del computer in uso. Quindi solo alcuni di quei 17 miliardi di gigabyte corrispondono alla memoria reale. Per il resto degli indirizzi, la memoria semplicemente non esiste. Non c'è corrispondenza tra l'indirizzo di memoria e una posizione di memoria. Questi indirizzi sono pertanto non mappati.

Questa è la spiegazione semplice. In realtà, è un po 'più complicato. Gli indirizzi di memoria del tuo programma non sono gli attuali indirizzi di memoria dei chip di memoria, la memoria fisica , nel tuo computer. Invece, è la memoria virtuale . Ogni processo ha il proprio spazio di memoria, ovvero i propri indirizzi 18446744073709551616 e gli indirizzi di memoria utilizzati da un processo sono convertiti in indirizzi di memoria fisica dall'hardware del computer. Quindi un processo potrebbe aver memorizzato alcuni dati all'indirizzo 4711 della memoria, che è effettivamente memorizzato in un vero chip di memoria fisico qui, e un altro processo potrebbe avere anche memorizzato alcuni dati all'indirizzo di memoria 4711, ma quello è un posto completamente diverso, memorizzato in un chip di memoria fisica reale su . Gli indirizzi di memoria virtuale interni al processo sono tradotti, oppure mappati, alla memoria fisica effettiva, ma non a tutti. Il resto, di nuovo, è non mappato.

Ovvero, anche una spiegazione semplificata. È possibile utilizzare più memoria virtuale rispetto alla quantità di memoria fisica nel computer. Questo viene effettuato da paging, ovvero prendendo alcuni blocchi (chiamati) di memoria non utilizzati in questo momento e conservandoli su disco fino a quando non saranno nuovamente necessari. (Questo è anche chiamato "swapping", anche se questo termine originariamente significava scrivere tutto la memoria di un processo su disco, non solo parti di esso.)

E per complicare ancora di più, i sistemi operativi moderni come Linux e Windows overcommit quando allocano memoria. Ciò significa che allocano più indirizzi di memoria di quelli che possono essere memorizzati sul computer, anche usando il disco. Ad esempio, il mio computer qui con 32 gigabyte di memoria fisica e solo 4 gigabyte disponibili per il paging dei dati su disco, non può consentire più di 36 gigabyte di memoria virtuale effettiva utilizzabile.Ma malloc assegna felicemente più di cento mila gigabyte. Non è fino a quando non provo effettivamente a memorizzare le cose in tutta quella memoria che è collegato alla memoria fisica o al disco. Ma faceva parte del mio spazio di memoria virtuale, quindi lo chiamerei anche io mappato nella memoria, anche se non era mappato allo a.

+1

Ottima risposta. Spiega molti concetti di memoria in alcuni paragrafi e lo fa in modo succinto. –

1

L'area mappata nell'heap indica l'area di memoria virtuale che può essere mappata insieme alla memoria fisica. E la regione non mappata indica lo spazio di memoria virtuale inutilizzato che non punta a nessuna memoria fisica.

Il limite tra la regione mappata per l'heap e la regione non mappata è il punto di interruzione del sistema. Poiché lo malloc() viene utilizzato per richiedere un po 'di memoria, il punto di interruzione del sistema verrebbe spostato per ingrandire la regione mappata. Il sistema Linux offre i metodi brk() e sbrk() per aumentare e diminuire l'indirizzo di memoria virtuale del punto di interruzione di sistema.

+1

Per chiarire, nel caso sia stato frainteso, 'brk()' diminuisce la dimensione dell'heap e 'sbrk()'. –

+0

@ RestlessC0bra, Grazie. – CWLiu

+0

... e 'sbrk()' lo aumenta. –

Problemi correlati