[Tech] OT - Programmazione C

Franco Bagnoli franco.bagnoli@unifi.it
Mer 18 Feb 2004 21:57:59 CET


On Wed, 18 Feb 2004, Valerio Montagnani wrote:

> Ho provato a scrivere un programmino che allocasse dinamicamente un po'
> di memoria, stampasse indirizzo e contenuto di una cella e infine
> liberasse la RAM allocata precedentemente. Ho aggiunto, dopo la funzione
> free, una printf che avrebbe dovuto stampare i valori della cella di ram
> ottenuti prima di aver liberato la memoria. Mi sarei aspettato un errore
> o un risultato casuale, dato che quella locazione sarebbe dovuta essere
> vuota, mentre il computer mi ha restituito gli stessi valori di prima.
> E' possibile che abbia sbagliato a liberare la ram?

Da qualche parte ho letto la seguente frase: 

<< tranne che nel sistema operativo macos, in tutti gli altri la memoria 
liberata non "ritorna" al sistema operativo, ma resta a disposizione del 
programma per successive allocazioni. Per questo i server che girano tanto 
tempo fanno dei fork periodici, o se devono usare molta ram in una fase 
iniziale "forcano" subito dopo. >>

Se questo è vero nulla vieta di leggere la memoria "liberata", dato che di 
sicuro non viene cancellata (sarebbe uno spreco di tempo) nè viene 
assegnata ad un altro processo (darebbe un core dump), ma ovviamente e la 
maniera sicura di incasinarsi, oltre ad essere inutile. 

Bisogna anche tenere presente che a volte si usa il "copy on write"  
(sempre per velocizzare), per cui se per esempio hai fatto un fork e poi
disallochi della memoria e quindi vai a leggere, non è assolutamente detto
che ci trova qualcosa di sensato.


-- 
Franco Bagnoli (franchino) <franco.bagnoli@unifi.it> (bagnoli@dma.unifi.it)
virtual location: Dipartimento di Energetica "S. Stecco"
ultra-virtual affiliation: Centro Dinamiche Complesse (CSDC-Firenze)
real location: Dip. Matematica Applicata "G. Sansone", Universita' Firenze,
Via S. Marta, 3 I-50139 Firenze, Italy. Tel. +39 0554796422, fax: +39 055471787




Maggiori informazioni sulla lista flug-tech