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.
fonte
2012-03-14 13:30:04
Si noti che le scritture sono solo atomiche se non superiori a dimensioni PIPE_BUF. –