Crea il tuo forum GRATIS su GlobalFreeForum.com.

Domanda sull'allocazione dinamica.

In questa sezione avverranno le discussioni sulla scienza e sulle arti. Si possono chiedere pareri e spiegazioni o postare i propri pensieri a riguardo di un argomento. Qui potete postare spiegazioni su un qualsiasi argomento: matematica, chimica, lingue etc...

Moderatori: Gruppo Admin, Gruppo Mod

Domanda sull'allocazione dinamica.

Messaggioda Andreiz » 11/12/2012 - 19:09

Buonasera.
Stavo pensando alla malloc e alla gestione della memoria in C e mi è venuta una domanda probabilmente abbastanza stupida.
Facciamo caso che scrivessi un programma che allochi una grande quantità di memoria senza mai deallocarla, magari allocando più aree della memoria possibili e il tutto in qualche loop. Stavo immaginando che col passare del tempo pian piano il mio programma consumerebbe tutta la memoria del computer fino a mandarlo in crash.
Giusto? E' reale questo scenario o in pratica ci vorrebbe troppo tempo per consumare tutte le risorse dei moderni calcolatori?
Andreiz
Utente
Utente
 
Messaggi: 27
Iscritto il: 29/10/2012 - 09:42

Re: Domanda sull'allocazione dinamica.

Messaggioda Lu@Hck88 » 11/12/2012 - 19:42

No, non ci vorrebbe molto tempo e soprattutto è reale. Mi è capitato più volte di allocare tutta la memoria dinamica disponibile e dimenticarmi di deallocarla. Sono arrivato anche alla chiusura forzata da parte del sistema operativo... e ti sto parlando di una macchina con 4GB di memoria RAM. :D

L'unica precisazione da fare è che va solitamente in crash il solo programma utente. Anzi, per meglio dire, viene terminato forzatamente dal sistema operativo.
Tutto è relativo. Prendi un ultracentenario che rompe uno specchio: sarà ben lieto di sapere che ha ancora sette anni di disgrazie! (Albert Einstein)
Avatar utente
Lu@Hck88
Utente
Utente
 
Messaggi: 240
Iscritto il: 04/05/2008 - 15:44
Località: Napoli

Re: Domanda sull'allocazione dinamica.

Messaggioda Flame_Alchemist » 11/12/2012 - 19:52

Si', e' giusto (con un paio di precisazioni).
a. Devi anche accedere alla memoria appena creata.
b. In realta' entra in gioco anche il sistema operativo, che dovrebbe tentare di proibire certe cose e ricorrere a swap massicci. Poi e' anche vero che prima di esaurire la memoria la malloc fallisce (questo e' vero solo se accedete veramente alla memoria, se allocate e basta non dovreste aver problemi anche allocando 20 Gb -- perlomeno su linux), inibendo quindi l'uso di tutte le risorse e mandando il programma in un segfault o errore simile.

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
   int i, j, *p;
   for (i = 0; i < (2 << 20); i++) {
      p = malloc(sizeof(int) * (2 << 20));
      for (j = 0; j < 2 << 20; j++)
         p[j] = j; //accesso alla memoria
      printf("Allocato %d-esimo blocco da 8 MB\n", i);
   }
   return 0;
}


Nota: non provatelo su macchine vere. Comunque dovreste vedere che tutto va moderatamente bene fino al primo centinaio (o giu' di li') di allocazioni, poi il sistema inizia a diventare lentissimo (colpa dello swap).
To iterate is human, to recurse, divine. — L. P. Deutsch
I could be bound in a nutshell and count myself as a king of infinite space (Hamlet)
Non era proprio un genio – pensava che la figura che lui tracciava sul suo fianco nudo dopo il sesso fosse il numerale 8, per dare un'idea. — D. F. Wallace

N = 1 ==> P = NP [compscient]
Avatar utente
Flame_Alchemist
Gold Member
Gold Member
 
Messaggi: 861
Iscritto il: 14/08/2007 - 18:21

Re: Domanda sull'allocazione dinamica.

Messaggioda Andreiz » 11/12/2012 - 20:03

Perfetto quindi in caso provassi del codice arbitrariamente sbagliato il mio SO bloccherebbe tutto o comunque la malloc fallirebbe. Quindi in pratica mi sembra di aver capito che non c'è possibilità di creare dei danni alla macchina. Giusto?
Andreiz
Utente
Utente
 
Messaggi: 27
Iscritto il: 29/10/2012 - 09:42

Re: Domanda sull'allocazione dinamica.

