Molto di questo ha a che fare con la storia e le direzioni future.
C'erano una volta due versioni principali (e in qualche modo concorrenti) di unix:system V e BSD. SysV aveva le sue versioni di IPC, incluse le 3 grandi:memoria condivisa, semafori e code di messaggi. POSIX è arrivato per cercare di unire le cose.
Quindi al momento abbiamo due versioni:memoria condivisa posix, MQ e semafori e le versioni sysV. Giusto per rendere le cose un po' più confuse, le versioni sysV sono anche parte di posix.
Quindi in pratica la tua domanda è:vuoi usare la memoria condivisa in stile Posix o sysV? In generale, la maggior parte delle persone ha una visione a lungo termine e opta per Posix perché sembra essere la strada per il futuro. Ma, realisticamente, il materiale sysV è così integrato in così tanti sistemi che devi avere seri dubbi che scomparirà mai.
Quindi, eliminando le cose a lungo termine, si riduce a ciò che ha senso per il tuo progetto e i tuoi gusti. In generale, le versioni sysV tendono ad essere un po' più potenti, ma hanno un'interfaccia goffa che la maggior parte delle persone trova un po' sconcertante al primo contatto. Ciò è particolarmente vero per i semafori sysV e le code di messaggi. In termini di memoria condivisa si può sostenere che sia sysV che posix siano scomodi. Le versioni sysV portano il goffo ftok
e cose chiave mentre il posix finisce per prendere più chiamate e alcune condizioni di gara da impostare. Dall'esterno, le versioni posix hanno un vantaggio in quanto utilizzano il file system e possono essere mantenute con funzioni standard della riga di comando come 'rm' piuttosto che affidarsi a programmi di utilità separati (ad es. ipcs
) richiesto da sysV.
Quindi quale dovresti usare? Di norma, le versioni posix. Ma dovresti davvero familiarizzare con le versioni di sysV. Hanno alcune funzionalità che vanno oltre le capacità delle versioni posix che potresti voler sfruttare in situazioni specifiche.
Entrambi i metodi sono fattibili. mmap
metodo è un po' più restrittivo di shmget
, ma più facile da usare. shmget
è il vecchio modello di memoria condivisa di System V e ha il supporto più ampio. mmap
/shm_open
è il nuovo modo POSIX di fare memoria condivisa ed è più facile da usare. Se il tuo sistema operativo consente l'uso della memoria condivisa POSIX, suggerirei di utilizzarla.
Alcuni suggerimenti:
- Se crei i tuoi figli tramite
fork
quindimmap
conMAP_ANONYMOUS | MAP_SHARED
è di gran lunga il modo più semplice:basta una chiamata.MAP_ANONYMOUS
è tuttavia un'estensione Linux non specificata da POSIX. - Se avvii i processi in modo indipendente, ma puoi fornirli con un nome di memoria condiviso allora
shm_open
(+ftruncate
) +mmap
conMAP_SHARED
è di due/tre chiamate. Richiedelibrt
su alcuni sistemi operativi. - Se il tuo sistema operativo ha
/dev/shm/
poishm_open
equivale ad aprire un file in/dev/shm/
.