mkfifo - A E / S do disco realmente ocorre?

6

Eu tenho 2 aplicativos:

  • Produtor (N instâncias)
  • Consumidor (1 instância)

Eu atualmente escrevo intermediário resultados dos produtores, e então o consumidor lê esses arquivos do disco e produz um final resultado.

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 subsequente aqui . Isso parece ótimo, mas o que eu não posso determinar é como isso é realmente implementado? A fila FIFO está apenas sendo armazenada em buffer por meio de um arquivo? Se assim for, isso provavelmente não me ajudaria. Eu gostaria de o conteúdo para transmitir "através da memória" inteiramente sem utilizar o disco. Talvez isso não seja possível nos processos?

    
por Jmoney38 08.09.2014 / 17:10

2 respostas

8

Sem disco i / o (exceto talvez ao navegar pelo sistema de arquivos para abrir o arquivo fifo.)

De a página man fifo do Linux (7) :

A FIFO special file (a named pipe) is similar to a pipe, except that it is accessed as part of the filesystem. [...] When processes are exchanging data via the FIFO, the kernel passes all data internally without writing it to the filesystem. Thus, the FIFO special file has no contents on the filesystem; the filesystem entry merely serves as a reference point so that processes can access the pipe using a name in the filesystem.

    
por 08.09.2014 / 17:32
2

Realmente não importa se o seu resultado é realmente feito em disco ou não, porque se houver memória suficiente disponível, ele será armazenado em cache e nenhum IO em disco será executado. Pelo contrário, se for memória suportada e não houver memória suficiente disponível, ela poderá ser trocada em disco.

Se eu tivesse que adivinhar, eu 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, desde que você tenha vários produtores, suas gravações precisam ser atômicas para que não fiquem intercaladas na fila. Consulte man 7 pipe para obter detalhes sobre como garantir que uma gravação seja atômica.

    
por 08.09.2014 / 17:25

Tags