2012-07-24 18 views
6

Sono molto confuso con queste domande.Memoria virtuale?

  1. Su un processore a 32 bit, ogni processo ha 4 GB di memoria virtuale. Tuttavia, se il processo evey ha uno spazio di 4 GB rispetto a quello che sarà ogni enorme quantità se 100 processi sono in esecuzione, questo è maggiore dell'area di swap. Qualcuno può spiegare questo per favore; Sono molto confuso.

  2. In che modo il sistema operativo assegna la memoria a un processo? Supponiamo che un processo abbia a = malloc(2). Chi assegnerà questa memoria al processo? Il sistema operativo fornirà questi 2 byte di memoria al processo.
    (Accediamo a [2] genera l'errore di segmentazione).

  3. Dove rimangono le diverse parti del processo (Codice, Dati, Catasta, Mucchio) nella memoria principale o nella memoria secondaria.

prego di darmi qualche buon collegamento in modo che possa anche comprendere la memoria virtuale e tutto il suo meccanismo, come i link che ho trovato non spiegare completamente la memoria virtuale.

+0

Dal momento che nessuno ha notato questo prima, va sottolineato che se si assegna un array a 2 byte, un [2] non farà parte di tale array, solo un [0] e un [1] saranno. –

+0

Malloc darà la segmentazione ogni volta.? come malloc allocherà lo spazio dall'heap e quindi la dimensione dell'heap è normalmente molto grande, quindi perché non siamo in grado di accedere a [2]? dovrebbe dare qualche valore casuale. segmentazione significa che non siamo in grado di accedervi. correggimi se sbaglio – RATHI

+0

Dipende davvero dalla tua macchina e dal compilatore. Ma la linea di fondo è che se non hai assegnato la memoria per il tuo programma da usare, non dovresti accedervi o cambiarla. –

risposta

3
  1. A chi importa se la memoria virtuale è maggiore o minore dell'area di scambio? Che differenza fa? (Se, per esempio, mappate un file da 2 GB di sola lettura, che utilizza 2 GB di memoria virtuale, ma non è necessario spazio di swap e sono necessarie solo piccole quantità di memoria fisica.)

  2. Il sistema operativo estende semplicemente il processo 'memoria virtuale spazio. Sta solo cambiando una voce contabile. La memoria fisica non è necessaria fino a quando non si tenta di modificare il contenuto dello spazio indirizzo. (In realtà, il processo probabilmente lo farà da solo, chiedendo al sistema operativo di estendere lo spazio di memoria virtuale quando ha bisogno di pezzi più grandi.)

  3. Rimangono nella memoria fisica (supponendo che inizino dall'inizio) finché il il sistema sceglie di spostarli altrove o scartarli. Se vengono spostati altrove o scartati, vengono cercati o ricreati quando vi si accede tramite gli errori di pagina. (Il sistema operativo gestisce la memoria fisica come una risorsa preziosa, concedendo come meglio crede.)

Tra l'altro, sulla maggior parte dei sistemi operativi a 32 bit, il sistema operativo stesso prende 1 GB o 2 GB di quello spazio di memoria virtuale, lasciando solo 2 GB o 3 GB effettivamente utilizzabili dal processo. Nei sistemi operativi a 64 bit, il sistema operativo non occupa nessuno di questi spazi, quindi i 4 GB completi sono disponibili per i processi a 32 bit.

+0

così come per il commento n. 2, malloc() non riserva la memoria nella RAM, ma aggiunge solo la voce. quando accediamo a quella memoria allocata è riservata solo la RAM ??? – Jeyaram

+0

@rjayavrp: quando si accede alla memoria, la RAM viene allocata. Non è riservato in quanto il sistema operativo lo riprenderà se ne ha un uso più importante. –

+0

malloc è implementato in libc e chiama syscall sbrk(). Se sbrk richiede un'altra pagina per intrattenere la richiesta, solo il sistema operativo è coinvolto, altrimenti il ​​malloc è completato in modalità utente ... AM Sono proprio qui? – theadnangondal

0

Primo: 32 bit significa 32 bit. non ci sono più bit per indirizzare più spazio di memoria. I sistemi multiprocessore non sono una nuova invenzione. Con 32 bit puoi occupare solo lo spazio di 4gigs. Esistono soluzioni alternative come PAE http://en.wikipedia.org/wiki/Physical_Address_Extension.

Secondo e terzo .. Non sono proprio sicuro di come funzioni oggi. Ma date un'occhiata a http://en.wikipedia.org/wiki/Virtual_memory

+0

PAE è una soluzione alternativa per accedere a più di 4 GB di memoria * fisica *. Questa domanda riguarda i limiti di memoria * virtuale *. –

+0

Oh ... Hai ragione. – Mirko

0

Una grave incomprensione da parte vostra è differenza tra memoria virtuale e memoria. Da un POV di processo non c'è differenza, il processo accede solo alla memoria ed è il sistema operativo che si occupa di scambiare porzioni di dati tra la memoria fisica (RAM) e virtuale.

1) Che lo spazio di indirizzo di un processo può raggiungere fino a 4 GB non significa che ogni processo abbia 4 GB allocati. Il sistema operativo assegna loro la memoria secondo necessità.

2) Il sistema operativo fornisce memoria (* 1) nei blocchi. Quando si esegue un malloc, la funzione malloc che gestisce internamente la memoria del programma ottiene lo spazio necessario all'interno della memoria del processo e restituisce il puntatore (forse nel processo richiede memoria aggiuntiva dal sistema operativo, ma non è necessario).

