PDA

Visualizza la versione completa : [OT] Quesiti teorici su gestione memoria del linguaggio C


_d4vid3_
17-02-2011, 18:35
Salve,
vi scrivo per porvi alcune domande su questioni sul C che non ho capito dal mio testo di info.
1. E' corretto se dico che per ogni elemento di un array viene allocata sempre una cella(e quindi una parola) di memoria? (anche se, ad es, il tipo degli elementi dell'array richiede meno di una cella)?
2. Ho capito che le celle di memoria hanno un "numero d'ordine"... ma non ho ben chiara la differenza tra indirizzo fisico e indirizzo logico (che, se ho capito bene, viene tradotto nell'indirizzo fisico dal gestore della memoria del sistema operativo); e, collegato a questo discorso, che tipo di indirizzo è contenuto in una variabile puntatore?
Un'ultima curiosita'... so che se non si inizializza a zero una variabile la relativa cella di memoria potrebbe essere gia' piena, e quindi cio' puo' comportare errori....come mai pero' si verifica questo?Quando termina l'esecuzione di un programma non dovrebbe venire rilasciata la memoria precedentemente allocata per esso?

Grazie a tutti.

lolide
17-02-2011, 19:47
Originariamente inviato da _d4vid3_
1. E' corretto se dico che per ogni elemento di un array viene allocata sempre una cella(e quindi una parola) di memoria? (anche se, ad es, il tipo degli elementi dell'array richiede meno di una cella)?

Veramente una parola sono 2 celle.
Comunque se il tipo degli elementi dell'array richiede meno di una cella, allora è vero, in quanto una cella (un byte) di memoria è l'unità minima allocabile.
Se invece il tipo richiede piùù di una cella, vengono allocate le celle richieste dal tipo, quindi in questo caso è scorretto.


Originariamente inviato da _d4vid3_
2. Ho capito che le celle di memoria hanno un "numero d'ordine"... ma non ho ben chiara la differenza tra indirizzo fisico e indirizzo logico (che, se ho capito bene, viene tradotto nell'indirizzo fisico dal gestore della memoria del sistema operativo); e, collegato a questo discorso, che tipo di indirizzo è contenuto in una variabile puntatore?

L'indirizzo logico è un espediente che si usa anche con i moduli compilati ed eseguibili (tipo exe e dll, oppure so ed eseguibili linux, ecc...)
Per accedere ad una locazione in memoria di una variabile ad esempio, occorrerebbe referenziare l'indirizzo fisico della variabile (ovvero l'indirizzo della posizione vera della variabile nella memoria di un calcolatore)
Siccome ogni calcolatore ha una sua quantità di memoria, e soprattutto il modulo compilato non saprebbe in quale locazione precisa di memoria andranno caricati i moduli dal loader del SO ecc... si usa l'indirizzo logico.
In ogni modulo l'indirizzo logico sarebbe un indirizzo interno che comincia da 0 e referenzia le varie variabili.
Il loader del SO, quando clicchi un exe, ad esempio, lo carica all'indirizzo 0xfffff1 ed aggiorna tutti gli indirizzi logici del modulo, in modo da farli puntare nel punto giusto della memoria.

Non è un concetto difficile, il problema è spiegarlo bene :)


Originariamente inviato da _d4vid3_
Un'ultima curiosita'... so che se non si inizializza a zero una variabile la relativa cella di memoria potrebbe essere gia' piena, e quindi cio' puo' comportare errori....come mai pero' si verifica questo?Quando termina l'esecuzione di un programma non dovrebbe venire rilasciata la memoria precedentemente allocata per esso??

Si è rilasciata la memoria, ma non è cancellata.
Cioè se un programma in precedenza alloca la posizione 0xffffff1 in memoria con un valore, quando il programma termin,a il SO disalloca (disalloca non vuol dire resetta lo spazio di memoria dov'era caricato il programma, ma significa "fa sapere" che quell'area di memoria è disponibile) l'area di memoria, ma non ne cancella il contenuto. E quindi se un altro programma alloca una variabile nell'area di memoria dove si trovava una variabile di un'altro programma, questa variabile conterrà il valore che c'è in quella cella di memoria, per questo va inizializzato sempre tutto a 0 :)

_d4vid3_
19-02-2011, 20:52
Ciao!
Grazie per la risposta.
Quindi l'indirizzo logico serve per indirizzare una locazione di memoria, ovvero un gruppo di un certo numero di celle elementari di memoria..e' corretto?
Inoltre ...l'indirizzo contenuto in una variabile puntatore è l'indirizzo logico della variabile puntata?

