Torna indietro   Hardware Upgrade Forum > Software > Programmazione

BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max mette un pannello IPS da 13 pollici con risoluzione 2,5K e refresh a 120 Hz davanti a una batteria da 10.100 mAh e a quattro altoparlanti. Il listino parte da 399,90 euro, per un progetto molto chiaro e ambizioso: schermo ampio, buon audio e giornate lontano dalla presa, a un prezzo che non pesa sul portafoglio
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-07-2011, 16:42   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7575
[C] Memory mapping di shared object

Ciao a tutti,

vorrei capire come effettuare un memory mapping di uno shared memory object, anche se non mi è molto chiaro come fare. La stragrande maggioranza degli esempio che si trova in rete utilizza mmap con dei files. Ad esempio, vorrei provare a fare una memory map di un array:

int*array=(int*) mmap(NULL, 100*sizeof(int), PROT_READ| PROT_WRITE, MAP_SHARED, -1, 0);

ma mi restituisce MAP_FAILED

Non mi è chiaro il mappaggio di shared objects con mmap, qualcuno mi può illuminare? Grazie.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 08-07-2011, 16:45   #2
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
se vuoi usare la mmap per la memoria condivisa devi usare il flag MAP_ANONYMOUS
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 08-07-2011, 17:12   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7575
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
se vuoi usare la mmap per la memoria condivisa devi usare il flag MAP_ANONYMOUS
Ok, grazie per la dritta. Ma anche con quel flag non fa il mapping
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 08-07-2011, 17:41   #4
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ok, grazie per la dritta. Ma anche con quel flag non fa il mapping
Che errore ti da ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 08-07-2011, 18:17   #5
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7575
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Che errore ti da ?
Sono riuscito a fare il mapping così:

