2012-03-14 20 views
15

Sto leggendo su vari meccanismi IPC. Sto cercando di capire gli scenari, dove usiamo Shared Memory e dove usiamo named Pipes (FIFO).Quando utilizzare Pipe vs Quando utilizzare la memoria condivisa

Tubi: È possibile scrivere più processi, tuttavia è possibile leggere solo un processo. L'operazione di scrittura è atomica.

Memoria condivisa: Processo multiplo in grado di leggere e scrivere. E anche l'utente deve fornire l'esclusione reciproca per leggere & scrivere.

Questa è l'unica differenza di applicazione di memoria condivisa e pipe?

+1

Si noti che le scritture sono solo atomiche se non superiori a dimensioni PIPE_BUF. –

risposta

35

In sostanza, le pipe, siano esse denominate o anonime, vengono utilizzate come il passaggio di messaggi. Qualcuno invia un'informazione al destinatario e il destinatario può riceverlo. La memoria condivisa è più simile alla pubblicazione dei dati: qualcuno mette i dati nella memoria condivisa e i lettori (potenzialmente molti) devono utilizzare la sincronizzazione, ad es. tramite i semafori per conoscere il fatto che ci sono nuovi dati e deve sapere come leggere la regione di memoria per trovare le informazioni.

Con i tubi la sincronizzazione è semplice e integrata nel meccanismo del tubo stesso: le vostre letture e scritture bloccano e sbloccano l'app quando accade qualcosa di interessante. Con la memoria condivisa, è più semplice lavorare in modo asincrono e controllare i nuovi dati solo una volta ogni tanto, ma a costo di un codice molto più complesso. Inoltre è possibile ottenere comunicazioni molti-a-molti, ma richiede più lavoro di nuovo. Inoltre, a causa di quanto sopra, il debug della comunicazione basata su pipe è più semplice del debug della memoria condivisa.

Una piccola differenza è che i file fifos sono visibili direttamente nel file system mentre le aree di memoria condivisa richiedono strumenti speciali come ipcs per la loro gestione nel caso in cui, ad es. crea un segmento di memoria condivisa ma la tua app muore e non si ripulisce da sola (lo stesso vale per i semafori e molti altri meccanismi di sincronizzazione che potresti dover utilizzare insieme alla memoria condivisa).

La memoria condivisa offre anche un maggiore controllo sull'utilizzo di risorse e sull'uso delle risorse: entro i limiti consentiti dal sistema operativo, sei tu a decidere quanta memoria allocare e come utilizzarla. Con i tubi, il sistema operativo controlla le cose automaticamente, così ancora una volta perdi una certa flessibilità ma sei sollevato da molto lavoro.

Riassunto dei punti più importanti: tubi per comunicazione one-to-one, meno codifica e gestione del sistema operativo, memoria condivisa per molti-a-molti, controllo più manuale sulle cose ma a costo di più lavoro e debug più difficile.

+1

Una piccola correzione. I pipe possono anche essere creati in modo anonimo tramite il 'pipe' syscall. La memoria condivisa può anche risiedere nel filesystem non privatamente 'nmap'ing un file. – johannes

+1

I FIFO supportano anche la comunicazione molti-a-uno (il "sommario" implica solo uno-a-uno). –

+0

@MarkRajcok Sebbene possibile, in pratica avere molti scrittori con pipe non è molto utile poiché non esiste un meccanismo integrato per gestire la sincronizzazione a livello di messaggio - qualunque cosa mandino gli scrittori sarà interfogliata in modo imprevedibile. Anche se la sincronizzazione esterna è implementata, la soluzione migliore potrebbe essere il blocco esclusivo tra gli scrittori mentre ogni messaggio viene inviato, il che non è efficace in quanto solo uno può scrivere nello stesso momento. –

Problemi correlati