IPC senza blocco in Linux per processori multi-core

9

Sto cercando di trovare un modo per scrivere un'applicazione con IPC privo di blocco su Linux, in C, con processori multi-core.

Supponiamo di avere il processo 1 e il processo 2 che scrivono su un FIFO o su una memoria condivisa. Quindi il processo 3 e il processo 4 leggeranno da quella memoria condivisa o FIFO.

Questo è possibile con un algoritmo lock-free?

La tua guida è molto apprezzata.

    
posta poly 21.07.2012 - 01:48
fonte

3 risposte

2

Ho visto riferimento all'utilizzo di buffer ad anello e accesso controllato ai puntatori di posizione per eliminare o ridurre la necessità di blocchi. Tuttavia, non elimina la necessità di attese, e dovrebbe funzionare solo allora un buffer circolare ha uno scrittore e un lettore. Nel tuo caso avresti bisogno di almeno due buffer.

Il meccanismo, a quanto ho capito, è:

  • lo scrittore attende finché non c'è uno slot aperto (last + 1! = current)
  • scrittore scrive la voce nel ring buffer.
  • il writer aggiorna l'ultimo puntatore alla voce.

  • il lettore attende finché non vi è una voce disponibile nel buffer circolare (last! = current).

  • voce dei processi del lettore.
  • il lettore incrementa il puntatore corrente.

A seconda del tempo di attesa utilizzato, è possibile aggiungere la latenza per i nuovi elementi in una coda vuota o masterizzare molti cicli della CPU nel ciclo di attesa. L'ordine di aggiornamento del puntatore e la rigorosa separazione dell'accesso in scrittura è fondamentale per il corretto funzionamento. Lo scrittore è autorizzato a scrivere la voce del ring buffer prima di incrementare il puntatore per renderlo disponibile al lettore.

    
risposta data 21.07.2012 - 16:41
fonte
1

Sì, è possibile. Utilizziamo uno degli algoritmi della coda senza blocco nel nostro progetto. Ma questi algoritmi non sono davvero ovvi. Se vuoi capirli in profondità, dovresti essere pronto a trascorrere un paio di mesi per questo.

    
risposta data 27.07.2012 - 06:26
fonte
0
La comunicazione

Inter processo non può essere bloccata. Solo inter-thread. Per quanto ne so.

    
risposta data 21.07.2012 - 10:33
fonte

Leggi altre domande sui tag