He escuchado la historia de cómo Douglas Mcllroy ideó el concepto y cómo Ken Thompson lo implementó en una noche.
Según tengo entendido, pipe es una llamada al sistema que comparte un trozo de memoria entre dos procesos donde un proceso escribe y otro lee.
Como alguien que no está familiarizado con los aspectos internos o los conceptos del sistema operativo, me preguntaba cuál es exactamente el "genio" en la historia. ¿Es la idea de dos procesos que comparten memoria? ¿O es la implementación? ¿O ambos?
PD: Soy consciente de la utilidad de la tubería o de cómo usarla en shell. La pregunta es sobre el concepto y la implementación de|
history
unix
process
pipelining
aoak
fuente
fuente
pipe()
llamada al sistema y al|
operador de shell (ref: McIlroy ). O, como Voltaire podría haber dicho, " Si [stdio] no existiera, sería necesario inventarlo " . :-)Respuestas:
En realidad, no hay memoria compartida involucrada. El lector y el escritor NO están compartiendo ninguna parte de su espacio de direcciones, y no están utilizando ninguna sincronización explícita.
Los procesos de lectura y escritura están haciendo
read
y laswrite
llamadas al sistema exactamente como lo harían si estuvieran leyendo / escribiendo en un archivo. ESO es el genio ... la innovación: la noción de que (simple) la comunicación entre procesos y la E / S de archivos se pueden manejar de la misma manera ... desde la perspectiva del programador de aplicaciones y el usuario.Una vez que se ha configurado la tubería, el sistema operativo (no el código de aplicación o las bibliotecas en el espacio de usuario) se encarga del almacenamiento en búfer y la coordinación. Transparentemente.
Por el contrario, antes de la invención del concepto de tubería, si necesitara hacer un procesamiento de "tubería", normalmente tendría una salida de escritura de aplicación en un archivo, y luego, cuando haya terminado, ejecutaría la segunda aplicación para leer archivo.
Alternativamente, si desea una tubería verdadera, puede codificar ambas aplicaciones para configurar un segmento de memoria compartida (real) y usar semáforos (o algo así) para coordinar la lectura / escritura. Complicado ... y, como consecuencia, no se hace con frecuencia.
fuente
En mi opinión, el genio de la idea de "tuberías" es la simplicidad de uso.
No tiene que hacer ninguna llamada al sistema, asignar memoria, nada complicado en absoluto. En el shell, se utiliza un solo carácter:
|
. Esto le otorga un poder extraordinario en la combinación de herramientas simples (o complejas) para una tarea determinada.Tome algunas tareas cotidianas comunes, como ordenar el texto de forma ordenada. Es posible que tenga un comando que enumere un montón de nombres. (Para mi ejemplo, usaré un archivo que contiene un montón de nombres, cortesía de listofrandomnames.com). Usando tuberías puede hacer algo como lo siguiente:
Esto es sólo un ejemplo; hay miles. Para algunas otras tareas específicas que se hacen notablemente más fáciles mediante el uso de tuberías, consulte la sección "La filosofía de Unix" en esta página .
Para subrayar esta respuesta, vea las diapositivas 4 a 9 de la presentación, "Por qué Zsh es más genial que su caparazón".
Soy consciente de que el comando anterior incluye un UUOC . Lo dejé en reposo porque es un marcador de posición para un comando arbitrario que genera texto.
fuente
sort -u
puede hacer el trabajosort | uniq
más rápido.cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Puede que estés acostumbrado, pero no lo llamaría simple en absoluto. Especialmente laawk
parte.Así que intenté investigar un poco sobre esto buscando manuales PDP-10 / TOPS-10 para averiguar cuál era el estado del arte antes de las tuberías. Encontré esto , pero TOPS-10 es notablemente difícil de google. Hay algunas buenas referencias sobre la invención de la tubería: una entrevista con McIlroy , sobre la historia y el impacto de UNIX .
Tienes que poner esto en contexto histórico. Pocas de las herramientas y comodidades modernas que damos por sentado existieron.
Un PDP-7 se ve así . Tenga en cuenta la falta de una pantalla interactiva o disco duro. El "sistema de archivos" se almacenaría en la cinta magnética. Había hasta 64kB de memoria para programas y datos.
En ese entorno, los programadores tendían a abordar el hardware directamente, por ejemplo, emitiendo comandos para girar la cinta y procesar los caracteres uno a la vez, leídos directamente desde la interfaz de la cinta. UNIX proporcionó abstracciones sobre esto, de modo que en lugar de "leer desde el teletipo" y "leer desde la cinta" siendo interfaces separadas, se combinaron en una sola, con la adición crucial de "leer desde la salida de otro programa sin almacenar una copia temporal en el disco" o cinta ".
Aquí está McIlroy sobre la invención de
grep
. Creo que esto hace un buen trabajo al resumir la cantidad de trabajo requerida en el entorno anterior a UNIX.Compare la primera parte de eso con el
cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
ejemplo. Si sus opciones son "construir una línea de comando" versus "escribir un programa específicamente para ese propósito, a mano, en ensamblador", entonces vale la pena construir la línea de comando. Incluso si lleva unas horas leer los manuales (en papel) para hacerlo. Luego puede escribirlo para referencia futura.fuente
El genio de Pipes es que combina tres ideas importantes.
Primero, las tuberías son una implementación práctica de 'co-rutinas', un término acuñado por Conway en 1958 que era prometedor pero que tenía poco uso práctico antes de las tuberías.
En segundo lugar, al implementar tuberías en el lenguaje de shell, Thompson et al inventaron el primer "lenguaje de pegamento" real.
Estos dos puntos permiten que los componentes de software reutilizables se desarrollen eficientemente en un lenguaje optimizado de bajo nivel, y luego se peguen para formar una funcionalidad mucho más grande y compleja. Llamaron a esto 'Programación en grande'.
En tercer lugar, la implementación de canalizaciones utilizando las mismas llamadas al sistema que se usaron para el acceso a archivos permitió que los programas se escribieran con interfaces universales. Esto permitió soluciones verdaderamente universales a los problemas de software, que se pueden usar de forma interactiva, utilizando datos de archivos y como parte de sistemas de software más grandes, todo sin un solo cambio en los componentes del software. Sin compilación, sin configuración, solo unos pocos comandos de shell simples.
Si le interesa pasar por la curva de aprendizaje, el software UNIX es tan útil hoy como lo fue hace 40 años. Estamos constantemente reinventando cosas que ya sabían y para las que creamos soluciones. Y el avance clave fue la simple tubería. La única innovación real después de eso fue la creación de Internet en los años 80. Dramáticamente, UNIX falló su implementación de eso al crear una API separada. Todavía sufrimos las consecuencias ... Oh, sí, había algo con pantallas de video y ratones que se hizo popular a finales de los 80. Pero eso es para WIMPs.
fuente