Canonada (Unix)

Una canalització de tres processos de programa que s'executen en un terminal de text.

En sistemes operatius d'ordinador similars a Unix, una canonada (pipeline) és un mecanisme per a la comunicació entre processos mitjançant el pas de missatges. Un pipeline és un conjunt de processos encadenats pels seus fluxos estàndard, de manera que el text de sortida de cada procés (stdout) es passa directament com a entrada (stdin) al següent. El segon procés s'inicia ja que el primer procés encara s'està executant, i s'executen simultàniament. El concepte de pipelines va ser defensat per Douglas McIlroy a la casa ancestral d'Unix, els Bell Labs, durant el desenvolupament d'Unix, donant forma a la seva filosofia de caixa d'eines.[1][2] S'anomena per analogia a una canonada física. Una característica clau d'aquests oleoductes és el seu "amagat d'elements interns" (Ritchie i Thompson, 1974). Això al seu torn permet una major claredat i simplicitat en el sistema.

Aquest article tracta sobre canonades anònimes, on el sistema operatiu emmagatzema les dades escrites per un procés fins que són llegits pel següent procés, i aquest canal unidireccional desapareix quan s'han completat els processos. Això difereix de les canalitzacions amb nom, on els missatges es passen a o des d'una canalització que s'anomena convertint-la en un fitxer i es manté un cop finalitzats els processos. La sintaxi estàndard de l'intèrpret d'ordres per a canonades anònimes és llistar diverses ordres, separades per barres verticals ("tubes" en el verb comú Unix): [3]

Els fluxos estàndard d'entrada, sortida i error.
command1 | command2 | command3

Per exemple, per llistar fitxers al directori actual (ls), conserva només les línies dels sortida que conté la cadena"key" (grep), i visualitzeu el resultat en una pàgina de desplaçament (less), un usuari escriu el següent a la línia d'ordres d'un terminal:

ls -l | grep key | less

L'ordre ls -l s'executa com un procés, la sortida (stdout) del qual s'envia a l'entrada (stdin) del procés per a la clau grep; i així mateix pel procés per menys. Cada procés pren entrada del procés anterior i produeix sortida per al següent procés mitjançant fluxos estàndard. Cada | diu a l'intèrpret d'ordres que connecti la sortida estàndard de l'ordre de l'esquerra a l'entrada estàndard de l'ordre de la dreta mitjançant un mecanisme de comunicació entre processos anomenat tub (anònim), implementat al sistema operatiu. Les canonades són unidireccionals; Les dades flueixen a través de la canonada d'esquerra a dreta.[4]

Implementació

[modifica]

A la majoria de sistemes semblants a Unix, tots els processos d'una canalització s'inicien al mateix temps, amb els seus fluxos connectats adequadament i gestionats pel planificador juntament amb tots els altres processos que s'executen a la màquina. Un aspecte important d'això, diferenciant les canonades Unix d'altres implementacions de canonades, és el concepte de memòria intermèdia: per exemple, un programa d'enviament pot produir 5000 bytes per segon, i un programa receptor només pot acceptar 100 bytes per segon, però no. es perden les dades. En canvi, la sortida del programa d'enviament es manté a la memòria intermèdia. Quan el programa receptor està preparat per llegir dades, el següent programa del pipeline llegeix des de la memòria intermèdia. Si s'omple la memòria intermèdia, el programa d'enviament s'atura (bloqueja) fins que almenys algunes dades s'eliminen de la memòria intermèdia pel receptor. A Linux, la mida de la memòria intermèdia és de 65.536 bytes (64 KiB). Hi ha disponible un filtre de tercers de codi obert anomenat bfr per proporcionar buffers més grans si cal.

Referències

[modifica]
  1. Mahoney, Michael S. «The Unix Oral History Project: Release.0, The Beginning» (en anglès).
  2. «Prophetic Petroglyphs» (en anglès). cm.bell-labs.com. Arxivat de l'original el 8 May 1999. [Consulta: 22 maig 2022].
  3. McKay, Dave. «How to Use Pipes on Linux» (en anglès), 05-09-2019. [Consulta: 10 desembre 2023].
  4. «What is a simple explanation for how pipes work in Bash?» (en anglès). [Consulta: 10 desembre 2023].