Messaggioda joker__ » 12/12/2012 - 19:08

Esattamente. Come ti ha spiegato Flame la malloc non si lamenta se allochi anche 20GB: il problema sta quando vuoi andare a lavorare su quei 20GB. Questo perché il sistema operativo (anche Windows, a quanto mi risulta) non alloca fisicamente la memoria alla chiamata malloc: la memoria viene allocata a partire da quando viene usata. Quando cioè tu chiami la memoria che hai allocato, il sistema operativo la alloca in memoria reale. Dopodiché si comincia a parlare di memoria virtuale, ovvero gli spazi di memoria in utilizzo (allocati e poi associati a valori) dall'utente vengono allocati fisicamente sulla memoria virtuale, e man mano che essi sono richiesti vengono indirizzati (mediante una o più tabelle) agli indirizzi di memoria reale. Ciò vuol dire che oltre alla memoria ram, l'utente ha a sua disposizione della memoria virtuale, di dimensioni maggiori.
Btw, per non uscire dal topic, no, non riusciresti a danneggiare il funzionamento del sistema in questo modo. Al più potresti rallentarlo, perché la memoria è comunque una risorsa condivisa. Per rallentarlo dovresti allocare memoria sufficiente, ma effettivamente esistente, e continuare ad usarla (lettura-scrittura). Ma onestamente non ho mai sentito parlare di attacchi di questo tipo.
Avatar utente
joker__
Utente
Utente
 
Messaggi: 27
Iscritto il: 21/10/2012 - 23:12

Re: Domanda sull'allocazione dinamica.

Messaggioda Andreiz » 12/12/2012 - 20:52

joker__ ha scritto:Esattamente. Come ti ha spiegato Flame la malloc non si lamenta se allochi anche 20GB: il problema sta quando vuoi andare a lavorare su quei 20GB. Questo perché il sistema operativo (anche Windows, a quanto mi risulta) non alloca fisicamente la memoria alla chiamata malloc: la memoria viene allocata a partire da quando viene usata. Quando cioè tu chiami la memoria che hai allocato, il sistema operativo la alloca in memoria reale. Dopodiché si comincia a parlare di memoria virtuale, ovvero gli spazi di memoria in utilizzo (allocati e poi associati a valori) dall'utente vengono allocati fisicamente sulla memoria virtuale, e man mano che essi sono richiesti vengono indirizzati (mediante una o più tabelle) agli indirizzi di memoria reale. Ciò vuol dire che oltre alla memoria ram, l'utente ha a sua disposizione della memoria virtuale, di dimensioni maggiori.
Btw, per non uscire dal topic, no, non riusciresti a danneggiare il funzionamento del sistema in questo modo. Al più potresti rallentarlo, perché la memoria è comunque una risorsa condivisa. Per rallentarlo dovresti allocare memoria sufficiente, ma effettivamente esistente, e continuare ad usarla (lettura-scrittura). Ma onestamente non ho mai sentito parlare di attacchi di questo tipo.

Perfetto, grazie ho capito, per quanto mi riguarda si può chiudere il topic.
Andreiz
Utente
Utente
 
Messaggi: 27
Iscritto il: 29/10/2012 - 09:42

Re: Domanda sull'allocazione dinamica.

Messaggioda crap0101 » 18/12/2012 - 21:39

Andreiz ha scritto:Perfetto quindi in caso provassi del codice arbitrariamente sbagliato il mio SO bloccherebbe tutto o comunque la malloc fallirebbe. Quindi in pratica mi sembra di aver capito che non c'è possibilità di creare dei danni alla macchina. Giusto?

Non proprio, dipende.
Se usi Gnu/Linux molto probabilmente hai di default un comportamento come quello spiegato da Flame, il cui esempio è però quello più "semplice" e in cui vedi subito l'errore. Questo è però appunto il caso "ideale" (ideale nel senso che te ne accorgi più o meno subito, imho, è comunque da considerarsi come *bug*), mentre potrebbe capitare che dopo aver allocato "correttamente" un pò di roba, al momento di utilizzarla... KABOOM! e potrebbe non essere così ovvio quando e perchè è saltato tutto.
E' comunque un comportamento che può essere modificato ma, a quanto ne so, solo globalmente.
Tieni presente che su Linux potresti anche dover fare i conti con il celeberrimo OOM killer.
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
crap0101
Utente
Utente
 
Messaggi: 392
Iscritto il: 02/01/2008 - 03:43
Località: ora sono qua


Torna a Il Pozzo della conoscenza

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron