GNU/Linux >> Linux Esercitazione >  >> Linux

Memoria condivisa di Linux:shmget() vs mmap()?

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 quindi mmap con MAP_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 con MAP_SHARED è di due/tre chiamate. Richiede librt su alcuni sistemi operativi.
  • Se il tuo sistema operativo ha /dev/shm/ poi shm_open equivale ad aprire un file in /dev/shm/ .

Linux
  1. Versione Kali Linux 2018.1

  2. Rimozione delle librerie condivise di Linux

  3. Come elencare i processi collegati a un segmento di memoria condivisa in Linux?

  4. Come utilizzare la memoria condivisa con Linux in C

  5. Rimuovere la memoria condivisa posix quando non in uso?

Come controllare la memoria condivisa di Linux usando il comando ipcs

Come cancellare la memoria di scambio in Linux

Esempi di comandi gratuiti in Linux

Raccomandazione sulla comunicazione tra processi

L'allocazione della memoria in Linux non è bloccante?

Memoria inattiva di Linux