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.
c
linux
multithreading
poli
fonte
fonte
Respostas:
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 atualiza o último ponteiro de entrada.
o leitor aguarda até que haja uma entrada disponível no buffer de toque (último! = 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.
fonte
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.
fonte
A comunicação entre processos não pode ser bloqueada. Somente inter-thread. Até onde eu saiba.
fonte