Entra

View Full Version : FreeBSD, swap e mmap


/\/\@®¢Ø
09-01-2003, 21:11
Devo elaborare una grande quantita' di dati ( piu' di 1 GB ) e putroppo sono obbligato e tenerli tutti in memoria centrale. Avendo solo 512MB di ram mi sono inizialmente appoggiato allo swap file. Successivamente ho provato a mappare in memoria delle porzioni di disco fisso in memoria, e ho notato un notevole incremento delle prestazioni, (e un minore lavoro del disco). Ma in effetti non dovrebbero essere le due cose analoghe, con una parte della memoria "occupata" a far da cache ai dati effettivamente su disco ?
( sto lavorando con FreeBSD ).
Le chiamate per la mmap sono dipendenti dal sistema o esiste un qualche standard ( tipo POSIX ) ?

ilsensine
09-01-2003, 21:19
Originally posted by "/\/\@®¢Ø"

Devo elaborare una grande quantita' di dati ( piu' di 1 GB ) e putroppo sono obbligato e tenerli tutti in memoria centrale. Avendo solo 512MB di ram mi sono inizialmente appoggiato allo swap file. Successivamente ho provato a mappare in memoria delle porzioni di disco fisso in memoria, e ho notato un notevole incremento delle prestazioni, (e un minore lavoro del disco). Ma in effetti non dovrebbero essere le due cose analoghe, con una parte della memoria "occupata" a far da cache ai dati effettivamente su disco ?
No, l'mmap diretto dei file è pensato apposta per lavorare su grandi quantità di dati.
Se il file è mappato e il sistema necessita di memoria, alcune pagine vengono riscritte...sullo stesso file, lasciando libero lo swap per altre cose.

Le chiamate per la mmap sono dipendenti dal sistema o esiste un qualche standard ( tipo POSIX ) ?
mmap è descritta negli standard POSIX.4, 4.4BSD e altri.

/\/\@®¢Ø
09-01-2003, 21:25
grazie mille !
un'ultima domanda: la mmap anonima consiste nell'utilizzare spazio del disco senza che venga associato un nome ad esso ? Se si', come decide il sistema dove prenderlo ? (da quale partizione ? )

ilsensine
09-01-2003, 21:28
la mmap anonima consiste nell'utilizzare spazio del disco senza che venga associato un nome ad esso ?
No, la mmap anonima è uno dei modi per allocare memoria.

/\/\@®¢Ø
09-01-2003, 21:38
Strano ! Provando ad usare mmap anonimo mi sembra che i risultati non siano gli stessi che utilizzando semplice memoria ram... faro' ulteriori prove.

ilsensine
09-01-2003, 22:08
Normalmente la "semplice memoria ram", allocata con mallloc, viene ottenuta o tramite la chiamata di sistema brk o tramite mmap di /dev/zero (credo sui sistemi più datati, ormai dovrebbe essere obsoleto); quindi viene gestita dall'heap delle libc - quindi delle differenze ci sono per forza.

ilsensine
09-01-2003, 22:13
asp...scommetto 10 a 1 che stai facendo un mmap anonimo passando l'fd del file su cui devi operare, vero? :D

/\/\@®¢Ø
10-01-2003, 10:47
Originally posted by "ilsensine"

asp...scommetto 10 a 1 che stai facendo un mmap anonimo passando l'fd del file su cui devi operare, vero? :D
No, hai ragione tu (l'fd da passare per le anonime e' -1)... avevo fatto i testo con le mmap anonime ma con poca occupazione di memoria... per forza andava tutto bene :D.
Grazie ancora per l'aiuto !

/\/\@®¢Ø
13-01-2003, 13:16
Altra domanda: come fa il S.O. a fare la mappatura ? A quando deve fare il "cambio" tra indirizzi di memoria locali all'applicazione e indirizzi assoluti (non sono i termini giusti, spero tu capisca), in un certo senso alla stregua di quello che fa quando deve spostare la memoria tra RAM e swap ? Oppure usa una tecnica totalemente differente ? Me lo chiedo perche' col debugger (sotto FreeBSD) l'indirizzo della memoria mappata e' sempre 0xFFFFFFFF. (F +, F- :D )
Ah... perche' non ho fatto un esame di S.O. a suo tempo ? :( :D

ilsensine
13-01-2003, 13:32
Se mmap restituisce 0xffffffff, allora la chiamata alla funzione è fallita (una mmap fallita non restituisce NULL!)

/\/\@®¢Ø
13-01-2003, 20:52
Originally posted by "ilsensine"

Se mmap restituisce 0xffffffff, allora la chiamata alla funzione è fallita (una mmap fallita non restituisce NULL!)
strano ! Mi sembrava facesse cosi' anche quando andava a buon fine (pero' ora mi fai venire dei dubbi... ricontrollo )

ilsensine
13-01-2003, 21:04
Da man mmap:

RETURN VALUE
On success, mmap returns a pointer to the mapped area. On
error, MAP_FAILED (-1) is returned, and errno is set
appropriately.

/\/\@®¢Ø
17-01-2003, 10:03
Non ho potuto controllare (sono via da casa) ma penso che sia come tu dici. Altra domanda: sto provando ad utilizzare lo stesso codice sotto una vecchia workstation sun. Tutto si compila bene, tranne la chiamata ad munmap: a quanto pare il parametro della funzione non deve essere un void* ma un char* (e si che la documentazione dice proprio il contrario :confused:
Hai avuto modo di lavorare con una Sun ? (mi sembrava che avessi detto di si' tempo fa...)

ciao e grazie ancora

ilsensine
17-01-2003, 11:05
Sì, ma non ho usato munmap. Indifferente se è un char *; se il compilatore miagola, fai un cast e vivi tranquillo.