31 votes

Bash De Manutention Des Tubes

Personne ne sait comment bash gère l'envoi de données à l'aide de tuyaux?

cat file.txt | tail -20

Cette commande imprimer tout le contenu de file.txt dans un tampon, qui est ensuite lu par la queue? Ou est-ce à la commande, disons, d'imprimer le contenu de file.txt ligne par ligne, puis une pause au niveau de chaque ligne de la queue à traiter, puis demander plus de données?

La raison pour laquelle je demande, c'est que je suis en train d'écrire un programme sur un dispositif intégré qui, en gros, effectue une séquence d'opérations sur des bouts de données, d'où la sortie d'une opération, est d'envoyer comme l'entrée de la prochaine opération. Je voudrais savoir comment linux (bash) gère ce donc merci de me donner une réponse générale, pas spécialement ce qui se passe quand je lance le "chat file.txt | queue -20".

Merci d'avance pour vos réponses!

EDIT: Shog9 souligné pertinentes de l'Article de Wikipédia n'en est pas de me conduire directement à l'article, mais il m'a permis de trouver ceci: http://en.wikipedia.org/wiki/Pipeline_%28Unix%29#Implementation qui avait eu l'information que je cherchais.


Je suis désolé de ne pas me faire clair. Bien sûr, vous êtes à l'aide d'un tuyau et bien sûr, vous êtes à l'aide de l'entrée standard stdin et stdout des parties respectives de la commande. J'avais supposé que c'était trop évident pour l'état.

Ce que je demande, c'est comment cela est géré/mise en œuvre. Puisque les deux programmes ne peuvent pas s'exécuter à la fois, comment les données sont envoyées depuis l'entrée standard vers la sortie standard? Qu'advient-il si le premier programme génère des données nettement plus rapide que le deuxième programme? Le système d'exécution de la première commande jusqu'à ce que ce soit mis fin ou c'est la sortie standard de la mémoire tampon est pleine, et de passer ensuite dans le programme suivant, et ainsi de suite dans une boucle jusqu'à ce que plus de données sont de gauche à être traitées, ou est-il plus compliqué mécanisme?

55voto

postfuturist Points 9836

J'ai décidé d'écrire un peu plus d'explication détaillée.

La "magie" ici réside dans le système d'exploitation. Les deux programmes ne commencer à peu près au même moment, et d'exécuter en même temps (le système d'exploitation attribue des tranches de temps sur le processeur à exécuter) comme tous les autres simultanément les processus en cours d'exécution sur votre ordinateur (y compris l'application terminal et le noyau). Donc, avant que toutes les données sont transmises, les processus sont en train de faire ce que l'initialisation nécessaire. Dans votre exemple, la queue est l'analyse de la '-20' argument et le chat est l'analyse de la 'file.txt l'argument et de l'ouverture du fichier. À un certain point, la queue va en arriver au point où elle en a besoin en entrée et qu'il va dire le système d'exploitation qu'il est en attente d'entrée. À un autre moment (avant ou après, il n'a pas d'importance) le chat va commencer à passer des données pour le système d'exploitation à l'aide de la sortie standard stdout. Cela va dans un tampon dans le système d'exploitation. La prochaine fois que la queue obtient une tranche de temps du processeur après certaines données a été mis en mémoire tampon par chat, il va récupérer une certaine quantité de données (ou le tout) ce qui laisse le tampon sur le système d'exploitation. Lorsque le tampon est vide, à un certain point, la queue va avoir à attendre pour le chat à la sortie de plus de données. Si le chat a une sortie de données beaucoup plus rapides que la queue est de la manipulation, la mémoire tampon se développer. chat finira par être fait de la sortie des données, mais la queue sera toujours traitement, de sorte que le chat va se fermer et queue de traiter toutes les données restantes dans la mémoire tampon. Le système d'exploitation sera le signal de queue quand il leur est le plus de données entrantes avec un EOF. Queue de traiter le reste des données. Dans ce cas, la queue est probablement juste de recevoir toutes les données dans une mémoire tampon circulaire de 20 lignes, et quand il est signalée par le système d'exploitation qu'il n'y est pas plus de données entrantes, il exporte ensuite les vingt dernières lignes de son propre stdout, qui est affiché dans le terminal. Depuis la queue est beaucoup plus simple de programme de chat, il va probablement passer la plupart du temps d'attente pour chat pour mettre les données dans la mémoire tampon.

Sur un système avec plusieurs processeurs, les deux programmes ne seront pas seulement le partage de l'alternance de tranches de temps sur le même processeur core, mais probablement en cours d'exécution au même moment sur des cœurs.

Pour entrer dans un peu plus en détail, si vous ouvrez une sorte de moniteur de processus (système d'exploitation spécifique) comme "haut" dans Linux, vous verrez une liste de tous les processus en cours d'exécution, dont la plupart sont de l'utilisation efficace de 0% du processeur. La plupart des applications, sauf si elles sont à croquer des données, passent la plupart de leur temps à ne rien faire. C'est bon, parce qu'il permet à d'autres procédés d'avoir libre accès au processeur en fonction de leurs besoins. Ceci est accompli en gros de trois façons. Un processus peut obtenir un sommeil(n) style instruction où il raconte essentiellement le noyau d'attendre les n millisecondes avant de lui donner une autre tranche de temps pour travailler avec. Le plus souvent un programme doit attendre quelque chose à partir d'un autre programme, comme la "queue" en attente de plus de données pour entrer dans la mémoire tampon. Dans ce cas, le système d'exploitation va se réveiller le processus lorsque plus de données seront disponibles. Enfin, le noyau peut préempter un processus dans le milieu de l'exécution, en donnant quelques processeur tranches de temps à d'autres processus. 'cat' et de la 'queue' sont de simples programmes. Dans cet exemple, la queue passe la plupart de son temps à attendre pour plus de données sur de la mémoire tampon, et le chat passe le plus clair de son temps à attendre pour le système d'exploitation de récupérer les données du disque dur. Le goulot d'étranglement est la vitesse (ou la lenteur) du support physique que le fichier est stocké. Que délai perceptible que vous pourriez détecter lorsque vous exécutez cette commande pour la première fois, c'est le temps qu'il faut pour les têtes de lecture sur le lecteur de disque de chercher à la position sur le disque dur où "file.txt' est. Si vous exécutez la commande une seconde fois, le système d'exploitation va probablement être le contenu de file.txt dans la mémoire cache, et vous ne sera probablement pas voir tout délai perceptible (à moins que file.txt est très grand, ou le fichier n'est plus mis en cache.)

La plupart des opérations que vous effectuez sur votre ordinateur sont IO lié, c'est à dire que vous êtes habituellement en attente de données à venir à partir de votre disque dur ou à partir d'un périphérique réseau, etc.

1voto

David Schlosnagle Points 2113

Shog9 déjà fait référence à l'article de Wikipedia, mais l' (Unix)#mise en Œuvre">la mise en œuvre de la section a des détails que vous voulez. La mise en œuvre de base est bornée tampon.

0voto

Mike Stone Points 21293

le chat, il suffit d'imprimer les données de la norme, ce qui se passe pour être redirigé vers le standard de la queue. Ceci peut être vu dans la page de manuel de bash.

En d'autres termes, il n'y a pas de pause en cours, la queue est juste de la lecture de la norme dans et le chat est juste écrit standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X