53 votes

Pourquoi utiliser un tube nommé au lieu d'un fichier ?

J'ai récemment lu un article sur les tuyaux nommés, et je ne comprenais pas pourquoi ils existaient.
J'ai lu quelque part que l'utilisation d'un tube nommé prenait moins de temps que l'utilisation d'un fichier.

Pourquoi en est-il ainsi ?
Les tuyaux nommés doivent également être stockés en mémoire (et éventuellement échangés, tout comme les fichiers).
Pour autant que je sache, ils doivent obtenir un inode qui doit être référencé par le répertoire courant, tout comme les fichiers. Ils doivent également être supprimés par le programmeur, tout comme les fichiers.

Où se situe donc l'avantage ?

59voto

c0rp Points 9110

Presque tout dans Linux peut être considéré comme un fichier mais la principale différence entre un fichier régulier et un tuyau nommé est qu'un tuyau nommé est un exemple particulier de fichier qui n'a pas de contenu sur le système de fichiers.

Voici une citation de man fifo :

Un fichier spécial FIFO (un tube nommé) est similaire à un tube, sauf qu'il est accessible dans le cadre du système de fichiers. Il peut être ouvert par plusieurs processus en lecture ou en écriture. Lorsque des processus échangent des données via la 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 pas de contenu dans le système de fichiers ; l'entrée dans le système de fichiers sert simplement de point de référence pour que les processus puissent accéder au tuyau en utilisant un nom dans le système de fichiers.

Le noyau maintient exactement un objet pipe pour chaque fichier spécial FIFO ouvert par au moins un processus. La FIFO doit être ouverte aux deux extrémités (lecture et écriture) avant que les données puissent être transmises. Normalement, l'ouverture de la FIFO se bloque jusqu'à ce que l'autre extrémité soit également ouverte.

En fait, un tuyau nommé ne fait rien jusqu'à ce qu'un processus le lise ou l'écrive. Il ne prend pas de place sur le disque dur (à l'exception d'un peu de méta-information), il n'utilise pas le processeur.

Vous pouvez le vérifier en procédant comme suit :

Créer un tuyau nommé

$ mkfifo /tmp/testpipe

Allez dans un répertoire, par exemple /home/user/Documents et gzip tout ce qu'il contient, en utilisant named pipe.

$ cd /home/user/Documents
$ tar cvf - . | gzip > /tmp/testpipe &
[1] 28584

Vous devriez voir ici le PID du processus gzip. Dans notre exemple, il s'agit de 28584.

Vérifiez maintenant ce que fait ce PID

$ ps u -P 28584
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
c0rp     28584  0.0  0.0  29276  7800 pts/8    S    00:08   0:00 bash

Vous verrez qu'il utilise pas de ressources . 0 % d'utilisation du processeur, 0 % d'utilisation de la mémoire.

Vérifier l'intuition concernant l'utilisation de l'espace disque

$ du -h /tmp/testpipe
0   testpipe

Et encore 0 rien. Le tuyau d'essai pourrait être réutilisé si nécessaire.

N'oubliez pas de tuer gzip, en utilisant kill -15 28584 . Et supprimez notre tuyau nommé en utilisant rm /tmp/testpipe

Exemples d'utilisation

Vous pouvez presque tout rediriger à l'aide d'un tube nommé. Voici un exemple mandataire d'une ligne .

En outre en voici un autre bonne explication de l'utilisation des tuyaux nommés. Vous pouvez configurer deux processus sur un serveur pour qu'ils communiquent à l'aide d'un tube nommé au lieu de la pile TCP/IP. C'est beaucoup plus rapide et cela ne charge pas les ressources du réseau. Par exemple, votre serveur Web peut communiquer avec la base de données directement à l'aide d'un tube nommé, au lieu d'utiliser le protocole localhost ou à l'écoute d'un port.

19voto

GARCIN David Points 349

Il est vrai que vous n'utiliserez pas la mémoire du système, mais le fait que vous n'utilisiez pas le processeur dans votre exemple est uniquement dû au fait que vous ne lisez pas le tuyau et que le processus est donc en attente.

Prenons l'exemple suivant :

mkfifo /tmp/testpipe
tar cvf - / | gzip > /tmp/testpipe

Ouvrez maintenant une nouvelle console et exécutez :

watch -n 1 'ps u -P $(pidof tar)

Et dans une troisième console :

cat /tmp/testpipe > /dev/null

Si vous regardez le cmd de surveillance (2ème terme), il montrera une augmentation de la consommation de cpu !

10voto

Jared Points 21

Voici un cas d'utilisation où les tuyaux nommés peuvent vous faire gagner beaucoup de temps en supprimant les E/S.

Supposons que vous ayez un BigFile, par exemple 10G.

Vous avez également des scissions de ce BigFile par morceaux de 1G, BigFileSplit_01 à BigFile_Split_10.

Vous avez maintenant un doute sur l'exactitude de BigFileSplit_05

Naïvement, sans tuyaux nommés, vous créeriez une nouvelle division à partir de BigFile et compareriez :

dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

Avec des tuyaux nommés, vous feriez

mkfifo BigFileSplitOrig_05
dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1 &
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

À première vue, cela ne semble pas être une grande différence... mais avec le temps, la différence est énorme !

Option 1 :

  • dd : lecture 1G / écriture 1G (1)
  • diff : lire 2G
  • rm : libérer les clusters alloués / supprimer l'entrée du répertoire

Option 2 :

  • dd : rien ! (va au tuyau nommé)
  • diff : lire 2G
  • rm : pas de cluster alloué à gérer (nous n'avons rien écrit dans le système de fichiers) / supprimer l'entrée du répertoire

En résumé, le tube nommé permet d'économiser une lecture et une écriture de 1G, ainsi qu'un nettoyage du système de fichiers (puisque nous n'avons rien écrit dans le système de fichiers, à part le nœud fifo vide).

Ne pas faire d'entrées-sorties, surtout des écritures, est également une bonne chose pour éviter l'usure de vos disques. C'est encore plus intéressant lorsque vous travaillez avec des disques SSD, car ils ont un nombre limité d'écritures avant que les cellules ne meurent.

(1) Évidemment, une autre option serait de créer ce fichier temporaire en RAM, par exemple si /tmp est monté en RAM (tmpfs). Néanmoins, vous seriez limité par la taille du disque RAM, alors que l'astuce du "named pipe" n'a aucune limite.

1voto

Vous pouvez laisser un programme immobile et écouter un tuyau nommé pour un événement extérieur. Dès que l'événement extérieur se produit (par exemple, l'arrivée de nouvelles données), il peut être détecté par un autre programme. il peut être détecté par un autre programme qui, à son tour, ouvre le tuyau pour l'écriture, en écrivant les données pertinentes de l'événement dans le tuyau. Lorsque l'instruction de fermeture est émise, le programme d'écoute reçoit le flux de données par le biais d'une instruction de lecture et est prêt à traiter ce qu'il a reçu. N'oubliez pas de fermer le tuyau après avoir lu le contenu. Le programme d'écoute peut également renvoyer les résultats de son traitement par l'intermédiaire du même tuyau ou d'un autre tuyau nommé. De telles communications inter-programmes sont parfois très parfois très pratiques.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X