mkfifo - Des E / S disque se produisent-elles réellement?

10

J'ai 2 applications:

  • Producteur (N instances)
  • Consommateur (1 instance)

J'écris actuellement les résultats intermédiaires des producteurs, puis le consommateur lit ces fichiers sur le disque et produit un résultat final .

Je voudrais minimiser ces E / S en "diffusant" les sorties des producteurs directement vers le consommateur.

Je suis tombé sur des tuyaux nommés (mkfifo) et un exemple ultérieur ici . Cela a l'air génial, mais ce que je ne peux pas déterminer, c'est comment cela est réellement mis en œuvre? La file d'attente FIFO est-elle simplement mise en mémoire tampon dans un fichier? Si c'est le cas, cela ne m'aiderait probablement pas. Je voudrais que le contenu soit diffusé "à travers la mémoire" sans utiliser le disque. Peut-être que ce n'est pas possible à travers les processus?

Jmoney38
la source

Réponses:

10

Aucune entrée / sortie de disque (sauf peut-être lors de la navigation dans le système de fichiers pour ouvrir le fichier fifo.)

Depuis la page de manuel Linux fifo (7) :

Un fichier spécial FIFO (un canal nommé) est similaire à un canal, sauf qu'il est accessible dans le cadre du système de fichiers. [...] Lorsque les processus échangent des données via le FIFO, le noyau transmet toutes les données en interne sans les écrire dans le système de fichiers. Ainsi, le fichier spécial FIFO n'a aucun contenu sur le système de fichiers; l'entrée du système de fichiers sert simplement de point de référence afin que les processus puissent accéder au canal en utilisant un nom dans le système de fichiers.

Mark Plotnick
la source
Parfait. J'ai lu la page de manuel de mkfifo, mais je n'ai pas pensé à chercher une page sur "fifo" - Merci!
Jmoney38
3

Peu importe que votre résultat soit réellement sauvegardé sur disque ou non, car si suffisamment de mémoire est disponible, elle sera de toute façon mise en cache et aucune E / S disque réelle n'est effectuée. Au contraire, s'il est sauvegardé en mémoire et qu'il n'y a pas assez de mémoire disponible, il pourrait être échangé sur le disque.

Si je devais deviner, je dirais que le canal est en fait basé sur la mémoire, mais cela ne devrait changer que si les données en file d'attente sont préservées entre les redémarrages.

Ce que vous devez prendre en compte, c'est que puisque vous avez plusieurs producteurs, vos écritures doivent être atomiques afin qu'elles ne soient pas entrelacées dans la file d'attente. Voir man 7 pipepour plus de détails sur la façon de garantir qu'une écriture est atomique.

pqnet
la source