Eu tenho 2 aplicativos:
- Produtor (N instâncias)
- Consumidor (1 instância)
Atualmente, escrevo resultados intermediários dos produtores e, em seguida, o consumidor lê esses arquivos do disco e produz um resultado final .
Eu gostaria de minimizar essa E / S "transmitindo" as saídas dos produtores diretamente para o consumidor.
Me deparei com pipes nomeados (mkfifo) e um exemplo subseqüente aqui . Parece ótimo, mas o que não consigo determinar é como isso é realmente implementado? A fila FIFO está sendo armazenada no buffer através de um arquivo? Nesse caso, isso provavelmente não me ajudaria. Eu gostaria que o conteúdo fosse transmitido "através da memória" inteiramente sem utilizar o disco. Talvez isso não seja possível entre os processos?
Realmente não importa se o resultado é realmente suportado por disco ou não, porque, se houver memória suficiente disponível, ele será armazenado em cache e não será executada nenhuma E / S de disco real. Pelo contrário, se for suportado por memória e não houver memória suficiente disponível, poderá ser trocado para o disco.
Se eu fosse adivinhar, diria que o pipe é realmente baseado em memória, mas isso só deve mudar se os dados na fila são preservados entre as reinicializações.
O que você deve cuidar é que, como você tem vários produtores, suas gravações precisam ser atômicas, para que não sejam intercaladas na fila. Consulte
man 7 pipe
para obter detalhes sobre como garantir que uma gravação seja atômica.fonte