mkfifo - A E / S de disco realmente ocorre?


10

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?

Respostas:


10

Não há E / S de disco (exceto talvez ao navegar pelo sistema de arquivos para abrir o arquivo fifo.)

Na página do manual Linux fifo (7) :

Um arquivo especial FIFO (um pipe nomeado) é semelhante a um pipe, exceto pelo fato de ser acessado como parte do sistema de arquivos. [...] Quando os processos estão trocando dados via FIFO, o kernel passa todos os dados internamente sem gravá-los no sistema de arquivos. Portanto, o arquivo especial FIFO não possui conteúdo no sistema de arquivos; a entrada do sistema de arquivos serve apenas como um ponto de referência para que os processos possam acessar o canal usando um nome no sistema de arquivos.


Perfeito. Eu li a página de manual do mkfifo, mas não pensei em procurar uma página no "fifo" - Obrigado!
Jmoney38

3

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 pipepara obter detalhes sobre como garantir que uma gravação seja atômica.

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.