PDA

View Full Version : [C] malloc enorme


Unrue
30-07-2008, 09:20
Ciao,
avrei due domande sulla malloc.

1)Supponiamo che ho 2 gb di RAM sulla mia macchina. Cosa succede se faccio una malloc di più di 2 gb? L'applicazione schianta o comunque alloca fino a che può?

2) Caso di prima, quindi 2gb di RAM, ma solo 500 mb liberi. Se alloco più di 500 mb che succede?

lorenzo001
30-07-2008, 09:29
1) No. Non perche' hai 2 G di RAM, ma perche', normalmente, Windows non mette a disposizione di un processo utente piu' di 2 G di spazio di indirizzamento virtuale.

2) La memoria potrebbe essere allocata in quanto il sistema pagina su disco.

tomminno
30-07-2008, 09:46
Ciao,
avrei due domande sulla malloc.

1)Supponiamo che ho 2 gb di RAM sulla mia macchina. Cosa succede se faccio una malloc di più di 2 gb? L'applicazione schianta o comunque alloca fino a che può?


Se hai modificato il boot.ini in modo da ammettere 3.2GB per processo allochi con successo altrimenti ottieni NULL.


2) Caso di prima, quindi 2gb di RAM, ma solo 500 mb liberi. Se alloco più di 500 mb che succede?

Se rientri nei limiti previsti per processo (2 o 3.2GB) swappi di brutto se utilizzi effettivamente quella memoria.
Nel caso di immagini RAW non è difficile superare i 500MB.

Unrue
30-07-2008, 09:47
1) No. Non perche' hai 2 G di RAM, ma perche', normalmente, Windows non mette a disposizione di un processo utente piu' di 2 G di spazio di indirizzamento virtuale.

2) La memoria potrebbe essere allocata in quanto il sistema pagina su disco.

E sotto Linux?

ilsensine
30-07-2008, 10:06
Ciao,
avrei due domande sulla malloc.

1)Supponiamo che ho 2 gb di RAM sulla mia macchina. Cosa succede se faccio una malloc di più di 2 gb? L'applicazione schianta o comunque alloca fino a che può?
Il successo o il fallimento della malloc non dipende dalla ram disponibile, in quanto alloca indirizzi virtuali, non fisici (c'è comunque un limite di "overcommit ratio", mi sembra).
Nel caso di linux, inoltre, la malloc è limitata a una certa quantità (anche su macchine a 64 bit), non ricordo quale esattamente; per allocazioni enormi tipo la tua, è consigliabile una mmap anonima (v. man mmap). Meglio ancora se effettuata con huge pages (v. google per hugetlbfs).
Infine, lo spazio di indirizzi su una macchina a 32 bit per processo è di 3GB, ma non so se riesci a trovare un buco di 2GB di indirizzi per la tua mmap (v. /proc/self/maps per informazioni sul tipico layout degli indirizzi di un processo).

2) Caso di prima, quindi 2gb di RAM, ma solo 500 mb liberi. Se alloco più di 500 mb che succede?
Che gli indirizzi virtuali vengono allocati comunque (se sono disponibili).

In sintesi, se hai bisogno di tutti quegli indirizzi, hai bisogno di una macchina a 64 bit.

DanieleC88
30-07-2008, 12:10
Infine, lo spazio di indirizzi su una macchina a 32 bit per processo è di 3GB
Con 32 bit non sono indirizzabili direttamente 4GiB o ricordo male? :wtf:

ilsensine
30-07-2008, 12:57
Con 32 bit non sono indirizzabili direttamente 4GiB o ricordo male? :wtf:
1GB sono riservati agli indirizzi del kernel, non accessibili dallo spazio utente.

E' una scelta dettata dalle prestazioni; c'era in giro fino a qualche tempo fa una patch per avere uno spazio separato 4GB/4GB per il kernel e le applicazioni, ma aveva un certo impatto computazionale. Stava nel ramo -mm, non so se c'è ancora.

recoil
30-07-2008, 13:23
E sotto Linux?

su architettura 32 bit qualche tempo fa avevo notato che non andava oltre i 2,7GB per processo, anche spezzando in più chiamate a malloc
io dovevo arrivare a 16GB e facevo diverse fork allocando 2GB per processo