|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
FreeBSD, swap e mmap
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 ) ? |
![]() |
![]() |
![]() |
#2 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Re: FreeBSD, swap e mmap
Quote:
Se il file è mappato e il sistema necessita di memoria, alcune pagine vengono riscritte...sullo stesso file, lasciando libero lo swap per altre cose. Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
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 ? ) |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Strano ! Provando ad usare mmap anonimo mi sembra che i risultati non siano gli stessi che utilizzando semplice memoria ram... faro' ulteriori prove.
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
asp...scommetto 10 a 1 che stai facendo un mmap anonimo passando l'fd del file su cui devi operare, vero?
![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#8 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
![]() Grazie ancora per l'aiuto ! |
|
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
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-
![]() Ah... perche' non ho fatto un esame di S.O. a suo tempo ? ![]() ![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Se mmap restituisce 0xffffffff, allora la chiamata alla funzione è fallita (una mmap fallita non restituisce NULL!)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
|
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Da man mmap:
Codice:
RETURN VALUE On success, mmap returns a pointer to the mapped area. On error, MAP_FAILED (-1) is returned, and errno is set appropriately.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#13 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
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
![]() Hai avuto modo di lavorare con una Sun ? (mi sembrava che avessi detto di si' tempo fa...) ciao e grazie ancora |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sì, ma non ho usato munmap. Indifferente se è un char *; se il compilatore miagola, fai un cast e vivi tranquillo.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:09.