Newsgroup: it.comp.os.dibattiti
Titolo: sui programmi che gestiscono la memoria

da troppo tempo sento parlare da parte di "quelli-che-sě-che-ne-capiamo" (č
un titolo che si acquisisce comprando due volte di seguito pcworld) di
applicativi che "ottimizzano" la gestione della memoria, deframmentandola.
conosco un tipo che giura che "scarica-meglio-da-winmx", dopo aver
installato un applicativo del genere.
dall'alto della mia ignoranza mi chiedo: ma la gestione della memoria non č
un compito esclusivo del s.o.?
puň un programma occuparsi della "deframmentazione della ram"? puň un s.o.
lasciare che qualcuno faccia un lavoro del genere al posto suo?
ultima domanda (la + fetente): come mai st'applicativi sono per i soliti
s.o. marchiati microsoft?  qualunque altro s.o. non ne ha bisogno?
voi cosa ne pensate? serve veramente che un applicativo gestisca la ram e la
deframmenti ... in "subappalto" ?

 deframmenti ... in "subappalto" ?
no, sono delle vaccate
(i programmi intendo, non quello che hai scritto tu :-) )

lasciare che qualcuno faccia un lavoro del genere al posto suo?
No però un simaptico programmino potrebbe ferti il contrario allocarti
RAM e mai rilascertela.
Una volta esistevano per WinXX utility come RAM Doubler ma
sinceramente non gli ho mai usati.
MAX

 programmatore.
scusa la domanda che può sembrare stupida:
se il programma termina e non ha chiuso i file e/o non ha rilasciato
la memoria (metti perché il programma si è incartato) cosa succede? Mi
sembrerebbe che i file vengano chiusi e mi sembra che anche la memoria
venga rilasciata lo stesso alla morte del processo.

 venga rilasciata lo stesso alla morte del processo.
Su un sistema operativo serio [1][2][3] si'.
[1]
Win 98 non e' serio: con Outlook Express,WinCad
e IE mi esaurisce le risorse 3 volte in un giorno,
poi devo riavviare.
[2] WinNT e' semi-serio: c'e' una API, RasEnumDevices (o RasEnumConnections
nn
mi ricordo),
che ogni volta che la invochi perde 4k di RAM (questo baco ci ha
infastidito non poco nello sviluppo) e a lungo andare, specie se fai un
servizio
che deve funzionare 24/7...
pero' con il service pack 6 il baco e' stato corretto.
[3] Win2000 Professional e' "basato su windows NT".
infatti ha ereditato il baco [2] (ci sono programmatori in Microsoft
che NON imparano dagli errori degli altri) e ,sopratutto,
ne' il sp1 e lo sp2 lo correggono, per cui abbiamo dovuto fare dei
workaround.

sp3 l'ha corretto?

> sp3 l'ha corretto?
non ho provato ancora,
il workaround funziona ;-)

 venga rilasciata lo stesso alla morte del processo.
E' così. E in genere non c'è problema sulle risorse allocate direttamente e 
esplicitamente dal programma, nemmeno con quel cialtrone di win9x. Diverso 
può essere se la risorsa viene allocata da qualcun'altro per lui, ad 
esempio un driver bacato. 

 [2] WinNT e' semi-serio:
è un problema diverso. In Windows 98 ne sono affetti tutti i processi
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.20. C, C++ and ASM developers
                              and beta testers are welcome!

 qualcun'altro per lui, ad esempio un driver bacato.
