Perché utilizzare shm_open?

Qual è il vantaggio di fare: shm_open seguito un mmap?

Perché non creare un file regolare, e quindi passare fd per mmap?

Non vedo il vantaggio di shm_open – questi sono solo riferimenti, non lo sono?

Ho letto l’uomo di tutta la famiglia. Mi sembra che il “segreto” è in mmaping azione – il file di “tipo” sembra essere priva di significato.

Puntatori sarà buono, soprattutto con prestazioni account.

Il mio contesto è un (ciclico over-scrivibile) buffer (dire 128MB) che sarà costantemente scritto per essere un processo, e costantemente oggetto di dumping da un altro.

Come esempio: cosa c’è di sbagliato con questo aperto/mmap approccio.

MODIFICA

Per essere precisi, è uno dei seguenti meglio di altri:

fd = open("/dev/shm/myshm.file", O_CREAT|O_RDWR, S_IRUSR | S_IWUSR);
mem = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

vs

fd = shm_open("/myshm.file", O_RDWR|O_CREATE, S_IRUSR | S_IWUSR);
mem = mmap(...same as before...);

Quando ho creato un file con regolare open sotto il /dev/shm fs, e oggetto di dumping un Concerto di immondizia, la mia memoria disponibile è andato giù da 1G, e il mio disponibile spazio su disco è rimasto lo stesso.

Qual è la differenza tra i due metodi?

  • Basta provare. la scrittura di un file è forse un centinaio di volte più lento.
InformationsquelleAutor Trevor | 2014-07-21



2 Replies
  1. 19

    Se si apre e mmap() un file, i dati finiscono in quel file.

    Se avete solo bisogno di condividere una regione di memoria, senza la necessità di rendere persistenti i dati, che comporta l’ulteriore sovraccarico di I/O, l’uso shm_open().

    Ad una regione di memoria consentirebbe anche di memorizzare altri tipi di oggetti come i mutex o semafori, che non è possibile memorizzare in un mmap()’ed normale file su più sistemi.

    • Ma cosa succede se ho creato il file in /dev/shm fs? così, open(“/dev/shm/myshm”, “w”)? Qual è il vantaggio di usare il shm_open?
    • Quindi sarebbe praticamente la stessa, se si utilizza shm_open o aperto, ma solo ricordare che è specifico di linux. Sarebbe piuttosto pontless fare quando un approccio standard esiste. shm_open si prende cura di trovare /dev/shm se è montato in una posizione troppo.
    • Grazie per aver ricordato la portabilità del numero. Il nostro prodotto viene fornito come una macchina virtuale per i clienti, così abbiamo il controllo della distribuzione del nostro codice viene eseguito su, in modo che possiamo gestire. Che cosa mi ha preso il primo posto è stato il inablity per creare logico directory sotto /dev/shm fs. Questo è un artefatto di glibc del shm_open, e non è un problema di fs – in modo da sto andando con open().
    • si noti che in base allo standard POSIX: “L’interpretazione dei caratteri di barra diverso il principale carattere di barra in nome definito dall’implementazione.” Perché non attenersi a standard chiamata API e semplicemente risolvere i suoi limiti, ad esempio, con un carattere di sottolineatura o altri caratteri speciali nel nome del file per separare le parti logiche, invece di creare le directory sotto /dev/shm?
    • Quello che stai suggerendo è corretta – e la considero ancora. Tuttavia, per esempio, se io’ld desidera eseguire e inotify sul “nostro” directory sotto /dev/shm, devo ricorrere a eseguire inotify su /dev/shm – e di essere esposti ad altri processi di registrazione in questo spazio. Solo un esempio che mi viene in mente
    • Può shm_open seguita da mmap consentono di memorizzare una pthread mutex_t che può essere modificato dall’pthread_mutexattr_setpshared funzione in Ubuntu Linux 15.10 glibc 2.21? La ragione di questa domanda è che vorrei utilizzare pthread_mutex_t per l’installazione di sincronizzazione tra processi. Grazie.
    • Iliev e Trevor, Può shm_open seguita da mmap consentono di memorizzare una pthread mutex_t che può essere modificato dall’pthread_mutexattr_setpshared funzione in Ubuntu Linux 15.10 glibc 2.21? La ragione di questa domanda è che vorrei utilizzare pthread_mutex_t per l’installazione di sincronizzazione tra processi. Grazie
    • Sì si può fare.
    • Grazie per la vostra risposta. Potrebbe per favore dare un’occhiata al UNIX output di confronto di glibc 2.21 e glibc 2.22 di pthread_mutexattr_setpshared.c mostrate in fossies.org/diffs/glibc/2.21_vs_2.22/nptl/… e spiegare il motivo per cui posso ancora utilizzare il pthread_mutexattr_setpshared.funzione c in Ubuntu Linux 15.10 glibc 2.21 installazione pthread_mutex_t a fare la sincronizzazione interprocesso. Mi è stato detto , forse iincorrectly, che c’è un bug in pthread_mutexattr_setpshared.funzione c in Ubuntu Linux 15.10 glibc 2.21. Grazie.

  2. 2

    Entrambe le chiamate sono sostanzialmente equivalenti moderni Linux
    – 1 ° approccio potrebbe essere utilizzato per accedere a POSIX memoria condivisa da lingue come fare (vedi https://github.com/fabiokung/shm/blob/master/shm_linux.go) dove POSIX memoria condivisa non è disponibile in modo nativo – potrebbe essere diverso per altri OS/versione dove il 1 ° chiamata porterebbe ad alcuni di creazione del file o /dev/shm non è disponibile e/o, eventualmente, di un rallentamento delle prestazioni. Le regole del percorso di fusione potrebbe anche essere in continua evoluzione da versione a versione di librt

    1 ° approccio chiamato file mappati in memoria API (supportato in std libs)

    2 ° chiamata POSIX memoria condivisa API (richiede librt aka libposix su Linux come dipendenza È internamente costrutti percorso e chiama open)

Lascia un commento