3) Come all'inizio, questo è un problema del sistema operativo. Ogni SO può decidere quali parti fanno virtualizzare e quali parti no, ci sono complesse strategie coinvolte per ridurre il numero di swap.

* 1 Si noti che parlo di memoria, non di VM. L'applicazione non sa quali parti della sua memoria sono virtuali o fisiche, è trasparente per loro.

2

1) Ogni processo ha 4 GB di spazio di memoria virtuale, ma non è necessario assegnarlo tutto in una volta. Il sistema operativo specifica a MMU quali parti della memoria fisica sono mappate al suo spazio virtuale e quali parti non sono mappate affatto. Gli accessi alle parti che non sono mappate causeranno il guasto del processore e il sistema operativo di solito genera un segfault. C'è anche un marcatore per "non presente" che dice al processore che l'area della memoria non è nello spazio di memoria fisico ma si trova nello spazio di scambio, quindi i difetti del processore e il sistema operativo scambiano la pagina nella memoria fisica, quindi riprende il processo da dove è stato interrotto. Per descrivere una tabella delle pagine dei processi, sono necessari solo pochi byte di memoria, quindi 100 processi non utilizzerebbero così tanta memoria finché non li avessero effettivamente richiesti.

2) Esistono molti algoritmi di allocazione della memoria. Solitamente il sistema operativo assegna solo grandi blocchi di memoria alla volta, e quindi le chiamate a malloc() solo a volte risultano in una chiamata al sistema operativo, la maggior parte delle volte però sono i dettagli di implementazione della libreria standard C che gestiscono il microgestione. Non vi è alcuna garanzia che un accesso fuori limite di un array produca un errore di segmentazione, in quanto potrebbe far parte di un array diverso che è stato mallocato in precedenza o parte dello spazio libero di cui la libreria standard tiene traccia per il futuro allocazioni e quindi non segfault. Ci sono strumenti di debug come valgrind che rileveranno tali errori, comunque.

3) I dettagli su dove si trova ciascun segmento dipendono dal sistema operativo, ma per un codice generale e portatile non è necessario conoscere.

Per ulteriori informazioni su tutti questi argomenti, consultare il wiki osdev, in particolare la parte su paging e memory allocation.

Problemi correlati