Codice:
int*array=(int*) mmap(NULL, 100*sizeof(int), PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
Il mio scopo però è fare un memory mapping di una matrice bidimensionale:

Codice:
int**array=(int**) mmap(NULL, dim_x*sizeof(int*), PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

for(..i..)
array[i]=(int*) mmap(NULL, dim_y*sizeof(int), PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);


Però se cerco di allocare oltre un limite che non conosco (ma già con 40 mb succede), mi dice " Cannot allocate memory" nel mapping dentro il for. Però, stranamente, un mapping di controesempio delle stesse dimensioni su un singolo array funziona. Ha senso effettuare un mapping di una matrice in questa maniera? Preciso che la macchina in questione ha circa 50 Gb di RAM.

Ultima modifica di Unrue : 08-07-2011 alle 18:38.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2011, 01:16   #6
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Sono riuscito a fare il mapping così:

Codice:
int*array=(int*) mmap(NULL, 100*sizeof(int), PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
Il mio scopo però è fare un memory mapping di una matrice bidimensionale:

Codice:
int**array=(int**) mmap(NULL, dim_x*sizeof(int*), PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

for(..i..)
array[i]=(int*) mmap(NULL, dim_y*sizeof(int), PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);


Però se cerco di allocare oltre un limite che non conosco (ma già con 40 mb succede), mi dice " Cannot allocate memory" nel mapping dentro il for. Però, stranamente, un mapping di controesempio delle stesse dimensioni su un singolo array funziona. Ha senso effettuare un mapping di una matrice in questa maniera? Preciso che la macchina in questione ha circa 50 Gb di RAM.
Potrebbe essere un limite sul numero di aree di memoria allocate.
In ogni caso non la vedo una buona scelta, per due motivi:
In primis di performance, una matrice con doppi puntatori e' generalmente piu' lenta di una implementata con un singolo array.
La seconda e' che, a meno che tu poi non condivida la memoria con dei figli generati con una fork, hai dei puntatori che in generale non hanno senso in altri processi..

Per ovviare al problema del numero di chiamate, potresti semplicemente allocare una singola area condivisa.
Poi puoi usare una struttura piatta per la matrice oppure ,se vuoi mantenere quella attuale, prenderne dei segmenti da assegnare al vettore elle righe piuttosto che alle singole colonne.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2011, 20:38   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7575
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Potrebbe essere un limite sul numero di aree di memoria allocate.
Potresti chiarirmi questo punto?

Quote:
Originariamente inviato da marco.r Guarda i messaggi
In ogni caso non la vedo una buona scelta, per due motivi:

In primis di performance, una matrice con doppi puntatori e' generalmente piu' lenta di una implementata con un singolo array.
Si, questo lo so.

Quote:
Originariamente inviato da marco.r Guarda i messaggi
La seconda e' che, a meno che tu poi non condivida la memoria con dei figli generati con una fork, hai dei puntatori che in generale non hanno senso in altri processi..
Il discorso è un pò più complesso, in quanto sto allocando con la mmap per utilizzare la memoria in modalità intervealed tramite la libnuma, una libreria di gestione della memorai modalità NUMA, la quale prevede in questo caso che la memoria sia allocata con mmap o shmat. Tale memoria sarà condivisa poi da più threads.

Quote:
Originariamente inviato da marco.r Guarda i messaggi
Poi puoi usare una struttura piatta per la matrice oppure ,se vuoi mantenere quella attuale, prenderne dei segmenti da assegnare al vettore elle righe piuttosto che alle singole colonne.
Mm, puoi farmi un esempio? Grazie.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2011, 22:11   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Potresti chiarirmi questo punto?
Ah pensavo potesse esserci un limite sul numero di memorie mappate, pero' guardando sembra non sia cosi'. Potrebbe cmq essere qualche altro limite impostato per processo. Ad esempio:
Quote:
RLIMIT_MEMLOCK
The maximum number of bytes of memory that may be locked into RAM. In effect this limit is rounded down to the nearest multiple of the system page size. This limit affects mlock(2) and mlockall(2) and the mmap(2) MAP_LOCKED operation. Since Linux 2.6.9 it also affects the shmctl(2) SHM_LOCK operation, where it sets a maximum on the total bytes in shared memory segments (see shmget(2)) that may be locked by the real user ID of the calling process. The shmctl(2) SHM_LOCK locks are accounted for separately from the per-process memory locks established by mlock(2), mlockall(2), and mmap(2) MAP_LOCKED; a process can lock bytes up to this limit in each of these two categories. In Linux kernels before 2.6.9, this limit controlled the amount of memory that could be locked by a privileged process. Since Linux 2.6.9, no limits are placed on the amount of memory that a privileged process may lock, and this limit instead governs the amount of memory that an unprivileged process may lock.
Potrebbe essere questo.

Quote:
Il discorso è un pò più complesso, in quanto sto allocando con la mmap per utilizzare la memoria in modalità intervealed tramite la libnuma, una libreria di gestione della memorai modalità NUMA, la quale prevede in questo caso che la memoria sia allocata con mmap o shmat. Tale memoria sarà condivisa poi da più threads.
Ok, quindi si tratta tutti di thread di uno stesso processo ? In tal caso la mia osservazione non fa testo.

Quote:
Mm, puoi farmi un esempio? Grazie.
Qualcosa tipo
Codice:
int nRows;
int nCols;
int size
...

size = nRows * sizeof(int*) + nRows*nCols*sizeof(int);
void* data=(int*) mmap(NULL, size, PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

int** array = (int**)data;
for ( int i=0; i< nRows; ++i )
{
    array[i] = (int*)(array+nRows) + i*nCols;
}
(potrebbe esserci qualche errore eh, controlla)
ovvero alloco un'unica zona di memoria e poi la suddivido cosi':
Codice:
+-------+--------+--------+-----+---
| array | riga 1 | riga 2 | ... |
+-------+--------+--------+-----+---
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2011, 14:20   #9
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7575
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Ah pensavo potesse esserci un limite sul numero di memorie mappate, pero' guardando sembra non sia cosi'. Potrebbe cmq essere qualche altro limite impostato per processo. Ad esempio:

Potrebbe essere questo.
Mm, si, avevo visto questo limite. Ma controllando con ulimit -l ( che dovrebbe indicare proprio tale limite) dice che è settato "unlimited", quindi pare non dipenda da questo.

Quote:
Originariamente inviato da marco.r Guarda i messaggi
Ok, quindi si tratta tutti di thread di uno stesso processo ? In tal caso la mia osservazione non fa testo.
Si esatto.

Quote:
Originariamente inviato da marco.r Guarda i messaggi

Qualcosa tipo
Codice:
int nRows;
int nCols;
int size
...

size = nRows * sizeof(int*) + nRows*nCols*sizeof(int);
void* data=(int*) mmap(NULL, size, PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

int** array = (int**)data;
for ( int i=0; i< nRows; ++i )
{
    array[i] = (int*)(array+nRows) + i*nCols;
}
(potrebbe esserci qualche errore eh, controlla)
ovvero alloco un'unica zona di memoria e poi la suddivido cosi':
Codice:
+-------+--------+--------+-----+---
| array | riga 1 | riga 2 | ... |
+-------+--------+--------+-----+---
Ok, buona idea. Quindi alloco un singolo array ma accedo all'elemento i-j-e-simo con array[i][j] se non ho capito male, giusto?

Io però ancora non ho ben chiaro su cosa cambi nell'allocare memoria di uno shared object tra la malloc e la mmap. Potresti chiarirmi questo punto? Grazie.

Ultima modifica di Unrue : 10-07-2011 alle 14:24.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2011, 15:00   #10
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ok, buona idea. Quindi alloco un singolo array ma accedo all'elemento i-j-e-simo con array[i][j] se non ho capito male, giusto?
Si' esatto, quello che cambia e' solo che fai un'unica allocazione iniziale


Quote:
Io però ancora non ho ben chiaro su cosa cambi nell'allocare memoria di uno shared object tra la malloc e la mmap. Potresti chiarirmi questo punto? Grazie.
La memoria allocata con una malloc e' visibile solo all'interno del processo che l'ha allocata.
La memoria che ricevi con una mmap e' indirizzabile anche da altri processi.
Se vi deve accedere un processo esterno devi mapparla mediante file (altrimenti non hai modo di dire "voglio vedere _quella_ zona di memoria".
La mappatura anonima va bene quando prima mappi la memoria e poi fai le fork dei vari processi. La differenza rispetto ad una malloc in questo caso e' che dopo una fork la memoria ottenuta precedentemente da una malloc viene copiata ed e' distinta mentre quella ottenuta da una mmap e' effettivamente comune a tutti i processi.
Nel tuo caso hai dei thread che condividono tutto la stessa memoria per cui in sostanza dovrebbe cambiare poco. L'unica nota che mi viene in mente e' che se hai sotto una architettura numa, avere dei thread di uno stesso processo che girano su nodi differenti potrebbe non essere ideale: una parte della memoria viene condivisa tra i nodi e nel caso di scritture ottieni una sincronizzazione non voluta tra i nodi.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2011, 20:40   #11
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7575
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Si' esatto, quello che cambia e' solo che fai un'unica allocazione iniziale



La memoria allocata con una malloc e' visibile solo all'interno del processo che l'ha allocata.
La memoria che ricevi con una mmap e' indirizzabile anche da altri processi.
Se vi deve accedere un processo esterno devi mapparla mediante file (altrimenti non hai modo di dire "voglio vedere _quella_ zona di memoria".
La mappatura anonima va bene quando prima mappi la memoria e poi fai le fork dei vari processi. La differenza rispetto ad una malloc in questo caso e' che dopo una fork la memoria ottenuta precedentemente da una malloc viene copiata ed e' distinta mentre quella ottenuta da una mmap e' effettivamente comune a tutti i processi.
Perfetto! Adesso ho capito

Quote:
Originariamente inviato da marco.r Guarda i messaggi
Nel tuo caso hai dei thread che condividono tutto la stessa memoria per cui in sostanza dovrebbe cambiare poco. L'unica nota che mi viene in mente e' che se hai sotto una architettura numa, avere dei thread di uno stesso processo che girano su nodi differenti potrebbe non essere ideale: una parte della memoria viene condivisa tra i nodi e nel caso di scritture ottieni una sincronizzazione non voluta tra i nodi.
Cosa intendi per nodi in questo caso?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2011, 00:56   #12
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Cosa intendi per nodi in questo caso?
Un insieme di processori della macchina "vicini" dal punto di vista della memoria. Un sistema NUMA non è come il classico SMP dove hai N processori che condividono tutta la memoria. Viene piuttosto suddiviso in un certo numero di nodi i quali hanno una loro memoria locale. Un nodo puo' accedere anhe al resto della memoria, ma con tempi di accesso piu' elevati
Sulle architetture x86 mi risulta che questo modus operandi sia presente solo sugli opteron e alcuni xeon bi/quadri processore, e comunque selezionabile da BIOS.
su che sistema stai lavorando ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2011, 12:24   #13
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7575
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Un insieme di processori della macchina "vicini" dal punto di vista della memoria. Un sistema NUMA non è come il classico SMP dove hai N processori che condividono tutta la memoria. Viene piuttosto suddiviso in un certo numero di nodi i quali hanno una loro memoria locale. Un nodo puo' accedere anhe al resto della memoria, ma con tempi di accesso piu' elevati
Sulle architetture x86 mi risulta che questo modus operandi sia presente solo sugli opteron e alcuni xeon bi/quadri processore, e comunque selezionabile da BIOS.
su che sistema stai lavorando ?

Ok, la tua definizione di nodo coincide con la mia Sto lavorando su Linux. Facendo come suggerisci tu, la chiamata:

numa_interleave_memory fallisce se l'interleaving non parte dal primo elemento di array. Cioè, questo funziona:
Codice:
numa_interleave_memory(&array[0], 1, &numa_all_nodes);
Questo no:
Codice:
numa_interleave_memory(&array[1], 1, &numa_all_nodes);
Al di là della funzione numa_interleave_memory, che non so se conosci, in un array creato con mmap, c'è qualche differenza su come sono mappati in memoria array[0] e array[1]? Sembrerebbe di si..

Ultima modifica di Unrue : 11-07-2011 alle 12:28.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2011, 12:38   #14
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ok, la tua definizione di nodo coincide con la mia Sto lavorando su Linux. Facendo come suggerisci tu, la chiamata:

numa_interleave_memory fallisce se l'interleaving non parte dal primo elemento di array. Cioè, questo funziona:
Codice:
numa_interleave_memory(&array[0], 1, &numa_all_nodes);
Questo no:
Codice:
numa_interleave_memory(&array[1], 1, &numa_all_nodes);
Al di là della funzione numa_interleave_memory, che non so se conosci, in un array creato con mmap, c'è qualche differenza su come sono mappati in memoria array[0] e array[1]? Sembrerebbe di si..

Dal manuale:
Quote:
numa_interleave_memory() interleaves size bytes of memory page by page from start on nodes specified in nodemask. The size argument will be rounded
up to a multiple of the system page size.
A naso direi che la memoria deve partire da un page boundary.
mmap ritorna memoria sempre mappata (in linux) all'inizio di una page, per cui array[0] e' all'inizio di una pagina, array[1] no.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 11-07-2011, 15:16   #15
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7575
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Dal manuale:

A naso direi che la memoria deve partire da un page boundary.
mmap ritorna memoria sempre mappata (in linux) all'inizio di una page, per cui array[0] e' all'inizio di una pagina, array[1] no.
Si vero, grazie mille
Unrue è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
SpaceX e Singulus: stretto un accordo pe...
Binance avvisa: un bug di iOS mette a ri...
Apple corregge 9 vulnerabilità su iPhone...
Microsoft inaugura il Pavilion a Roma, c...
Black Friday, l'errore che può co...
Lotus avrà un V8 ibrido da 670 CV...
IBM: solo il 26% delle imprese dimostra ...
Hacker contro hacker e danni per 740.000...
Xiaomi SkyNomad, boom da 27.147 auto in ...
Logitech concede un giorno di ferie ai s...
Amazon, questi mini PC hanno un display ...
BYD prepara una rivale di smart #2? Il b...
Amazon, 3 robot tagliaerba ECOVACS GOAT ...
La cifratura di WhatsApp e Signal funzio...
Motori elettrici cinesi contro quelli oc...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:07.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v