IPC in C sotto linux

1

Sto creando una soluzione di messaggistica con followingsup: tutti i messaggi vengono salvati su un DB, due o più processi di lettura leggeranno da questo DB e inviano dati ad altri processi che lo invieranno attraverso la rete.

Il mio approccio è illustrato di seguito,

I seguenti hanno 4 processi di invio con 4 fifos e 2 lettori con 2 fifos

reader0 ← legge i dati dal DB
reader1 ← legge i dati dal DB

invio di parte
network_handler0 ← network_handler_fifo0 ← reader0
network_handler1 ← network_handler_fifo1 ← reader1
network_handler2 ← network_handler_fifo2 ← reader0
network_handler3 ← network_handler_fifo3 ← reader1

ricezione parte
network_handler0 → reader_fifo0 → reader0 → scrivere su DB
network_handler1 → reader_fifo1 → reader1 → scrivere su DB
network_handler2 → reader_fifo0 → reader0 → scrivere su DB
network_handler3 → reader_fifo1 → reader1 → write to DB

Ho pochi problemi con questa configurazione, e tieni presente che il numero di processi potrebbe essere maggiore di quello basato sull'ambiente, quindi potrei renderlo 20 lettori e 10 network_handlers o potrebbe farlo come mostrato sopra.

  1. La dimensione del buffer è 64K e la dimensione del messaggio è 200k, è abbastanza piccola da rendere la scrittura / lettura a / da fifo atomico?

  2. Come possono rendere i processi consapevoli l'uno dell'altro, per esempio, il lettore 0 scrive su network_handler_fifo0 e network_handler_fifo2, come posso farlo iniziare a scrivere su altri fifo se quelli attuali sono pieni oi loro network_handler sono dea d

  3. Ho pensato di far scrivere al lettore una scrittura più generale per iscritto, quindi ad esempio scrive su tutti i network fifos usando il meccanismo di blocco e smetto di scrivere su quello che è morto, non l'ho usato come blocco il meccanismo potrebbe rallentare.

BTW, ogni network_handler è un'associazione SCTP, quindi network_handler0 è l'associazione 0, network_handler1 è l'associazione 1 e così via.

Ogni idea è apprezzata. Voglio dire anche se devo cambiare la configurazione sopra.

    
posta poly 20.05.2012 - 18:02
fonte

2 risposte

1

Innanzitutto, nulla è atomico in situazioni di multielaborazione. Non aspettarti di essere in grado di ignorare la sincronizzazione solo perché stai utilizzando un carico utile relativamente piccolo. (anche un payload di 4 byte ha bisogno di protezione).

Potresti dare un'occhiata ai sistemi esistenti per questo, ti consiglio ZeroMQ che ti offre tutto il necessario per questa domanda.

    
risposta data 23.08.2012 - 18:35
fonte
1

Sembra che il tuo progetto potrebbe essere un client multithread / server simile all'esempio Progetto di codice collegato. Per motivi di efficienza, potresti prendere in considerazione l'utilizzo di un pool di thread. Dovrai proteggere le tue risorse da accessi multipli anche se avessi a che fare con un solo byte, per non parlare di un FIFO. Non sono sicuro dalla tua descrizione se si tratta di un FIFO hardware o software, ma mi aspetto che tu debba controllare l'accesso ad esso per ogni messaggio.

Andrew Tannebaum usava raccomandare di usare le code per le comunicazioni e i processi per la concorrenza. C'è una ragione per cui il lettore e il mittente sono due processi separati? Hai in realtà processi separati o thread separati (cioè i thread fanno parte di un processo e condividono memoria)?

Il classico problema di lettori e scrittori fornisce alcuni consigli su cosa fare con le letture e le scritture per il tuo database. Il problema non è facile, ma è spiegato a strati e la soluzione fornita su Wikipedia è degna di emulazione. Uno dei miei professori della scuola elementare ha una pagina di lettori e scrittori bene, e mostra più soluzioni. Fornisce una raccolta di esempi basati su pthreads (compreso il consumatore / produttore problema).

È anche inclusa una libreria di wrapper sem.c / .h per pthreads che consente una traduzione più semplice degli algoritmi di esempio che usano P () e V () che potresti trovare sparsi su Internet. P () e V () sono funzioni semaforo notate dallo scienziato informatico olandese Edsger Dijkstra selezionato in base a parole olandesi come spiegato su Wikipedia . A volte le funzioni di semaforo sono denominate signal () e wait (), che sebbene siano più chiare per gli anglofoni, differiscono da quelle utilizzate in molte ricerche.

Se trovi che hai un processo morto che devi abbandonare, se usi i FIFO hardware, sembra che li perdi anche tu. Se una risorsa di rete diminuisce, è qualcosa che richiede sicuramente attenzione. I timeout sono una sorta di rovina dell'esistenza che rende gli algoritmi sonori ed eleganti in implementazioni confuse e inaffidabili.

WRT gli aspetti di streaming, da qualche parte nel tuo algoritmo potresti voler eliminare pacchetti in modo uniforme. Ho trovato un articolo di ricercatori del MIT e Brown sullo streaming che potrebbe interessare.

    
risposta data 25.09.2012 - 00:30
fonte

Leggi altre domande sui tag