IPC sem bloqueio no Linux para processadores com vários núcleos


9

Estou tentando encontrar uma maneira de escrever um aplicativo com IPC sem bloqueio no Linux, em C, com processadores de vários núcleos.

Vamos supor que eu tenho o processo 1 e o processo 2 que gravam em um FIFO ou na memória compartilhada. Em seguida, o processo 3 e o processo 4 lerão a partir dessa memória compartilhada ou FIFO.

Isso é possível com um algoritmo sem bloqueio?

Sua orientação é muito apreciada.


Você pode dar algumas indicações ou referência a alguma documentação externa referente à comunicação sem bloqueio? O que se entende exatamente com esse termo?
Giorgio


Se bem entendi, o problema são as gravações simultâneas (1, 2) e as leituras simultâneas (3, 4). A sincronização entre escritores e leitores já está coberta pelo algoritmo descrito na página vinculada.
Giorgio

Respostas:


2

Vi referências ao uso de buffers de anel e acesso controlado aos ponteiros de localização para eliminar ou reduzir a necessidade de bloqueios. Porém, ele não elimina a necessidade de espera e deve funcionar apenas quando um buffer de anel tiver um escritor e um leitor. No seu caso, você precisaria de pelo menos dois buffers.

O mecanismo como eu o entendo é:

  • O escritor espera até que haja um slot aberto (último + 1! = atual)
  • escritor escreve entrada no buffer de anel.
  • O escritor atualiza o último ponteiro de entrada.

  • o leitor aguarda até que haja uma entrada disponível no buffer de toque (último! = atual).

  • o leitor processa a entrada.
  • leitor incrementa o ponteiro atual.

Dependendo do tempo de espera usado, isso pode adicionar latência para novos itens em uma fila vazia ou gravar muitos ciclos da CPU no loop de espera. A ordem de atualização do ponteiro e a separação estrita do acesso de gravação são críticas para que isso funcione. O gravador só pode gravar a entrada do buffer de anel antes de incrementar o ponteiro para disponibilizá-lo ao leitor.


E eu encontrei um presente também na wikipedia, parece interessante, não tentei embora concurrencykit.org
poli

1

Sim é possivel. Usamos um dos algoritmos da fila sem bloqueio em nosso projeto. Mas esses algoritmos não são realmente óbvios. Se você quer entendê-los em profundidade, deve estar pronto para passar alguns meses.


0

A comunicação entre processos não pode ser bloqueada. Somente inter-thread. Até onde eu saiba.


Eu acho que "lock free" é um atributo do mecanismo, não do usuário. A diferença entre threads e processos torna-se bastante reduzida quando você adiciona coisas como memória compartilhada à mistura.
22612 Tylerl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.