ottimo. Allora la deframmentazione della memoria citata all'inizio č una
vaccata.
Approposito di allocazione della memoria: ho un pc con un giga di ram su
cui sviluppo applicazioni grosse. Ho visto che sotto windows (anche xp) se
i programmi cercano di allocare matrici troppo grosse mi fallisce
l'allocazione della memoria. Eppure io so che di memoria ce n'č a
sufficienza (cavolo se ne ho una e occupo in totale 300 mega e ne
voglio un'altra....) .
Come mai sotto win la malloc fallisce? Sta cosa mi fa incavolare....

esempio un driver bacato. 
Relativamente vero, putroppo nelle mie vite passate mi č successo
spesse volte di scrivere programmi che in NT di dimenticavano di
disallocare la memoria, aime....., e su NT funzionavano mentre su Win
9x avevano effetti indesiderati quali messaggi di "Esaurimento di
memoria" e sparizione delle icone ed erano dovuti a bachi nei mei
software.
Ad esempio una dimenticanza di allocazione del GDI a lungo andare su
Win9x puo provocare effetti alquanto strani.
MAX

 Come mai sotto win la malloc fallisce? Sta cosa mi fa incavolare....
Frammentazione della memoria...
-- 
"Everything is vague to a degree you do not realize till you have tried
  to make it precise"
                                       Bertrand Russell
                                       The Philosophy of Logical Atomism

 Frammentazione della memoria...
perché, li cerca tutti contigui? non è in grado di rimappare la memoria in
un unico blocco virtuale? E la memoria virtuale che ci sta a fare?

 E la memoria virtuale che ci sta a fare?
Vedi sopra.


 sparpagliati...
mi sembra una strategia non molto furba. Su un computer che va da un po'
di tempo non si puň praticamente piů allocare memoria...

 di tempo non si può praticamente più allocare memoria...
Ovviamente la frase di sopra va interpretata nel contesto del SO in 
esame e della tecnologia usata: agli occhi dell'applicazione la zona di 
memoria deve essere contingua. L'OS può ovviamente utilizzare la MMU per 
far sembrare che lo sia, ma, evidentemente, in windows questo non è 
sempre possibile.


 ne voglio un'altra....) .
Mi sembra strano che tu abbia di questi problemi con questi numeri, mi 
sembra strano perchč ho fatto una stupida prova con questo pc (win2000, 
256M ram) e sono riuscito a fare due malloc di 300 mega.

 a fare? 
Il virtual memory manager è il livello di astrazione nella mappatura della 
memoria. Il lavoro di rimappare la memoria fisica lo fa in continuazione.
Certamente che i blocchi sono contingui.
Quando si lavora con quantitativi di memoria considerevoli, ci sono delle 
tecniche per non cascare clamorosamente nella trappola. Prima le piccole 
allocazioni persistenti, poi le grandi allocazioni transienti. Se si arriva 
(ad esempio) a situazioni clamorose come quella che hai descritto prima, 
bisogna rivedere questa tecnica.
 

 la memoria virtuale che ci sta a fare? 
malloc() è una semplice chiamata di libreria. E' ottimizzata per un 
uso normale, non per allocare più blocchi da 300 MB e oltre. Quindi 
normalmente si riserva una quantità ragionevole di memoria. Se a te 
ne serve tanta digli di riservarne tanta. Oppure, visto che 4 KB di 
overhead massimo per un blocco da 300 MB non sono eccessivi, lascia 
stare l'heap manager del tutto - alloca memoria virtuale


 incavolare.... 
in generale, Microsoft sconsiglia di usare malloc per oggetti superiori 
ai 16 MB. Usa VirtualAlloc. Se perň vuoi proprio farti del male, almeno 
fattelo bene. Cambia le flag del linker per farti riservare piů heap al 
caricamento del processo, o l'heap principale ti va a finire in qualche 
posto disgraziato, in cui viene subito schiacciato da altre allocazioni 
di memoria virtuale e non puň piů crescere. Oppure creati uno heap tuo, 
a runtime (HeapCreate), per gli oggetti grossi. Una cosa che in Windows 
non manca di certo sono modi per allocare memoria


 256M ram) e sono riuscito a fare due malloc di 300 mega.
ma porca...
oh, sarà che riconosce l'utente e la stima reciproca è quasi
inesistente....

 vedi alla voce lazy allocation, e' ovvio che funzioni cosi'.
E' ovvio nei termini che in windows non si allocano 300M nell'heap.
 

 E' ovvio nei termini che in windows non si allocano 300M nell'heap.
io ragiono nei termini generali di "gestione della memoria" e 
conosco 0 o meno di win, quindi ti posso solo dire che
per me una malloc e' una malloc: che allochi 4k o 400mb 
poco cambia.
Come diceva Maya, magari in win malloc non e' ottimizzata per 
grosse allocazioni ( ma qlc questa me la deve spiegare), ma rimane il
fatto che un qls os umano si comporta esattamente come riportavi tu:
la malloc riserva spazio nello spazio di indirizzi virtuali che ogni
processo ottiene, quindi ogni successiva scrittura in mem comporta 
page-fault&c nel caso in cui la pg non sia presente nella mem reale, 
etcect
ripeto, a me non sembra nulla di strano.  
-- 
Paolo
Italian FreeBSD User Group: 
http://www.gufi.org