En redes de computadoras , STREAMS es el marco nativo en Unix System V para implementar controladores de dispositivos de caracteres , protocolos de red y comunicación entre procesos . En este marco, una secuencia es una cadena de corrutinas que pasan mensajes entre un programa y un controlador de dispositivo (o entre un par de programas). STREAMS se originó en la Versión 8 de Research Unix , como Streams (no en mayúscula).
El diseño de STREAMS es una arquitectura modular para implementar E / S full-duplex entre el kernel y los controladores de dispositivo. Sus usos más frecuentes han sido en el desarrollo de E / S de terminal ( disciplina de línea ) y subsistemas de redes. En System V Release 4, toda la interfaz del terminal se volvió a implementar mediante STREAMS. [1] Un concepto importante en STREAMS es la capacidad de impulsar controladores (módulos de código personalizados que pueden modificar la funcionalidad de una interfaz de red u otro dispositivo) juntos para formar una pila. Varios de estos controladores se pueden encadenar juntos en orden.
Historia
STREAMS se basó en el subsistema Streams I / O introducido en la octava edición Research Unix (V8) por Dennis Ritchie , donde se usó para el subsistema terminal I / O y el conjunto de protocolos de Internet . Esta versión, aún no llamada STREAMS en mayúsculas, se ajusta a la nueva funcionalidad bajo las llamadas al sistema de E / S del dispositivo existente ( abrir , cerrar , leer , escribir e ioctl ), [2] y su aplicación se limitaba a E / S de terminal y protocolos que proporcionan semántica de E / S similar a una tubería.
Este sistema de E / S fue adaptado a System V Release 3 por Robert Israel, Gil McGrath, Dave Olander, Her-Daw Che y Maury Bach como parte de un marco más amplio destinado a admitir una variedad de protocolos de transporte, incluidos TCP, Clase ISO 4 transporte, SNA LU 6.2 y el protocolo AT&T NPACK (utilizado en RFS ). [3] Fue lanzado por primera vez con el paquete Network Support Utilities (NSU) de UNIX System V Release 3. [4] Este puerto agregó las llamadas putmsg , getmsg y poll system , que son casi equivalentes en propósito al send , recv y seleccione llamadas de los enchufes de Berkeley. Las llamadas al sistema putmsg y getmsg originalmente se llamaban send y recv , [5] pero se les cambió el nombre para evitar conflictos de espacio de nombres. [6] En System V Release 4, STREAMS se extendió y se usó para el marco y las tuberías de E / S del terminal, proporcionando una nueva funcionalidad útil como tuberías bidireccionales y paso de descriptores de archivos . [3] También se produjo un puerto para Unicos . Eric S. Raymond cita a Ritchie diciendo sobre la complejidad de System V STREAMS en comparación con sus V8 Streams que "Streams significa algo diferente cuando se grita". [7]
Al mismo tiempo que el puerto System V Release 3, AT&T desarrolló pautas de paso de mensajes STREAMS independientes del protocolo para las capas de enlace , [8] red , [9] y transporte [10] del modelo OSI (capas 2-4). Debido al acoplamiento de implementación típicamente cercano de la red y los protocolos de transporte en una pila de protocolos dada , y la práctica típica de implementar las capas 5-7 fuera del kernel , solo las interfaces de servicio de enlace [8] y de transporte [11] STREAMS fueron posteriormente estandarizado por X / Open . Junto con el modelo de paso de mensajes de transporte, se definió la interfaz de la capa de transporte (más tarde adoptada como la interfaz de transporte X / Open ) para proporcionar una API independiente del protocolo de transporte para el desarrollo de aplicaciones. Además, The Open Group definió una biblioteca que respalda las capas de sesión , presentación y aplicación [12] y luego la estandarizó . [13]
Se requirió STREAMS para cumplir con las versiones 1 (UNIX 95) y 2 (UNIX 98) de la Especificación Única de UNIX , pero como resultado de la negativa de los desarrolladores de BSD y Linux a proporcionar STREAMS, [ cita requerida ] se marcó como opcional para POSIX cumplimiento por parte del Grupo Austin en la versión 3 (UNIX 03). POSIX.1-2008 con TC1 (IEEE Std 1003.1, edición 2013) ha designado a STREAMS como 'marcadas como obsoletas' [14] [15], lo que significa que dicha funcionalidad puede eliminarse en una versión futura de la especificación. Sin embargo, la definición específica de "obsolescente" utilizada [16] también dice que las aplicaciones POSIX estrictamente conformes "no utilizarán características obsoletas".
Resumen técnico
En la versión 7 de Unix , se conectaba un comando a un terminal (teclado y pantalla, o teclado e impresora ) a través de un mecanismo llamado disciplina de línea, que almacenaría en búfer una sola línea de entrada, es decir, esperaría a que el usuario presione la tecla Retorno antes de enviar la entrada al programa para su procesamiento; esto permitió una simple corrección de errores. Streams reemplazó esto con un conjunto de módulos de procesamiento organizados en una cadena lineal que permitía la comunicación bidireccional entre módulos vecinos. Los programas podrían "empujar" un nuevo módulo en un extremo de la cadena para cambiar el comportamiento de un terminal u otro dispositivo de caracteres. Ritchie da la cadena de ejemplo de un módulo de terminal encadenado con un módulo de red Datakit para lograr el inicio de sesión remoto a través de una red. [5] Aparte de los caracteres (bytes) que van de un programa a otro y viceversa , Streams podría llevar mensajes de control como "hangup" (desconexión) y mensajes ioctl .
Los flujos también se pueden utilizar para la comunicación entre procesos , conectando dos procesos a pseudoterminales . Esta funcionalidad se implementó en el sistema de ventanas mpx para el terminal de gráficos Blit , que podía mostrar múltiples ventanas de emulador de terminal . Cada ventana era un proceso que se comunicaba con el sistema de ventanas a través de un pseudoterminal que tenía instalado el controlador de disciplina de línea, que le enviaba caracteres escritos y recibía texto (y gráficos) para mostrar. Las señales de control designaban el deseo del usuario de cambiar entre ventanas o cerrarlas. [17] [18] : 348–350
Los módulos Streams reales viven en el espacio del kernel en Unix y se instalan (empujan) y eliminan (abren) mediante la llamada al sistema ioctl. Por ejemplo, para instalar la disciplina de línea antes mencionada en un descriptor de archivo que hace fd
referencia a un dispositivo terminal, se escribiría (en C ): [18] : 347
ioctl ( fd , PUSH , TTYLD );
Para realizar la entrada / salida en una secuencia, uno usa las llamadas al sistema read
y write
como con los descriptores de archivo regulares, o un conjunto de funciones específicas de STREAMS para enviar mensajes de control. [19]
Ritchie admitió haber lamentado tener que implementar Streams en el kernel, en lugar de como procesos, pero se sintió obligado a hacerlo por razones de eficiencia. [5] Una implementación posterior del Plan 9 implementó módulos como procesos a nivel de usuario. [20]
Implementaciones
STREAMS se ha utilizado principalmente en el mundo Unix de System V; sin embargo, existen otras implementaciones:
- Plan 9 originalmente usó una variante multiprocesador de Streams de Research Unix. Durante la transición a la tercera edición de Plan 9, los flujos se simplificaron aún más a simples colas de E / S. [20]
- Una implementación escrita en Mentat se utilizó en Novell NetWare para su pila TCP / IP, y Apple obtuvo la licencia para su uso en el Mac OS clásico a partir de la versión 7.5.2, como parte del sistema de red Open Transport . (En macOS , el entorno clásico utilizó la arquitectura STREAMS, pero la arquitectura de red nativa utiliza la API de sockets de Berkeley y se deriva del código de red BSD ).
- FreeBSD tiene soporte básico para llamadas al sistema relacionadas con STREAMS, como lo requiere la capa de compatibilidad binaria SVR4.
- El kernel de Windows NT ofrecía un puerto completo de STREAMS como el binario streams.sys. NT DDK incluso tenía un capítulo sobre STREAMS, que llegó hasta NT4, aunque en NT4 DDK se declaró obsoleto. Spider Systems implementó la pila TCP / IP original para Windows NT 3.1 sobre STREAMS y utilizó el binario streams.sys. Desde NT 3.5 en adelante, TCP / IP se rehizo completamente, [21] [22] adoptando el de Microsoft LAN Manager para OS / 2 1.x. [ cita requerida ]
Linux no incluye la funcionalidad STREAMS sin complementos de terceros. Caldera había "presionado" para que STREAMS se incluyera en Linux ca. 1998, para dar soporte a su Netware para Linux , pero fue rechazado por los desarrolladores del kernel de Linux por motivos técnicos (principalmente de rendimiento). [23] Las capas de compatibilidad en Linux para otros sistemas operativos convierten las operaciones STREAMS en sockets lo antes posible. [24] La implementación utilizada por Caldera fue "LiS", por una empresa llamada GCOM; luego figuró en las batallas legales del sucesor de Caldera, el Grupo SCO , contra Linux, con SCO alegando que Linux con STREAMS infringía lo que creía que eran sus derechos de autor del Sistema V. [23]
Notas
- ↑ ( Goodheart 1994 , págs. 51–53,403–527)
- ^ ( Goodheart 1994 , págs. 52–53)
- ↑ a b ( Goodheart 1994 , p. 17)
- ↑ ( Goodheart 1994 , p. 51)
- ↑ a b c ( Ritchie 1984 )
- ↑ ( Goodheart 1994 )
- ^ Eric S. Raymond (2003). "Capítulo 7. Multiprogramación" . El arte de la programación Unix . Addison-Wesley.
- ^ a b ( DLPI y 2.0.0 )
- ^ ( NPI y 2.0.0 )
- ^ ( TPI y 1,5 )
- ^ ( TPI y 2.0.0 )
- ^ ( APLI 1990 )
- ↑ ( XAP 1993 )
- ^ "Especificaciones básicas, edición 7, edición 2013, sección B.2.6 STREAMS" . El grupo abierto . Consultado el 9 de marzo de 2015 .
- ^ "El Grupo de Revisión de Normas Comunes de Austin" . El grupo abierto . Consultado el 9 de marzo de 2015 .
- ^ "The Open Group Base Especificaciones Edición 7, Códigos" . El grupo abierto . Consultado el 9 de marzo de 2015 .
- ^ Pike, Rob (1984). "El Blit: una terminal de gráficos multiplexados" . Revista técnica de AT&T Bell Laboratories . 63 (8): 1607–1631. doi : 10.1002 / j.1538-7305.1984.tb00056.x . S2CID 34062559 .
- ^ a b Bach, Maurice J. (1986). El diseño del sistema operativo UNIX . Prentice Hall. Bibcode : 1986duos.book ..... B .
- ^ Consulte: - Referencia de interfaces del sistema, la especificación única de UNIX , número 6 de The Open Group , y - Referencia de interfaces del sistema, la especificación de UNIX única , número 6 de The Open Group .
- ^ a b Presotto, David L. (1990). Flujos de multiprocesador para Plan 9 . Proc. UKUUG Summer Conf. CiteSeerX 10.1.1.42.1172 .
- ↑ ( Barr 2001 )
- ↑ ( Valentine, 2001 )
- ^ a b "STREAMS, LiS y Caldera's Netware para Linux - Actualizado" . Groklaw . 3 de julio de 2006 . Consultado el 27 de diciembre de 2014 .
- ^ Alan Cox, Streams and Linux , Linux Kernel Mailing List, 28 de junio de 1998
Referencias
- Buen corazón, Berny; Cox, James (1994), Explicación del jardín mágico: los componentes internos de UNIX System V Release 4, un diseño de sistemas abiertos , Australia: Prentice Hall, ISBN 0-13-098138-9
- Open Group (1999), "Especificación de interfaz de proveedor de transporte (TPI)", Especificación CAE de Open Group (Revisión 2.0.0, Borrador 2 ed.), Berkshire, Reino Unido: Publicación de Open Group
- Open Group (septiembre de 1993), "ACSE / Presentation Services API (XAP)", X / Open CAE Specification , Berkshire, Reino Unido: X / Open Company Limited, XAP (c303), ISBN 1-872630-91-X
- Pajari, George (1992) [1991], Escritura de controladores de dispositivo UNIX (2ª impresión, 1ª ed.), Reading, MA: Addison-Wesley, ISBN 0-201-52374-4
- Ritchie, Dennis M. (octubre de 1984). "Un sistema de entrada-salida de flujo" . Revista técnica de AT&T Bell Laboratories 63, No. 8 Parte 2 . AT&T: 1897–1910. doi : 10.1002 / j.1538-7305.1984.tb00071.x . S2CID 33497669 . Consultado el 13 de enero de 2018 .
- Stevens, W.Richard (1993), Programación avanzada en el entorno UNIX (15th Printing, 1st ed.), Reading, MA: Addison-Wesley, ISBN 0-201-56317-7
- Thomas, Rebecca; Rogers, Lawrence R .; Yates, Jean L. (1986), Guía de programadores avanzados para UNIX System V , Berkeley, CA: Osborne McGraw-Hill, ISBN 0-07-881211-9
- UNIX Internacional (20 de agosto, 1991), de enlace de datos del proveedor de interfaz (DLPI) Especificaciones (PDF) , Publicación Internacional UNIX (Revisión 2.0.0, Proyecto 2 ed.), Parsippany, Nueva Jersey: UNIX Internacional de Prensa , recuperada 2009-07-27
- UNIX Internacional (17 de agosto, 1992), proveedor de interfaz de red (NPI) Especificaciones (PDF) , UNIX publicación internacional (revisión 2.0.0, Proyecto 2 ed.), Parsippany, Nueva Jersey: UNIX Internacional de Prensa , recuperados 2009-07-27
- UNIX Internacional (10 de diciembre, 1992), proveedor de transporte de especificación de interfaz (PDF) , UNIX Publicación Internacional (Versión 1.5, proyecto de 2 ed.), Parsippany, NJ: UNIX International Press , recuperados 2009-07-27
- UNIX International (25 de octubre de 1990), Especificación ACSE / Presentation Library Interface (APLI) , Publicación internacional UNIX (Draft ed.), Parisppany, NJ: UNIX International Press
- Waite Group (1987), Mitchel Waite (ed.), UNIX Papers (2nd Printing, 1st ed.), Indianapolis, IN: Howard W. Sams & Company, ISBN 0-672-22578-6
- Barr, Adam (19 de junio de 2001), "Microsoft, TCP / IP, Open Source, and Licensing" , Kuro5hin , consultado el 22 de febrero de 2013CS1 maint: ref duplica el valor predeterminado ( enlace )
- Valentine, Mark (19 de junio de 2001). "Re: Consulta: ¿Cómo saber si Microsoft está usando el código BSD TCP / IP?" . freebsd-hackers (lista de correo) . Consultado el 22 de febrero de 2013 .CS1 maint: ref duplica el valor predeterminado ( enlace )
enlaces externos
- El manual original de stream (4) de Unix 8th Edition
- El marco STREAMS en Digital UNIX : de la Guía del programador de red Digital UNIX
- Guía de programación de Oracle (anteriormente, Sun) STREAMS