En arquitectura informática , un bus [1] (históricamente también llamado autopista de datos [2] o bus de datos ) es un sistema de comunicación que transfiere datos entre componentes dentro de una computadora , o entre computadoras. Esta expresión cubre todos los componentes de hardware relacionados (cable, fibra óptica , etc.) y software , incluidos los protocolos de comunicación . [3]
En la mayoría de las arquitecturas informáticas tradicionales , la CPU y la memoria principal tienden a estar estrechamente acopladas, y el bus interno que conecta a ambas se conoce como bus del sistema . En los sistemas que incluyen una memoria caché , las CPU utilizan buses del sistema de alto rendimiento que funcionan a velocidades mayores que la memoria para comunicarse con la memoria. El bus interno (también conocido como bus de datos interno, bus de memoria o bus del sistema ) conecta los componentes internos de una computadora a la placa base. Los buses locales conectan la CPU y la memoria al bus de expansión , que a su vez conecta la computadora a los periféricos. Los sistemas de bus como los puertos SATA en las computadoras modernas admiten múltiples periféricos, lo que permite conectar múltiples discos duros sin una tarjeta de expansión .
En sistemas que tienen una arquitectura similar a las multicomputadoras , pero que se comunican por buses en lugar de redes, el bus del sistema se conoce como bus frontal . En tales sistemas, el bus de expansión puede no compartir ninguna arquitectura con sus CPU anfitrionas, sino que admite muchas CPU diferentes, como es el caso de PCI . Si bien el término " bus periférico " a veces se usa para referirse a todos los demás buses aparte del bus del sistema, el "bus de expansión" también se ha usado para describir una tercera categoría de buses separados del bus periférico, que incluye sistemas de bus como PCI.
Los primeros buses de computadora eran cables eléctricos paralelos con múltiples conexiones de hardware, pero el término ahora se usa para cualquier disposición física que proporcione la misma función lógica que una barra colectora eléctrica paralela . Los buses de computadora modernos pueden usar conexiones en paralelo y en serie de bits , y pueden cablearse en una topología multidrop (paralelo eléctrico) o en cadena , o conectarse mediante concentradores conmutados. Muchas CPU modernas también cuentan con un segundo conjunto de pines similares a los que se utilizan para comunicarse con la memoria, pero capaces de operar con diferentes velocidades y protocolos, para garantizar que los periféricos no ralenticen el rendimiento general del sistema. Las CPU también pueden presentar controladores inteligentes para colocar los datos directamente en la memoria, un concepto conocido como acceso directo a la memoria . También se han desarrollado sistemas de bus de bajo rendimiento, como el bus serie universal (USB).
Debido a los cambios tecnológicos, los términos clásicos "sistema", "expansión" y "periférico" ya no tienen las mismas connotaciones. Otros sistemas de categorización comunes se basan en la función principal del bus, que consiste en conectar dispositivos interna o externamente. Sin embargo, muchos sistemas de bus modernos comunes se pueden utilizar para ambas funciones. SATA y el eSATA asociado son un ejemplo de un sistema que antes se describía como interno, mientras que ciertas aplicaciones automotrices utilizan el IEEE 1394 principalmente externo de una manera más similar a un bus de sistema. Otros ejemplos, como InfiniBand e I²C, se diseñaron desde el principio para usarse tanto interna como externamente.
Un bus de direcciones es un bus que se utiliza para especificar una dirección física . Cuando un procesador o un dispositivo habilitado para DMA necesita leer o escribir en una ubicación de memoria, especifica esa ubicación de memoria en el bus de direcciones (el valor que se leerá o escribirá se envía en el bus de datos). El ancho del bus de direcciones determina la cantidad de memoria que un sistema puede direccionar. Por ejemplo, un sistema con un bus de direcciones de 32 bits puede direccionar 2 32 (4.294.967.296) ubicaciones de memoria. Si cada ubicación de memoria contiene un byte, el espacio de memoria direccionable es de 4 GB.
Los primeros procesadores utilizaban un cable por cada bit del ancho de la dirección. Por ejemplo, un bus de direcciones de 16 bits tenía 16 cables físicos que formaban el bus. A medida que los buses se hicieron más anchos y largos, este enfoque se volvió costoso en términos de la cantidad de pines del chip y pistas de la placa. A partir de la DRAM Mostek 4096 , la multiplexación de direcciones implementada con multiplexores se volvió común. En un esquema de dirección multiplexada, la dirección se envía en dos partes iguales en ciclos de bus alternos. Esto reduce a la mitad la cantidad de señales del bus de direcciones necesarias para conectarse a la memoria. Por ejemplo, un bus de direcciones de 32 bits se puede implementar utilizando 16 líneas y enviando la primera mitad de la dirección de memoria, seguida inmediatamente por la segunda mitad de la dirección de memoria.
Normalmente, se utilizan dos pines adicionales en el bus de control (el estroboscópico de dirección de fila (RAS) y el estroboscópico de dirección de columna (CAS)) para indicar a la DRAM si el bus de direcciones está enviando actualmente la primera mitad de la dirección de memoria o la segunda mitad.
Para acceder a un byte individual, es necesario leer o escribir todo el ancho del bus (una palabra ) de una sola vez. En estos casos, es posible que ni siquiera se implementen los bits menos significativos del bus de direcciones; en cambio, es responsabilidad del dispositivo de control aislar el byte individual requerido de la palabra completa transmitida. Este es el caso, por ejemplo, del bus local VESA , que carece de los dos bits menos significativos, lo que limita este bus a transferencias alineadas de 32 bits.
Históricamente, también hubo algunos ejemplos de computadoras que sólo podían procesar palabras: las máquinas de palabras .
El bus de memoria es el bus que conecta la memoria principal con el controlador de memoria en los sistemas informáticos . Originalmente, se utilizaban buses de propósito general como VMEbus y el bus S-100 , pero para reducir la latencia , los buses de memoria modernos están diseñados para conectarse directamente a los chips DRAM, y por lo tanto están diseñados por organismos de normalización de chips como JEDEC . Algunos ejemplos son las distintas generaciones de SDRAM y los buses punto a punto en serie como SLDRAM y RDRAM . Una excepción es el DIMM con búfer completo que, a pesar de estar cuidadosamente diseñado para minimizar el efecto, ha sido criticado por su mayor latencia.
Los buses pueden ser buses paralelos , que llevan palabras de datos en paralelo en múltiples cables, o buses seriales , que llevan datos en formato bit-serial. La adición de conexiones de control y potencia adicionales, controladores diferenciales y conexiones de datos en cada dirección generalmente significa que la mayoría de los buses seriales tienen más conductores que el mínimo de uno utilizado en 1-Wire y UNI/O . A medida que aumentan las tasas de datos, los problemas de sesgo de tiempo , consumo de energía, interferencia electromagnética y diafonía entre buses paralelos se vuelven cada vez más difíciles de sortear. Una solución parcial a este problema ha sido bombear dos veces el bus. A menudo, un bus serial puede funcionar a tasas de datos generales más altas que un bus paralelo, a pesar de tener menos conexiones eléctricas, porque un bus serial inherentemente no tiene sesgo de tiempo ni diafonía. USB , FireWire y Serial ATA son ejemplos de esto. Las conexiones multidrop no funcionan bien para buses seriales rápidos, por lo que la mayoría de los buses seriales modernos utilizan diseños de conexión en cadena o concentrador.
La transición de buses paralelos a buses seriales fue permitida por la ley de Moore que permitió la incorporación de SerDes en circuitos integrados que se utilizan en computadoras. [4]
Las conexiones de red como Ethernet no suelen considerarse buses, aunque la diferencia es en gran medida conceptual más que práctica. Un atributo que se utiliza generalmente para caracterizar un bus es que el bus proporciona energía al hardware conectado. Esto enfatiza los orígenes de la arquitectura de bus en barras colectoras como suministro de energía conmutada o distribuida. Esto excluye, como buses, esquemas como RS-232 en serie , Centronics en paralelo , interfaces IEEE 1284 y Ethernet, ya que estos dispositivos también necesitaban fuentes de alimentación independientes. Los dispositivos de bus serie universal pueden utilizar la energía suministrada por el bus, pero a menudo utilizan una fuente de alimentación independiente. Esta distinción se ejemplifica con un sistema telefónico con un módem conectado , donde la conexión RJ11 y el esquema de señalización modulada asociado no se consideran un bus, y son análogos a una conexión Ethernet . Un esquema de conexión de línea telefónica no se considera un bus con respecto a las señales, pero la oficina central utiliza buses con conmutadores de barra cruzada para las conexiones entre teléfonos.
Sin embargo, esta distinción (que la energía la proporciona el bus) no se da en muchos sistemas de aviónica , donde las conexiones de datos como ARINC 429 , ARINC 629 , MIL-STD-1553B (STANAG 3838) y EFABus ( STANAG 3910 ) se denominan comúnmente "buses de datos" o, a veces, "buses de datos". Dichos buses de datos de aviónica se caracterizan generalmente por tener varios equipos o elementos/unidades reemplazables en línea (LRI/LRU) conectados a un medio común compartido . Pueden, como en el caso de ARINC 429, ser simplex , es decir, tener una única fuente LRI/LRU o, como en el caso de ARINC 629, MIL-STD-1553B y STANAG 3910, ser dúplex , es decir, permitir que todos los LRI/LRU conectados actúen, en momentos diferentes ( half duplex ), como transmisores y receptores de datos. [5]
La frecuencia o velocidad de un bus se mide en Hz, como MHz, y determina cuántos ciclos de reloj hay por segundo; puede haber una o más transferencias de datos por ciclo de reloj. Si hay una sola transferencia por ciclo de reloj, se conoce como Single Data Rate (SDR), y si hay dos transferencias por ciclo de reloj, se conoce como Double Data Rate (DDR), aunque el uso de señalización diferente a SDR es poco común fuera de la RAM. Un ejemplo de esto es PCIe que usa SDR. [6] Dentro de cada transferencia de datos puede haber múltiples bits de datos. Esto se describe como el ancho de un bus, que es el número de bits que el bus puede transferir por ciclo de reloj y puede ser sinónimo del número de conductores eléctricos físicos que tiene el bus si cada conductor transfiere un bit a la vez. [7] [8] [9] La velocidad de datos en bits por segundo se puede obtener multiplicando el número de bits por ciclo de reloj por la frecuencia por el número de transferencias por ciclo de reloj. [10] [11] Alternativamente, un bus como PCIe puede utilizar modulación o codificación como PAM4 [12] [13] [14] que agrupa 2 bits en símbolos que luego se transfieren en lugar de los bits mismos, y permite un aumento en la velocidad de transferencia de datos sin aumentar la frecuencia del bus. La velocidad/tasa de transferencia de datos efectiva o real puede ser menor debido al uso de codificación que también permite la corrección de errores, como la codificación 128/130b (b por bit). [15] [16] [17] La velocidad de transferencia de datos también se conoce como ancho de banda. [18] [19]
El bus de sistema más simple tiene líneas de datos de entrada, líneas de datos de salida y líneas de dirección completamente separadas. Para reducir costos, la mayoría de las microcomputadoras tienen un bus de datos bidireccional, que reutiliza los mismos cables para la entrada y la salida en diferentes momentos. [20]
Algunos procesadores utilizan un cable dedicado para cada bit del bus de direcciones, el bus de datos y el bus de control. Por ejemplo, el bus STEbus de 64 pines está compuesto por 8 cables físicos dedicados al bus de datos de 8 bits, 20 cables físicos dedicados al bus de direcciones de 20 bits, 21 cables físicos dedicados al bus de control y 15 cables físicos dedicados a varios buses de alimentación.
La multiplexación de bus requiere menos cables, lo que reduce los costos en muchos de los primeros microprocesadores y chips DRAM. Ya se mencionó un esquema de multiplexación común, la multiplexación de direcciones. Otro esquema de multiplexación reutiliza los pines del bus de direcciones como pines del bus de datos, [20] un enfoque utilizado por el PCI convencional y el 8086. Los diversos "buses seriales" pueden considerarse el límite máximo de la multiplexación, enviando cada uno de los bits de dirección y cada uno de los bits de datos, uno a la vez, a través de un solo pin (o un solo par diferencial).
Con el tiempo, varios grupos de personas trabajaron en varios estándares de bus de computadora, incluido el Comité de Estándares de Arquitectura de Bus IEEE (BASC), el grupo de estudio "Superbus" del IEEE, la iniciativa de microprocesadores abiertos (OMI), la iniciativa de microsistemas abiertos (OMI), la "Banda de los Nueve" que desarrolló EISA , etc. [ cita requerida ]
Los primeros buses de ordenador eran haces de cables que conectaban la memoria y los periféricos del ordenador . Se los denominaba anecdóticamente " tronco de dígitos " en el primer ordenador australiano CSIRAC , [21] y se los denominaba así por los buses de energía eléctrica o barras colectoras . Casi siempre había un bus para la memoria y uno o más buses separados para los periféricos. Se accedía a ellos mediante instrucciones separadas, con tiempos y protocolos completamente diferentes.
Una de las primeras complicaciones fue el uso de interrupciones . Los primeros programas informáticos realizaban la entrada y salida esperando en un bucle a que el periférico estuviera listo. Esto era una pérdida de tiempo para los programas que tenían otras tareas que hacer. Además, si el programa intentaba realizar esas otras tareas, podía tardar demasiado en volver a comprobarlas, lo que provocaba la pérdida de datos. Por tanto, los ingenieros hicieron que los periféricos interrumpieran la CPU. Las interrupciones debían priorizarse, porque la CPU solo puede ejecutar código para un periférico a la vez, y algunos dispositivos son más críticos en cuanto al tiempo que otros.
Los sistemas de alta gama introdujeron la idea de los controladores de canal , que eran esencialmente pequeñas computadoras dedicadas a manejar la entrada y la salida de un bus determinado. IBM los introdujo en el IBM 709 en 1958 y se convirtieron en una característica común de sus plataformas. Otros proveedores de alto rendimiento como Control Data Corporation implementaron diseños similares. En general, los controladores de canal harían todo lo posible para ejecutar todas las operaciones del bus internamente, moviendo datos cuando se sabía que la CPU estaba ocupada en otra parte si era posible y solo usando interrupciones cuando era necesario. Esto redujo en gran medida la carga de la CPU y proporcionó un mejor rendimiento general del sistema.
Para proporcionar modularidad, los buses de memoria y de E/S se pueden combinar en un bus de sistema unificado . [22] En este caso, se puede utilizar un único sistema mecánico y eléctrico para conectar entre sí muchos de los componentes del sistema o, en algunos casos, todos ellos.
Más tarde, los programas informáticos comenzaron a compartir memoria común a varias CPU. El acceso a este bus de memoria también debía priorizarse. La forma sencilla de priorizar las interrupciones o el acceso al bus era mediante una conexión en cadena . En este caso, las señales fluirían naturalmente a través del bus en orden físico o lógico, lo que eliminaría la necesidad de una programación compleja.
Digital Equipment Corporation (DEC) redujo aún más el costo de las minicomputadoras producidas en masa y asignó los periféricos al bus de memoria, de modo que los dispositivos de entrada y salida parecieran ubicaciones de memoria. Esto se implementó en el Unibus del PDP-11 alrededor de 1969. [23]
Los primeros sistemas de bus de microcomputadoras eran esencialmente una placa base pasiva conectada directamente o a través de amplificadores de búfer a los pines de la CPU . La memoria y otros dispositivos se añadían al bus utilizando los mismos pines de dirección y datos que utilizaba la propia CPU, conectados en paralelo. La comunicación estaba controlada por la CPU, que leía y escribía datos de los dispositivos como si fueran bloques de memoria, utilizando las mismas instrucciones, todo sincronizado por un reloj central que controlaba la velocidad de la CPU. Aun así, los dispositivos interrumpían a la CPU enviando señales a pines de CPU separados.
Por ejemplo, un controlador de unidad de disco indicaba a la CPU que había nuevos datos listos para ser leídos, momento en el cual la CPU movía los datos leyendo la "ubicación de memoria" que correspondía a la unidad de disco. Casi todos los primeros microordenadores se construyeron de esta manera, empezando por el bus S-100 del sistema informático Altair 8800 .
En algunos casos, especialmente en la IBM PC , aunque se puede emplear una arquitectura física similar, las instrucciones para acceder a los periféricos ( in
y out
) y a la memoria ( mov
y otros) no se han uniformizado en absoluto, y aún generan señales de CPU distintas, que podrían usarse para implementar un bus de E/S separado.
Estos sistemas de bus simples tenían un serio inconveniente cuando se utilizaban para computadoras de uso general: todos los equipos del bus tenían que comunicarse a la misma velocidad, ya que compartían un solo reloj.
Aumentar la velocidad de la CPU se hace más difícil, porque la velocidad de todos los dispositivos también debe aumentar. Cuando no es práctico o económico tener todos los dispositivos tan rápidos como la CPU, la CPU debe entrar en un estado de espera o trabajar a una frecuencia de reloj más lenta temporalmente, [24] para comunicarse con otros dispositivos en la computadora. Si bien es aceptable en sistemas integrados , este problema no se toleró durante mucho tiempo en computadoras de propósito general y expandibles por el usuario.
Estos sistemas de bus también son difíciles de configurar cuando se construyen a partir de equipos comunes disponibles comercialmente. Normalmente, cada tarjeta de expansión agregada requiere muchos puentes para configurar direcciones de memoria, direcciones de E/S, prioridades de interrupción y números de interrupción.
Los sistemas de bus de "segunda generación", como NuBus, solucionaron algunos de estos problemas. Por lo general, separaban el ordenador en dos "mundos": la CPU y la memoria en un lado, y los distintos dispositivos en el otro. Un controlador de bus aceptaba los datos del lado de la CPU para que se movieran al lado de los periféricos, trasladando así la carga del protocolo de comunicaciones de la propia CPU. Esto permitió que la CPU y el lado de la memoria evolucionaran por separado del bus de dispositivos, o simplemente "bus". Los dispositivos del bus podían comunicarse entre sí sin la intervención de la CPU. Esto condujo a un rendimiento "en el mundo real" mucho mejor, pero también requirió que las tarjetas fueran mucho más complejas. Estos buses también solucionaron a menudo los problemas de velocidad al ser "más grandes" en términos del tamaño de la ruta de datos, pasando de buses paralelos de 8 bits en la primera generación a 16 o 32 bits en la segunda, así como añadiendo una configuración de software (ahora estandarizada como Plug-n-play ) para suplantar o reemplazar los puentes.
Sin embargo, estos sistemas más nuevos compartían una cualidad con sus primos anteriores, en el sentido de que todos los que estaban en el bus tenían que hablar a la misma velocidad. Mientras que la CPU ahora estaba aislada y podía aumentar la velocidad, las CPU y la memoria seguían aumentando su velocidad mucho más rápido que los buses con los que se comunicaban. El resultado fue que las velocidades del bus ahora eran mucho más lentas que las que necesitaba un sistema moderno, y las máquinas se quedaban sin datos. Un ejemplo particularmente común de este problema fue que las tarjetas de video superaron rápidamente incluso a los sistemas de bus más nuevos como PCI , y las computadoras comenzaron a incluir AGP solo para controlar la tarjeta de video. En 2004, AGP fue superado nuevamente por las tarjetas de video de alta gama y otros periféricos y fue reemplazado por el nuevo bus PCI Express .
Cada vez más dispositivos externos empezaron a utilizar sus propios sistemas de bus. Cuando se introdujeron las unidades de disco, se añadían a la máquina con una tarjeta conectada al bus, por eso las computadoras tienen tantas ranuras en el bus. Pero durante los años 1980 y 1990, se introdujeron nuevos sistemas como SCSI e IDE para satisfacer esta necesidad, dejando vacías la mayoría de las ranuras en los sistemas modernos. Hoy en día, es probable que haya unos cinco buses diferentes en la máquina típica, que admiten varios dispositivos. [ cita requerida ]
Los buses de "tercera generación" han ido apareciendo en el mercado desde aproximadamente 2001, incluyendo HyperTransport e InfiniBand . También tienden a ser muy flexibles en términos de sus conexiones físicas, lo que permite que se los use como buses internos, así como para conectar diferentes máquinas entre sí. Esto puede llevar a problemas complejos cuando se intenta dar servicio a diferentes solicitudes, por lo que gran parte del trabajo en estos sistemas se refiere al diseño de software, en lugar del hardware en sí. En general, estos buses de tercera generación tienden a parecerse más a una red que al concepto original de bus, con una mayor sobrecarga de protocolo necesaria que los primeros sistemas, al mismo tiempo que permiten que varios dispositivos utilicen el bus a la vez.
Autobuses como Wishbone han sido desarrollados por el movimiento de hardware de código abierto en un intento de eliminar aún más las restricciones legales y de patentes en el diseño de computadoras.
Compute Express Link (CXL) es una interconexión de estándar abierto para CPU a dispositivo y CPU a memoria de alta velocidad , diseñada para acelerar el rendimiento del centro de datos de próxima generación . [25]
Muchos buses de campo son buses de datos seriales (que no deben confundirse con la sección de "bus de datos" paralelo de un bus de sistema o tarjeta de expansión ), varios de los cuales utilizan las características eléctricas RS-485 y luego especifican su propio protocolo y conector:
Otros buses seriales incluyen:
El bus interno de la computadora es un esquema de transmisión en paralelo; dentro de la computadora...