MItaly
19-02-2011, 21:04
Originariamente inviato da lolide
L'indirizzo logico è un espediente che si usa anche con i moduli compilati ed eseguibili (tipo exe e dll, oppure so ed eseguibili linux, ecc...)
Credo che lui non stia parlando degli eseguibili rilocabili, ma della memoria virtuale.

lolide
19-02-2011, 21:42
Originariamente inviato da MItaly
Credo che lui non stia parlando degli eseguibili rilocabili, ma della memoria virtuale.

Ah ecco, per questo avevo scritto "anche"... non ho completato la spiegazione.

Esistono anche per mappare più memoria rispetto a quella fisica.
I tuoi puntatori referenzieranno sempre un indirizzo, ma tu sai che esiste la memoria virtuale.
Per questo apputno, la memoria viene sempre referenziata tramite un indirizzo logico, perchè magari il contenuto di quella cella di memoria si trova sull'unita di swapping, e quindi l'MMU la converte in indirizzo fisico e riprende il valore dalla RAM oppure dall'hdd.

deleted_29
19-02-2011, 21:44
Originariamente inviato da _d4vid3_
Salve,
vi scrivo per porvi alcune domande su questioni sul C che non ho capito dal mio testo di info.
1. E' corretto se dico che per ogni elemento di un array viene allocata sempre una cella(e quindi una parola) di memoria? (anche se, ad es, il tipo degli elementi dell'array richiede meno di una cella)?
"cella" è poco chiaro, così come "parola".
L'unità di indirizzamento (non su tutti i processori, ma su quelli diciamo così "usati") minimo
è il byte (8 bit).
Ricorda che "allocazione" non significa un granchè, unicamente "tieni l'indirizzo di un oggetto" il quale, come accennato, può essere al minimo di 8 bit.
Alcuni (=molti) processori (e compilatori), per ragioni di efficienza, possono allocare la memoria in multipli interi di 8 bit.
Come 16, 32 o addirittura 64 bit (=2,4,8 byte).
Questo per sfruttare il parallelismo di accesso alla memoria (trasferendo più byte in parallelo nello stesso intervallo di tempo).
Sempre per ragioni di efficienza, spesso, i blocchi di memoria vengono "allineati" a multipli di byte.
Sostanzialmente, per capirci, invece di avere indirizzi "pari" e "dispari" sono tutti pari, o addirittura multipli di 4



2. Ho capito che le celle di memoria hanno un "numero d'ordine"... ma non ho ben chiara la differenza tra indirizzo fisico e indirizzo logico (che, se ho capito bene, viene tradotto nell'indirizzo fisico dal gestore della memoria del sistema operativo); e, collegato a questo discorso, che tipo di indirizzo è contenuto in una variabile puntatore?Il meccanismo che consente di passare da un indirizzo logico (quello che il programma "vede") e quello fisico (la RAM) è assai complesso (e variegato).
Alla stragrossa dato un puntatore che vale 1000, il programma "pensa" che si riferisca al millesimo byte della RAM, mentre in realtà può corrispondere a qualsiasi indirizzo fisico (e pure non fisico, ossia virtuale), poniamo 10234546
Ciò non avviene, ovviamente, in modalità reale (per i processori 86), ma parliamo sostanzialmente dei jurassico (o quasi)


Un'ultima curiosita'... so che se non si inizializza a zero una variabile la relativa cella di memoria potrebbe essere gia' piena, e quindi cio' puo' comportare errori....come mai pero' si verifica questo?Quando termina l'esecuzione di un programma non dovrebbe venire rilasciata la memoria precedentemente allocata per esso?

Grazie a tutti. la spiegazione è varia
Innanzitutto un byte di memoria che il programma vede è virtuale, ossia non corrisponde ad un indirizzo fisico, anzi può addirittura essere rilocato dinamicamente (MMU).

Poi "allocare" non significa un granchè, anzi meglio provo a riassumere.

Supponi di avere 10 monete da 1 euro, ognuna numerata da 1 a 10.

Supponi di "prestarle" (allocarle), dandone un numero qualsiasi tra 1 e 10 a chi te le chiede.
3 a tizio, 2 a caio, 4 a sempronio (1 libera).

E' chiaro che queste monete-byte non vengono "create", vengono semplicemente "prestate".
Quando vengono "rilasciate" (ossia tornano al banco) il valore che hanno è... quello che avevano

Loading