¿Cuál es el ingenio exacto de la tubería Unix?

51

He escuchado la historia de cómo a Douglas Mcllroy se le ocurrió el concepto y cómo Ken Thompson lo implementó en una noche.

Según tengo entendido, pipe es una llamada al sistema que comparte una parte de la memoria entre dos procesos en los que se escribe un proceso y otro se lee.

Como alguien que no está familiarizado con los conceptos internos o conceptos de SO, me preguntaba qué es exactamente el "genio" en la historia. ¿Es la idea de dos procesos compartiendo memoria? ¿O es la implementación? O ambos?

PS: Soy consciente de la utilidad de la tubería o cómo usarla en shell. La pregunta es sobre el concepto y la implementación de |

    
pregunta aoak 12.12.2015 - 03:00

3 respuestas

107
  

Según tengo entendido, pipe es una llamada al sistema que comparte una parte de la memoria entre dos procesos en los que se escribe un proceso y otro se lee.

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 usando ninguna sincronización explícita.

Los procesos de lectura y escritura hacen que read y write llamen a exactamente como lo harían si estuvieran leyendo / escribiendo en un archivo. ESO es el genio ... la innovación: la noción de que la comunicación entre procesos (simple) y la E / S de archivos se pueden manejar de la misma manera ... desde la perspectiva del programador de aplicaciones y del usuario.

Una vez que se ha configurado la canalización, el sistema operativo (no el código de la 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 realizar el procesamiento de "tubería", normalmente tendría una aplicación de escritura en un archivo, y luego, cuando finalice, ejecutaría la segunda aplicación para leer del archivo.

Alternativamente, si desea una verdadera canalización, podría codificar ambas aplicaciones para configurar un segmento de memoria compartida (real) y usar semáforos (o algo) para coordinar la lectura / escritura. Complicado ... y como consecuencia no se hace a menudo.

    
respondido por el Stephen C 12.12.2015 - 04:04
14

En mi opinión, el genio de la idea de "tuberías" es la simplicidad de uso.

No tiene que hacer llamadas al sistema, asignar memoria, nada complicado. En el shell, usas un solo carácter: | . Esto 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. Puede tener un comando que enumera 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:

$ cat names.txt
Sally Weikel
Dana Penaflor
Christine Hook
Shaneka Flythe
Almeda Crook
Freddie Lindley
Hester Kersh
Wanda Ruse
Megan Mauzy
Samuel Mancha
Paris Phipps
Annika Accardo
Elena Nabors
Caroline Foti
Jude Nesby
Chase Gordy
Carmela Driggers
Marlin Ostendorf
Harrison Dauber
$ cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Accardo, Annika     Hook, Christine     Ostendorf, Marlin
Crook, Almeda       Kersh, Hester       Penaflor, Dana
Dauber, Harrison    Lindley, Freddie    Phipps, Paris
Driggers, Carmela   Mancha, Samuel      Ruse, Wanda
Flythe, Shaneka     Mauzy, Megan        Weikel, Sally
Foti, Caroline      Nabors, Elena
Gordy, Chase        Nesby, Jude

Este es solo un ejemplo; hay miles. Para 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 frío que tu Shell?"

Soy consciente de que el comando anterior incluye un UUOC . Lo dejo en pie porque es un marcador de posición para un comando arbitrario que genera texto.

    
respondido por el Wildcard 12.12.2015 - 03:41
5

Así que traté de investigar un poco sobre esto buscando manuales de PDP-10 / TOPS-10 para averiguar qué era lo último en tecnología antes de las tuberías. Encontré esto , pero TOPS-10 es notablemente difícil de buscar en Google. Hay algunas buenas referencias sobre la invención de la tubería: una entrevista con McIlroy , < a href="http://people.fas.harvard.edu/~lib113/reference/unix/unix2.html"> en la historia y el impacto de UNIX .

Tienes que poner esto en el contexto histórico. Pocas de las herramientas y conveniencias modernas que damos por sentadas existen.

  

"Al principio, Thompson ni siquiera programó en el propio PDP, sino que utilizó un conjunto de macros para el ensamblador GEMAP en una máquina GE-635". (29) Se generó una cinta de papel en el GE 635 y luego se probó en el PDP-7 hasta que, según Ritchie, se completaron "un núcleo de Unix primitivo, un editor, un ensamblador, un shell simple (intérprete de comandos) y algunas utilidades (como los comandos Unix rm, cat, cp) En este punto, el sistema operativo era autosuficiente, los programas se podían escribir y probar sin recurrir a la cinta de papel, y el desarrollo continuaba en el propio PDP-7 ".

Un PDP-7 se parece a esto . 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 dirigirse directamente al hardware, 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 teletipo" y "leer de 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 requerido en el entorno pre-UNIX.

  

"Grep se inventó para mí. Estaba haciendo un programa para leer texto en voz alta a través de un sintetizador de voz. Como inventé las reglas fonéticas, buscaría palabras en el diccionario de Webster que pudieran fallar. Por ejemplo, ¿cómo se las arregla? el dígrafo 'ui', que se pronuncia de muchas maneras diferentes: 'fruta', 'guile', 'culpable', 'angustia', 'intuición', 'beguine'? Rompería el diccionario en piezas que encajan en el limitado búfer y use un comando global para seleccionar una lista. Reduciría esta lista con repetidas exploraciones con ed para ver cómo funcionaba cada regla propuesta ".

     

"El proceso fue tedioso y tremendamente inútil, ya que el diccionario tuvo que ser dividido (uno no podía permitirse dejar una copia dividida en la línea). Luego copió cada parte en / tmp, lo escaneó dos veces para lograr el El comando g, y finalmente lo tiró, lo que también lleva tiempo ".

     

"Una tarde le pregunté a Ken Thompson si podía sacar el reconocedor de expresiones regulares del editor y hacer un programa de una sola pasada para hacerlo. Dijo que sí. A la mañana siguiente encontré una nota en mi correo anunciando un programa llamado grep. Funcionó a la perfección. Cuando se le preguntó qué significaba ese nombre gracioso, Ken dijo que era obvio. Significó el comando del editor que simuló, g / re / p (impresión de expresión regular global) ".

Compara la primera parte de eso con el ejemplo cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100 . Si sus opciones son "construir una línea de comando" en lugar de "escribir un programa específicamente para el propósito, a mano, en ensamblador", entonces vale la pena construir la línea de comando. Incluso si toma unas pocas horas de leer los manuales (en papel) para hacerlo. Luego puede escribirlo para futuras referencias.

    
respondido por el pjc50 14.12.2015 - 15:55

Lea otras preguntas en las etiquetas