2011-03-03 8 views
5

Ho un'applicazione di sistema, che viene eseguita come raccolta su 12 processi su Unix. Esiste un processo di monitoraggio, che scambia dati con altri 11 processi.Quale IPC è più efficiente qui?

Il requisito IPC è di comunicare questi 11 processi con il processo di monitoraggio, progettato nel modo più efficiente in termini di esecuzione. Ragazzi, potete valutare le due opzioni sottostanti o suggerirne una migliore.

1) dispone di una comunicazione socket UDP, in cui questi 11 processi invieranno i dati al processo di monitoraggio a intervalli periodici. il processo di monitoraggio sta solo ascoltando e acquisendo informazioni che sono abbastanza buone.

O

2) avere un'implementazione di memoria condivisa. quindi ci sono 11 segmenti di memoria condivisa, in cui ciascuno è condiviso tra 2 processi (processo di processo e monitoraggio).

Per la memoria condivisa, sembra più veloce, ma c'è un blocco/sincronizzazione necessaria, dove come in UDP Il copie del kernel i dati dallo spazio di memoria di un processo all'altro.

Qualcuno può fornire più input per aiutare a valutare meglio i due metodi. ? Grazie.

+3

Intendi davvero un socket UDP, o intendi socket di dominio Unix? –

risposta

5

Coordinare la memoria condivisa è complicato. Il genitore deve sapere quando leggere quale parte di ciascuno degli 11 segmenti di memoria condivisa e far sapere al bambino quando i dati sono stati letti in modo tale che parte della memoria condivisa possa essere riutilizzata, ecc. Quindi, anche se la copia può essere più veloce, il resto della coordinazione (forse usando i set di semafori - forse con 22 semafori, uno per ogni direzione degli 11 canali di comunicazione) significa che quasi certamente troverai un meccanismo basato su descrittore di file molto più facile da codificare. Il select() o poll() o le chiamate di sistema varianti possono essere utilizzati per indicare quando sono presenti dati per il master da leggere. E il kernel si occupa di tutti i problemi di pianificazione e controllo del flusso e così via.

Quindi, utilizzare i socket del dominio Unix a meno che non si possa davvero dimostrare che si otterrà un beneficio dalle prestazioni della versione della memoria condivisa. Ma aspettati di perdere alcuni capelli (e alcuni dati) per far sì che l'implementazione della memoria condivisa sia corretta. (Puoi dimostrare se c'è un vantaggio nell'uso della memoria condivisa con un sistema crudo e impreciso, probabilmente non entrerai in produzione con un sistema impropriamente sincronizzato.)

2

Dipende molto dalla quantità di dati che i processi devono condividere tra loro. Se passeranno molti dati (ad esempio megabyte o gigabyte) passati avanti e indietro, allora la memoria condivisa sarà il modo più efficiente per andare. Se ci sarà solo una quantità relativamente piccola di dati (kilobyte o forse qualche megabyte), è probabile che sia preferibile un approccio basato sui socket, perché l'efficienza non conta molto, ed evitare la memoria condivisa renderà il tuo sistema più robusto e più facile da sviluppare e eseguire il debug.

Inoltre, alcuni kernel supportano la copia zero-copy, nel qual caso l'invio di pacchetti UDP da un processo a un altro potrebbe non richiedere affatto che il kernel copi i dati, ma semplicemente rimappa le pagine MMU sottostanti nel processo di destinazione . Se questo è il caso, l'approccio delle prese ti darà il meglio di entrambi i mondi (efficienza e robustezza).

+1

1) I dati saranno nell'ordine di media: 30 kb/min (casi di carico circa 60 kb/min).2) la facilità di codifica non è un problema in quanto abbiamo tempo e impegno a disposizione per renderlo maggiormente orientato alle prestazioni. – sbr

+2

60 kilobyte al minuto è un carico trascurabile per un computer moderno (anche per un moderno computer embedded). Se il tuo carico è veramente così basso, non importa quanto implementerai le cose; otterrete buone prestazioni con quasi ogni ragionevole meccanismo. Non impiegherei troppe ore di programmazione su un meccanismo complicato quando l'unico vantaggio sarebbe che potresti vedere lo 0,01% di utilizzo della CPU anziché lo 0,02%. Se fossi in me, userei solo socket TCP (o UNIX). –

1

Nella consegna UDP non è garantita e ci sono periodi in cui i pacchetti vengono rilasciati anche nelle comunicazioni localhost. Quindi gli MMF probabilmente sarebbero migliori.