IPC senza blocco in Linux per processori multi-core


9

Sto cercando di trovare un modo per scrivere un'applicazione con IPC senza lock 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 senza blocco?

La tua guida è molto apprezzata.


Potete fornire alcune indicazioni o un riferimento ad alcuni documenti esterni relativi alla comunicazione senza blocco? Cosa si intende esattamente con questo termine?
Giorgio,


Se ho capito bene, il problema sono le scritture simultanee (1, 2) e le letture simultanee (3, 4). La sincronizzazione tra scrittori e lettori è già coperta dall'algoritmo descritto nella pagina collegata.
Giorgio,

Risposte:


2

Ho visto il riferimento all'uso dei ring buffer e l'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 quando un buffer ad anello ha uno scrittore e un lettore. Nel tuo caso avrai bisogno di almeno due buffer.

Il meccanismo come ho capito è:

  • lo scrittore aspetta che ci sia uno slot aperto (ultimo + 1! = corrente)
  • lo scrittore scrive la voce nel buffer dell'anello.
  • lo scrittore aggiorna il puntatore dell'ultima voce.

  • il lettore attende fino a quando non è disponibile una voce nel buffer dell'anello (ultimo! = corrente).

  • il lettore elabora la voce.
  • il lettore incrementa il puntatore corrente.

A seconda del tempo di attesa utilizzato, ciò può aggiungere 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 affinché questo funzioni. Il writer può solo scrivere la voce del buffer dell'anello prima di incrementare il puntatore per renderlo disponibile al lettore.


E ho trovato questo anche su Wikipedia, sembra interessante, non l'ho provato anche se concurrencykit.org
poli

1

Si è possibile. Nel nostro progetto utilizziamo uno degli algoritmi della coda senza blocchi. Ma questi algoritmi non sono davvero ovvi. Se vuoi capirli in profondità, dovresti essere pronto a spendere un paio di mesi per questo.


0

La comunicazione tra processi non può essere senza blocco. Solo inter-thread. Per quanto ne so.


Penso che "lock free" sia un attributo del meccanismo, non dell'utente. La differenza tra thread e processi diventa piuttosto sottile quando aggiungi cose come la memoria condivisa al mix.
Tylerl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.