Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 130

FUNCIONAMIENTO DE LOS BUSES DE DATOS, DIRECCION Y

CONTROL
¿QUE ES UN BUS?
La familia de ordenadores PC interconexiona toda la circuiteria de control interna
mediante un diseño de circuito, conocido con el nombre de bus.
Es el conjunto de líneas (cables) de hardware utilizados para la transmisión
de datos entre los componentes de un sistema informático. Un bus es en esencia una
ruta compartida que conecta diferentes partes del sistema como el procesador, la
controladora de unidad de disco, la memoria y los puertos de entrada, salida,
permitiéndoles transmitir información.
El bus, por lo general supervisado por el microprocesador, se especializa en
el transporte de diferentes tipos de información.
Por ejemplo, un grupo de cables (en realidad trazos sobre una placa de circuito
impreso) transporta los datos, otro las direcciones (ubicaciones) en las que puede
encontrarse información específica, y otro las señales de control para asegurar que
las diferentes partes del sistema utilizan su ruta compartida sin conflictos.
Los buses se caracterizan por el número de bits que pueden transmitir en un
determinado momento. Un equipo con un bus de 8 bits de datos, por ejemplo,
transmite 8 bits de datos cada vez, mientras que uno con un bus de 16 bits de datos
transmite 16 bits de datos simultáneamente.
El Bus se refiere al camino que recorren los datos desde una o varias fuentes hacia
uno o varios destinos y es una serie de hilos contiguos. En el sentido estricto de la
palabra, esta definición sólo se aplica a la interconexión entre el procesador y
los periféricos.

Generalmente los puertos y registros almacenan sólo uno o dos bytes de información
a la vez, y se utiliza normalmente como lugares de parada intermedia para los datos,
que se están enviando de un lugar a otro.
Siempre que se utiliza una posición de memoria, o un puerto, como lugar
de almacenamiento, su localización está marcada por una dirección que la identifica
individualmente. Cuando el dato está listo para ser transferido, se transmite primero
su dirección de destino por el bus de direcciones; el dato sigue a la zaga por el bus
de datos.
Por tanto, el bus transporta algo más que datos. Lleva información de control, tales
como las señales de temporización (del sistema reloj), las señales de interrupción,
así como las direcciones de las miles de posiciones que forman tanto la memoria
como los dispositivos que están conectados al bus.
Para diferenciar estas cuatro funciones diferentes, el bus está dividido en cuatro
partes: líneas de potencia, bus de control, bus de direcciones y bus de datos.
La información codificada viaja a través de la computadora por un bus.

FUNCIONAMIENTO

Bus paralelo
Es un bus en el cual los datos son enviados por bytes al mismo tiempo, con la ayuda
de varias líneas que tienen funciones fijas. La cantidad de datos enviada es bastante
grande con una frecuencia moderada y es igual al ancho de los datos por la
frecuencia de funcionamiento. En los computadores ha sido usado de manera
intensiva, desde el bus del procesador, los buses de discos duros, tarjetas de
expansión y de vídeo, hasta las impresoras.

Diagrama de un Bus Backplane como extensión del bus de procesador.

El Front Side Bus de los procesadores Intel es un bus de este tipo y como cualquier
bus presenta unas funciones en líneas dedicadas:

 Las Líneas de Dirección son las encargadas de indicar la posición de memoria


o el dispositivo con el que se desea establecer comunicación.
 Las Líneas de Control son las encargadas de enviar señales de arbitraje entre
los dispositivos. Entre las más importantes están las líneas de interrupción, DMA y
los indicadores de estado.
 Las Líneas de Datos trasmiten los bits de forma aleatoria de manera que por
lo general un bus tiene un ancho que es potencia de 2.
Un bus paralelo tiene conexiones físicas complejas, pero la lógica es sencilla, que lo
hace útil en sistemas con poco poder de cómputo. En los primeros
microcomputadores, el bus era simplemente la extensión del bus del procesador y los
demás integrados "escuchan" las línea de direcciones, en espera de recibir
instrucciones. En el PC IBM original, el diseño del bus fue determinante a la hora de
elegir un procesador con I/O de 8 bits (Intel 8088), sobre uno de 16 (el 8086), porque
era posible usar hardware diseñado para otros procesadores, abaratando el producto.

Sistemas operativos y arquitecturas de 32 y 64 bits


5 febrero, 2011vjavierfDeja un comentarioGo to comments

Llevo un tiempo dándole vueltas a este post y por fin a visto la luz. Espero que después de
su lectura hayas aprendido algo nuevo, te haya aclarado las ideas y te sea útil a la hora de
elegir un sistema operativo en consonancia con el cerebro de tu ordenador.

LA ARQUITECTURA DE UN ORDENADOR.
La arquitectura de un ordenador está constituida por la arquitectura de su conjunto de
instrucciones o ISA (del inglés Instruction Set Architecture) y su microarquitectura.
Arquitectura del ordenador = Arquitectura del conjunto de instrucciones (ISA) +
Microarquitectura

La arquitectura del conjunto de instrucciones (ISA) es una imagen abstracta del


sistema de computación tal como sería visto por un programador en lenguaje máquina, e
incluye el conjunto de instrucciones, modos de direccionamiento, registros y formatos de
direcciones y datos soportados por el procesador o CPU (del inglés Central Processing Unit).
Los procesadores, y por extensión los ordenadores, quedan definidos por tanto en base a la
arquitectura del conjunto de instrucciones que implementan, así podemos encontrar
referencias a procesadores u ordenadores de tipo CISC, RISC o SISC:

 CISC (Complex Instruction Set Computer).


 RISC (Reduced Instruction Set Computer).
 SISC (Specific Instruction Set Computer).
En arquitectura de computadoras, 16 bits, 32 bits o 64 bits es un adjetivo usado para
describir enteros, direcciones de memoria u otras unidades de datos que comprenden hasta
16 bits, 32 bits o 64 bits de ancho. En el tema que nos ocupa, se utilizan para referirse a una
arquitectura de procesador basadas en registros, bus de direcciones o bus de datos que
permiten procesar (interna y externamente) datos de ese ancho.
Diferentes familias de procesadores pueden tener diferentes ISA, por este motivo, un
programa compilado para un tipo de máquina no podrá ejecutarse en otra con un conjunto
de instrucciones diferentes. Del mismo modo, un procesador con una arquitectura de 32 bits
no podrá ejecutar un sistema operativo u otra aplicación compilada para una
arquitectura/procesador de 64 bits. Sin embargo, por compatibilidad hacia atrás, lo inverso
suele ser posible, es decir, podemos ejecutar aplicaciones de 32 bits en procesadores de 64
bits.
La microarquitectura, en cambio, es de nivel más inferior, más concreto. Muestra las
partes constituyentes del sistema y cómo se interconectan e interoperan, para así
implementar la especificación de la arquitectura. La microarquitectura generalmente es
representada empleando un digrama de bloques que describe las interconexiones entre
registros, buses y bloques funcionales de la máquina.

Diagrama de bloques de la microarquitectura Intel Nehalem


Diferentes ordenadores podrían tener una misma arquitectura del conjunto de instrucciones,
y así ser capaces de ejecutar los mismos programas, sin embargo, pueden tener diferentes
microarquitecturas. Esas diferentes microarquitecturas (junto con los avances en las
tecnologías de fabricación de semiconductores) son las que permiten nuevas generaciones de
procesadores que permiten alcanzar mejores niveles de rendimiento
o performance comparadas con las generaciones previas.
Por otra parte, las construcciones de hardware, el esquema físico del circuito y otros detalles
físicos son llamados implementación de esa microarquitectura. Dos máquinas pueden
tener la misma microarquitectura, y por lo tanto el mismo diagrama de bloques, pero
diferentes implementaciones del hardware.
Die Nehalem
ARQUITECTURAS INTEL Y AMD DE 32 Y 64 BITS.
Cuando buscamos información sobre arquitecturas de 32 y 64 bits de Intel y AMD podemos
terminar realmente mareados y confusos entre tantos términos que, en principio, parecen
iguales pero en el fondo no lo son, o que nos llevan a pensar una cosa totalmente errónea. A
modo de ejemplo, ¿las arquitecturas IA-32 e IA-32e son la misma arquitectura? ¿las dos
arquitecturas (IA-32 e IA-32e) son de 32 bits? ¿es la arquitectura x86-64 una arquitectura
de Intel cómo lo es la arquitectura x86-32? ¿i386, x86-32, x86 e IA-32 son lo mismo? ¿es lo
mismo x86-64, x64 e IA-64? ¿es lo mismo IA-64 e Intel 64?

Vamos a aclarar un poco las cosas…

IA-32 (Intel Architecture, 32 bits) es la arquitectura del conjunto de instrucciones de los


procesadores de Intel 80×86 y de los primeros microprocesadores de AMD. IA-32 fue una
extensión de 32 bits, implementada por primera vez en 1986 en el procesador Intel 80386,
sucesor de los antiguos procesadores Intel 8086, 8088, 80186 y 80286 de 16-bit y el
denominador común de todos los diseños 80×86 subsiguientes (80486, 80586, 80686). Por
este motivo, también es conocida de manera genérica como arquitectura i386, x86-32 o x86,
aunque bajo esta última denominación (x86), y también como x86-16, se suele incluir a los
procesadores Intel de 16 bits.
El salto a los 64 bits se produjo con la aparición de una nueva extensión en el año 2000
derivada de IA-32 llamada x86-64, desarrollada por AMD y posteriormente renombrada
aAMD64 (el primer procesador con soporte para este conjunto de instrucciones fue el
Opteron). Mas tarde, en el 2004, esta arquitectura extendida fue adoptada por Intel, el
nuevo conjunto de instrucciones recibió el acrónimo EM64T (“Extended Memory 64
Technology”), cuyo nombre código fue Yamhill o IA-32e, y posteriormente fue renombrado
adoptando el nombre definitivo de Intel 64 (arquitectura utilizada por primera vez a
principios del 2005 con el Pentium 4). A estas arquitecturas de 64 bits se las conoce de
manera genérica como x86-64 o x64, y no debemos confundirlas con la arquitectura IA-64
de 64-bits.
La arquitectura IA-64 (Intel Arquitecture, 64 bits) de Intel (perogrullada), fue lanzada en
1999, y no es directamente compatible con el conjunto de instrucciones IA-32 (excepto bajo
emulación software) como sí sucede en el caso de las arquitecturas Intel 64 y AMD64. IA-64
es la arquitectura utilizada por la línea de procesadores Itanium e Itanium 2, por lo que
inicialmente fue conocida por el nombre de Intel Itanium Architecture.
Resumiendo:

Arquitectura: Conocida inicialmente como: Nombre genérico Bits:


IA-32 - i386, x86-32, x86 32 bits
AMD64 x86-64 (Hammer) x86-64, x64 64 bits
Intel 64 EM64T (Yamhill o IA-32e) x86-64, x64 64 bits
IA-64 Itanium Architecture - 64 bits

OTRAS ARQUITECTURAS.
Además de las arquitecturas de Intel y AMD existen otras muchas, entre las más conocidas:
 SPARC (del inglés Scalable Processor ARChitecture) es una arquitectura RISC originalmente
diseñada por Sun Microsystems y que podemos encontrar en los procesadores de Sun (ahora
Oracle).
 PowerPC (usualmente abreviada PPC) es el nombre de la arquitectura de computadoras de
tipo RISC desarrollada por IBM, Motorola y Apple. Los procesadores de esta familia son
utilizados principalmente en ordenadores Macintosh de Apple hasta el año 2006 y en varios
modelos IBM.
 ARM (Advanced RISC Machines) es una familia de microprocesadores RISC diseñados por la
empresa Acorn Computers y desarrollados por Advanced RISC Machines Ltd., una empresa
derivada de la anterior.
 PA-RISC es el nombre por el que se conoce una arquitectura de microprocesadores
desarrollada por sistemas Hewlett-Packard y VLSI Technology Operation. Esta arquitectura
se basa en el modelo RISC y en PA (Precision Architecture). También se suelen referir a ella
como la arquitectura HPPA (Hewlett Packard Precision Architecture). Los primeros PA-RISC
fueron dispositivos de 32 bits. El diseño fue actualizado en 1996 dando lugar a la versión 2.0
de la arquitectura. Esta nueva versión era una arquitectura de 64 bits.
 Alpha es una arquitectura de microprocesadores diseñada por DEC e introducida en 1992
bajo el nombre AXP. Cuenta con un juego de instrucciones RISC de 64 bits, pero también
puede manejar datos de 32, 16 bits y por último de 8 bits.
APROVECHANDO LAS VENTAJAS DE UNA ARQUITECTURA DE 64 BITS.
En la arquitectura de ordenadores, el término 16, 32 o 64 bits suele hacer referencia, como
hemos visto, al diseño del procesador, pero también esta relacionado con el tamaño de los
buses (de datos, de dirección y de control) del equipo. Centrándonos en la arquitectura de
64 bits, una CPU de 64 bits puede calcular tareas individuales más rápido que un procesador
de 32 bits y puede direccionar una cantidad de memoria considerablemente superior al límite
de 4GB impuesto por los procesadores de 32 bits.

Las ventajas del hardware de 64 bits solo se pueden aprovechar al máximo si el software
que se instala está diseñado para usar todas las características del hardware. El software
diseñado para equipos de 32 bits, aunque es compatible con una arquitectura de 64 bits,
ofrecerá pocas o ninguna de las ventajas deseadas cuando se instala en un equipo de 64
bits. Por esta razón siempre que sea posible conviene utilizar software de 64 bits sobre
hardware de 64 bits.

Llegados a este punto, seguro que te estarás preguntando…

¿PERO PARA QUE SIRVE TODO ESTO?


Supongamos que queremos instalar una distribución GNU/Linux en nuestro ordenador y nos
decantamos por Mandriva Linux Free 2010.2. En su página de descarga tendremos la
posibilidad de elegir entre una versión de 32 bits o de 64 bits:
Sabiendo si el procesador de nuestro ordenador es de 32 bits o de 64 bits tendremos claro
por qué opción decantarnos.

Supongamos ahora que la distribución elegida es Ubuntu 10.10 y deseamos descargar su CD


utilizando BitTorrent. En la página de descarga encontraremos los siguientes enlaces:

Página alternativa de descarga de Ubuntu 10.10 con BitTorrent


Ahora la cosa se complicaría un poco, podemos ver referencias a amd64 e i386 en los
enlaces. Resulta que tengo un procesador Intel de 64 bits, pero eso de amd64 me suena a
microprocesadores AMD, así que me decanto por el enlace ubuntu-10.10-alternate-
i386.iso.torrent. En este caso la opción sería poco acertada, ya que estarías instalando una
versión de Ubuntu de 32 bits sobre una arquitectura de 64 bits, desaprovechando sus
ventajas. La opción correcta hubiese sido hacer clic en el enlace ubuntu-10.10-alternate-
amd64.iso.torrent ya que, aunque se trata de una arquitectura desarrollada por AMD, es
compatible con los micros de Intel. Si nuestro micro fuese de 32 bits la opción correcta
habría sido ubuntu-10.10-alternate-i386.iso.torrent.
La mayor complicación viene cuando la distribución elegida es Debian:
Como vemos tenemos un bonito listado de arquitecturas de entre las cuales tendremos que
elegir una para nuestro ordenador, en función de si este integra un microprocesador Intel
(Itanium o no), AMD, Alpha, Sparc… y si, en el caso de los dos primeros, es de 32 bits o 64
bits… ¿Sabrías cual elegir? Espero que este post te ayude a hacerlo.

Enlaces relacionados:
 List of Intel CPU microarchitectures
 List of AMD CPU microarchitectures
 Intel Microprocessor Quick Reference Guide
 List of Intel microprocessors
 List of AMD microprocessors
 10stripe – The Big Processor Guide
 Comparison of CPU architectures
Tu opinión es importante, por favor, si has llegado hasta aquí, dedica 2 segundos a darme tu
opión sobre el blog. Gracias.

De los 32 a
los 64 bits:
ventajas y
desafíos de
la
transición
de una
arquitectur
a

 455
 Twitter

 E-mail

GUARDAR

138 COMENTARIOS

PUBLICIDAD

TE RECOMENDAMOS

Intel quiere que tus próximos cascos se conecten a través de un puerto USB-C


Lo nuevo de Dyson no es un ventilador, es un secador de pelo "sin aspas" de
400 euros

11 lugares a los que la tecnología ha convertido en turísticos

Compartir

 455

 Twitter

 Email
14 Octubre 2013 PABLO ESPESO @whiskito

Este año hemos vivido la entrada del mundo móvil a los 64 bits, y
esperamos que de cara a 2014 llegue la implantación masiva de
esta tecnología. Una evolución que ya conocemos en sistemas de
escritorio y, por tanto, podemos echar la mirada atrás para
recordar lo que ocurrió por aquél 2003.

¿Qué son los 64 bits y qué implicaciones conllevan? ¿En qué


medida afectan al rendimiento? Hoy entenderemos qué
significan esos 64 bits, explicaremos lo que representan y los
beneficios que podemos llegar a obtener.

¿Qué son esos 64 bits?

Antes de entrar en materia es necesario repasar algunos


conceptos fundamentales. El primero, ¿qué es un bit?

Según DRAE: bit. (Del ingl. bit, acrón. de binary digit 'dígito
binario'). 1. m. Inform. Unidad de medida de información
equivalente a la elección entre dos posibilidades igualmente
probables.
Un bit es la esencia de la informática

En informática un bit es la unidad mínima de información y


puede tomar dos valores, generalmente 0 o 1. Un bit es cero o es
uno, sin otras posibilidades. Otra forma de decir lo mismo es
hablar de falso o verdadero; un bit puede ser falso (generalmente
asignado como valor 0) o verdadero (valor 1).

Cuando hablamos de 64 bits nos referimos a que existen 64


elementos que pueden ser 0 o 1 cada una de ellos. Con esto, una
cadena de 64 bits de ejemplo sería la siguiente:

0010101010110101101101011010110110100110111011100011101011101101

Que se trata de un número en representación binaria. Si lo


convertimos a decimal nos encontraremos con
el 3077565677812202221. Un número exageradamente grande, sí.
Como referencia, una cadena de 64 bits puede contener números
entre0 y 2^(64)-1, aproximadamente 1,18x(10^19). Nos puede
servir para representar información numérica, pero también otro
tipo de información: una cadena de bits está generalmente
asociada al tamaño de los registros o a las direcciones de
memoria. Esto último es importante, y lo trataremos más
adelante.

Los alumnos

¿Qué usos puede tener una cadena de 64 bits como la anterior? Si


pensamos en la vida real podemos plantear la siguiente
problemática: tenemos 64 alumnos de un colegio y queremos
almacenar cuál es el género de cada uno de ellos para tenerlo
disponible en nuestro ordenador.

Con esto, lo primero que debemos hacer es ordenar


alfabéticamente a todos los niños, por ejemplo con el primero de
sus apellidos. Tras ello podemos utilizar el siguiente código:

Si es un niño, se le asignará un 0
Si es una niña, se le asignará un 1

Ahora recordemos los primeros cinco dígitos de la cadena


anteriormente utilizada:00101[…]. Rápidamente se puede concluir
que los dos primeros alumnos de nuestra lista ordenada por
apellido serán niños, irán seguidos por una niña, otro niño y una
niña más. Algo así:

Alonso, Felipe
Álvarez, Juan
Benitez, Beatriz
Castillo, Pablo
Canales, Lourdes
[…]
Y seguiríamos hasta el niño número 64 que, por cierto, sería una
niña (Alba Zamora, quizá). Evidentemente este es un ejemplo muy
sencillo pero que nos sirve a la perfección para entender la base
de funcionamiento. El siguiente paso que debemos dar es cambiar
nuestro registro de 64 bits por uno de 32.

Pasémonos a los 32 bits

Si tenemos 64 niños podríamos haber almacenado toda la


información del género en una única cadena cuya longitud sería,
precisamente, 64 bits. ¿Qué ocurre si en vez de 64 bits
utilizamos 32 bits? A priori la medida es tan simple como acortar
el tamaño que utilizamos, y hacer uso de tantos registros de 32
bits como sean necesarios en vez de los de 64.

Con 32 bits, nuestros 64 alumnos tendrían que utilizar dos


cadenas en vez de una. Serían, justamente, las dos siguientes:

00101010101101011011010110101101

10100110111011100011101011101101

Guardamos la misma información en el mismo orden. ¿El mismo


orden? ¿Seguro? Parece que sí, pero ¿y si por algún error
cambiamos las dos filas de 32 bits?

10100110111011100011101011101101

00101010101101011011010110101101

Con este cambio tan sencillo nos hemos cargado toda la


mecánica, pues ahora Felipe Alonso será una niña y Lourdes
Canales un niño.
Para solucionar esta problemática podemos hacer uso de lo que
generalmente se denomina cabecera de datos. Los 32 bits (y
antes los 64 bits) no se usan por completo para almacenar la
información que nosotros queramos, si no que se guarda un
espacio para poder obtener cierta información fundamental. En
este caso sería interesante guardar un bit para determinar el
orden: cuál de las dos cadenas binarias es la primera, y cuál es la
segunda. Por ejemplo, podemos asignarle el valor 0 a la primera
cadena, y 1 a la segunda:

0-00101010101101011011010110101101

1-10100110111011100011101011101101

Sin embargo, si os fijáis bien, nos hemos salido de los 32 bits, ya


que ahora utilizamos 33: 1 dígito para determinar la posición de la
fila de bits junto con otros 32 dígitos para los alumnos. 33+33 =
66. Si utilizásemos cadenas de 32 bits necesitaríamos un total de
tres, que podemos determinar reubicando ciertos bits (alumnos);
en nuestro caso el último de cada fila lo añadimos al principio de
la siguiente fila:

0-0010101010110101101101011010110

1-1101001101110111000111010111011

X-01

Esa X es un nuevo problema que nos encontramos. Un bit sólo


puede registrar 0 o1, con lo que si añadimos una nueva fila (la
tercera) deberíamos asignarle el siguiente valor al 1, que en
binario sería 10. Esto son dos bits y es necesario almacenar otro bit
en la cabecera para así ahora poder tener tres cadenas de bits:

00-0010101010110101101101011010110

01-1101001101110111000111010111011

10-01
Hemos añadido un nuevo bit en nuestra cabecera y ahora ya
tenemos claro el orden de cada cadena. ¿Lo malo? Que nos
hemos vuelto a pasar y almacenamos más de los 32 bits
permitidos: 2+31=33 bits en cada cadena. Tenemos que volver a
desplazar y mover ciertos alumnos (en nuestro caso los últimos)
para reasignarlos en la siguiente cadena:

00-001010101011010110110101101011

01-011010011011101110001110101110

10-1101

Por ahora ya hemos terminado con este sencillo ejemplo. Los


lectores más avanzados habrán observado que utilizando 2 bits
para determinar la posición de la fila podemos tener un total de 4
filas ordenadas, definidas por 00, 01, 10 y 11que, en formato
decimal, indican 0, 1, 2 y 3. Dado que estemos permitiendo un total
de 30 bits para los alumnos, podríamos tener hasta 120 (30x4)
alumnos almacenados mediante este sistema. ¿Y si queremos
almacenar 121 alumnos? ¿O 125? La respuesta tendrá que
pensarla cada uno.

Conclusión

Inicialmente hemos planteado un único problema: tenemos 64


alumnos y queremos almacenar su género. Para ello podemos
ordenarlos alfabéticamente a todos según el apellido, y asignarle
un 0 a los niños y un 1 a las niñas.

Con registros de 64 bits la implicación es directa: un bit para


cada alumno. Tendremos una única cadena y no necesitamos más
información.
Con registros de 32 bits podemos pensar que inicialmente
necesitamos dos de ellos, cuando en realidad necesitamos, al
menos, tres: es necesario determinar el orden, algo que puede
parecer nimio pero que es vital, pues como no tengamos esas
cadenas bien ordenadas la información almacenada será
incorrecta.

¿Dónde utilizamos los 'bits'? Las


arquitecturas de 64 bits

Cuando hablamos de 64 bits nos referimos, generalmente, al


tamaño de cualquier estructura de datos que, en este caso,
permite almacenar 64 bits de 'algo'. Puede ser el género de un
alumno, su edad o su estatura. En estos dos últimos casos
debemos tener en cuenta que cada alumno ocupa más de un bit,
ya que la información no puede ser representada sólo con 0 o 1.

Cortex-A57, uno de los primeros ARM 64 bits que saldrán al mercado


En las últimas semanas se ha hablado mucho sobre arquitectura
de 64 bits con el lanzamiento del iPhone 5S que es considerado
el primer smartphone con esos 64 bits. ¿Qué significan esos '64
bits'?

Decimos que un procesador tiene una arquitectura de 64 bits


cuando sus registros tienen espacio para almacenar 64 bits.
'Registro' es una palabra que silenciosamente hemos utilizado
anteriormente, y que técnicamente se refiere a un pequeño
espacio de almacenamiento físico dentro de los procesadores
donde se pueden guardar 64 0 o 1. Existen registros por
prácticamente cualquier componente, ya sean de 64 bits o de otro
tamaño.

La mejor y más sencilla representación para un registro de 64 bits


sería, simplemente, 64 huecos numerados (del 0 al 63), con espacio
para almacenarceros o unos. De forma homóloga, un procesador
con arquitectura de 32 bits maneja registros de 32 bits.
Cuatro registros de 4 bits cada uno, cortesía de Ikea

Un montón de registros en una oficina de USPS (vía Wikipedia)

Un procesador de 64 bits puede gestionar mayor cantidad de


información que uno de 32 bits, ya que sus registros son de
mayor tamaño. Pero claro, que un procesador tenga registros de
64 bits no implica directamente que vaya a aprovechar todos ellos
al máximo: como es habitual, es necesario que el sistema
operativo sea compatible y que el software pueda sacarle
partido a los nuevos tamaños.

Si nos ceñimos al iPhone 5S, incorpora una versión específica de


iOS 7 compatible con 64 bits. Esta compatibilidad es necesaria
para que el sistema pueda tratar y operar con registros de 64 bits,
en vez de los 32 más habituales. Volviendo a un ejemplo real
podemos imaginar una bandeja con 64 huecos donde ponemos
elementos (por ejemplo patatas y cebollas para hacer una tortilla)
que más adelante cortará un robot. Si ese robot tiene 64 brazos y
es capaz de gestionar todos los elementos a la vez, perfecto; si
sólo tiene 32 brazos tendremos que realizar dos pasadas, e
incluso si no está preparado para gestionar esas dos pasadas es
posible que la mitad de los elementos no lleguen a manipularse
nunca y, por tanto, nuestro sistema será inválido.

Los 64 bits son importantes para un componente fundamental de


los sistemas operativos: el direccionamiento de memoria. El
microprocesador de un computador (sobremesa, portátil,
smartphone, cualquiera) está continuamente determinando dónde
leer y escribir información dentro del dispositivo de
almacenamiento, y estas operaciones se realizan a través de
cadenas de bits que guardan cierta información (en la cabecera)
para evitar errores, colisiones, etc. Un breve resumen sobre el
funcionamiento del direccionamiento de memoria en Intel x86 de
64 bits (denominado x86-64) puede encontrarse en Wikipedia,
aunque las referencias oficiales las tiene Intel en su página web en
un enorme manual de unos cuantos miles de páginas.
Repercusiones en nuestros móviles

iPhone 5S es el primero en llegar a la meta de los 64 bits


en smartphones, pero no será el único. ARM está preparando
los Cortex-A53 y A57 de 64 bits que previsiblemente llegarán al
mercado de cara al próximo año. Los sistemas operativos tendrán
que actualizarse para ofrecer la compatibilidad con los nuevos
tamaños de los registros, por supuesto.

DADO QUE SE AMPLÍAN LOS REGISTROS EL


PROCESADOR ES CAPAZ DE HACER MÁS EN
MENOS TIEMPO, UTILIZANDO MENOS CICLOS DE
RELOJ

Que un sistema sea de 64 o de 32 bits es algo completamente


transparente al usuario, y las mejoras que pueden producirse
serían a nivel de funcionamiento interno del sistema. Dado que se
amplían los registros, el procesador es capaz de hacer más en
menos tiempo, utilizando menos ciclos de reloj y, por tanto,
consumiendo menos energía. Si estos conceptos os suenan
extraños podéis echarle un vistazo anuestro especial CISC frente a
RISC, donde los explicamos junto al genialalgoritmo de la tortilla
de patata.

Si bien la teoría dicta lo que hemos expuesto en el párrafo


anterior, la práctica es mucho más compleja. Un smartphone suele
operar muchas pequeñas cadenas de datos al tener multitud de
pequeños procesos ejecutándose en segundo plano. Además, si
nos centramos en el consumo energético, tiene otros
componentes que afectan de forma mucho más notable a la
autonomía del smartphone como la pantalla y su luminosidad. El
salto a los 64 bits es una evolución natural que repercutirá en
una cierta mayor rapidez a la hora de procesar información (por
ejemplo al añadir un filtro a una fotografía), pero que en el uso
cotidiano apenas aportará diferencias respecto de lo que
conocemos, pues salvo alguna excepción el software más
convencional no requiere de esta evolución.

Si nos fijamos en el rendimiento podemos acudir a los siempre


geniales análisis de AnandTech, donde en esta ocasión hablan de
la ejecución de varios algoritmosen sus versiones de 32 y 64
bits. La mejora obtenida depende enormemente del tipo de
algoritmo que se utilice, aunque sí puede concluirse que en
general se obtendrá una diferencia bastante significativa en torno
al 30%, excluyendo algunas pruebas en las que se obtienen cifras
superiores al 800%.
Pero esto son algoritmos teóricos y pruebas puntuales, los
denominadosbenchmarks. En aplicaciones de uso general las
cosas cambian radicalmente, ya que el software de uso diario
está lejos de ser tan exigente. Aún es necesario que muchos
desarrolladores actualicen sus respectivas aplicaciones a los 64
bits, con lo que todavía no podemos determinar el porcentaje de
mejora debido al salto de los 32 a 64 bits. También hay que sumar
otro problema, y es que iPhone 5S no sólo realiza la evolución a
los 64 bits, si no que también utiliza un procesador renovado
Apple A7 con diferentes núcleos y un nuevo juego de
instrucciones respecto del A6 anterior.
Un vistazo al pasado: esto ya ocurrió hace
diez años

La evolución de los 32 a los 64 bits no es nueva. Los 64 bits ya


llegaron a los procesadores de PC en 2003.

A pesar de que Intel es la principal desarrolladora de la


arquitectura x86, fue AMDquien en 1999 empezó a desarrollar
una extensión de 64 bits sobre la IA32 de Intel. La finalizaron en
agosto del año 2000 y pusieron el primer procesador
compatible AMD 'Opteron' en 2003. Poco después llegó la
primera CPU doméstica preparada para 64 bits, AMD Athlon 64
3200+ de un núcleo a 2.0 GHz., proceso de manufactura de 130
nanómetros.

AMD Athlon 64 3200+, según el análisis del 2003 de XbitLabs


EN 2003, UNO DE LOS PROBLEMAS MÁS
COMUNES FUE LA COMPATIBILIDAD DEL
SOFTWARE Y EL SISTEMA OPERATIVO

A pesar de que el hardware ya estaba preparado, el software aún


llevaba un par de años de desventaja. Microsoft lanzó Windows
XP 64 bit Edition en 2005, cuatro años más tarde del original de
32 bits de 2001 y con dos de retraso respecto de los Athlon 64.
Uno de los problemas más comunes era la compatibilidad del
software con el sistema operativo, pues en el sistema de 32 bits
no podías instalar programas de 64 (lógico), pero... en el sistema
de 64 bits no se podían utilizar programas de 32 bits. Por
entonces prácticamente todo eran versiones de 32 bits, con lo que
aquel Windows XP 64 bits quedó en una anécdota más que en
algo útil. Más tarde Microsoft lanzó Windows Vista y las sucesivas
versiones que solucionaron este problema de incompatibilidad.

La intención de AMD y otros con aquellos lanzamientos de 2003 y


años posteriores no era buscar una mejora importante en el
rendimiento, si no utilizar de forma más óptima el
direccionamiento de la memoria del que hablábamos antes.
Un sistema de 32 bits permite utilizar un registro de 32 posiciones
para gestionar la memoria RAM. Hasta 2^32 posibilidades, esto son
4294967296 bits:4 GB, que es la mayor cantidad con la que puede
operar un sistema de 32 bits. Si bien por aquella época lo habitual
era encontrar ordenadores con 512 MB, 1 o 2 GB de RAM, ya
había algunos usuarios que buscaban llegar más allá de los 4 GB
y, por tanto, la evolución a los 64 bits era necesaria.

La mejora producida ha sido quizá un tanto exagerada. De los 4


GB máximo admitidos en los 32 bits hemos pasado a 64
posiciones permitidas, en total 2^64 = 1,8x10^19, unos 16
exbibytes en los sistemas de 64 bits, aproximadamente
16.000.000 Terabytes. En la actualidad Windows 8 limita la
cantidad a 192 o 512 GB, según versión. Parece que no tendremos
problemas de direccionamiento de memoria por un tiempo.

Módulos de memoria RAM LPDDR2 para smartphones, de Samsung

Es necesario comentar que los smartphones aún están lejos de


alcanzar ese límite de 4 GB. La mayoría de modelos optan por 1
o 2 GB, con alguno que llega hasta los 3. No parece que sea
necesaria más cantidad de memoria durante un tiempo y por
tanto los 64 bits no serán un requisito indispensable hasta dentro
de unos años, si bien es cierto que es muy interesante ir
evolucionando para que los desarrolladores de software tengan el
tiempo suficiente para adaptar sus programas. El salto de los 32 a
los 64 bits no será instantáneo y durará varios meses, incluso
años, con lo que adelantarse a ese momento puede
considerarseuna decisión muy sabia. Seguramente estudiaron lo
que ocurrió en el mundo PC hace una década y han sabido
rectificar a tiempo.

¿Qué cambiará con esos 64 bits


en smartphones? Conclusiones

Lo que a priori es un gran cambio (duplicamos los 32 bits


anteriores) es realmenteuna evolución más de la tecnología.
Doblar el tamaño de registro puede dar lugar a pensar que
estamos duplicando el rendimiento, cuando en realidad estamos
muy lejos de llegar a esa afirmación.

LOS 64 BITS REPERCUTIRÁN EN UN MAYOR


RENDIMIENTO EN ALGUNAS TAREAS, AUNQUE
EN APLICACIONES GENERALES NO TENDRÁN
GRAN IMPACTO.

Las repercusiones de implementar una arquitectura de 64 bits


son realesy podrán notarse, pero de forma mucho más tenue de
como muchos piensan. Ampliar el tamaño de las operaciones
admitidas por el procesador es de gran importancia en ciertas
tareas, como por ejemplo la codificación y decodificación de
algoritmos como SHA o AES, aunque en aplicaciones generales
no tendrá un gran impacto.

Si nos centramos en alguna característica palpableesa es, sin duda


alguna, la memoria RAM. Pasar de 32 a 64 bits implica poder
direccionar más de 4 GB de memoria RAM, algo que es posible
hoy en día no sea necesario pero que no tardaremos muchos
años en utilizar.

Ya por último los 64 bits son, a día de hoy, una exclusividad de


Apple y su iPhone 5S en el mercado, pero pronto llegarán al
resto de plataformas. ARM está preparando nuevos núcleos
Cortex-A50 que pretenden llegar al mercado de cara al próximo
2014, inicialmente en las gamas más altas. Con estos nuevos
procesadores también tendrán que llegar actualizaciones de los
sistemas operativos que añadan el soporte al renovado hardware,
algo que no debería tardar mucho tiempo en producirse.

En definitiva, estamos ante una evolución natural del


hardware y, con él, también del software. Algo que ya vivimos
hace una década en equipos de sobremesa, y de lo que hemos
aprendido para no cometer los mismos errores. Será una
evolución completamente transparente para el usuario con la que
lo único malo que podemos obtener es una mejora en el
rendimiento menor de la que muchos prevén.

Publicado: Sab, 24 Mar 2007 10:47 pm Asunto: ¿32 bits? ¿64 bits? Todo sobre los buses

Bueno, voy a intentar explicar un poco qué significan los términos 32 bits, 64 bits, 16 bits ...
que manejamos diariamente en el mundo de la informática.

Primero, hay que saber a qué se refieren esos bits, si es al bus interno, al bus de datos, al
bus de direcciones... porque dependiendo eso, la explicación más o menos varía.

Cuando en un micro decimos que "tiene un bus de 64 bits" solemos referirnos a que su bus
de datos es de 64 bits. En ese bus es donde van, precisamente, los datos e instrucciones que
el micro tiene que manejar.

Luego existe el "bus de direcciones" y nos marca la cantidad de bytes de memoria externa
que el micro puede manejar. Un micro con un bus de direcciones de 16 bits (Z80 por
ejemplo) puede majenar 65.536 bytes de memoria. Un micro de 32 bits en el bus de
direcciones manejaría hasta 2^32 bytes.

Centrémonos en el bus de datos, que es lo que nos suelen indicar cuando nos dan las
prestaciones de un procesador.

He comentado que por ese bus van los datos y las órdenes que el micro debe ejecutar. Lo
habitual en los micros de ahora, es que procesen cada comando de una sola vez (aunque no
es exactamente asi, vamos a considerar que cada comando es un "clic" de reloj).

Imaginemos un comando por ejemplo: LD BC, numero (carga el registro BC con el numero
que demos). En binario, podría ser algo como 0100 nnnn (bus de 8 bits). Como vemos parte
del byte se destina a definir el comando: LD BC = 0100 y la otra parte nnnn el valor a
cargar. En éste registro de 8 bits, el valor máximo podría ser de 16, ya que solo nos quedan
4 bits libres.

¿Y si el registro fuese de 16 bits? 0100 nnnn nnnn nnnn . Tendríamos el mismo comando,
pero 12 bits libres para el número, pudiendo llegar a 4096.

Esa es una ventaja de un bus más ancho: puedes manejar numeros mayores de un solo
"clic" de reloj (recuerdo, no es exactamente asi pero para que lo entendais).

Bien, añadimos más cosas. Supongamos un comando de 16 bits que permite cargar un valor
entre 0 y 255 en un registro llamado "W" (por ejemplo)... podría ser algo como LD W,nnn :
0110 xxxx nnnn nnnn.

Bueno, tenemos 4 bits para el comando, 8 bits para el dato (0 a 255) y... y nos sobran 4
bits... Ahi viene la ventaja 2.

Esos bits se suelen usar para añadir condicionales a los comandos. Podemos decir "carga W
con 100" o decir "carga W con 100 si la ultima operacion ha sido igual a cero", o decir "carga
W con 100 e incrementa el valor introducido" . Para todas las opciones usariamos el mismo
comando, salvo que dependiendo de los valores de esos 4 bits huerfanos, definimos en que
condiciones se ejecutara:

0110 0001 0110 0100


0110 0011 0110 0100
0110 0101 0110 0100

Es decir, un bus más ancho permite además de manejar números mayores, añadir más
funcionalidades a las instrucciones de la CPU. Con esto se consigue disminuir el tiempo que
el procesador tarda en realizar una tarea.

La diferencia es notable. En el supuesto de querer cargar W con 100 si la anterior operacion


(flag zero) es cero, deberiamos primero comprobar a mano el flag de cero y hacer el
condicional, antes de cargar el registro, lo que supone unas tres o cuatro instrucciones. Con
una instrucción en un bus más ancho, se podría realizar solamente de un click.

Vamos, los bits son los carriles de la autopista.

¿El software de 32 bits en micros de 64, va mejor?

No necesariamente. Incluso es posible que vaya a peor, por varias causas:

Primero, porque el software escrito en 32 bits, no utiliza las nuevas instrucciones, o


caracteristicas, de un bus de 64 bits, aunque el micro de 64 bits si implementa las
instrucciones digamos "reducidas" para manejar software de 32 bits.

El problema, es que un micro de 64 bits de arquitectura, siempre tiene que trabajar con 64
bits, y no le vale que por su bus circulen solamente 32. ¿Que pasa? Que el micro de 64
cuando corre software de 32 necesita, ademas de ejecutar las instrucciones, "traducirlas"
internamente a sus equivalentes en 64 bits antes de procesarlas.

Por eso, es posible que muchos que os hayais comprado un micro 64 bits y sigais corriendo
un SO y unas aplicaciones de 32 bits, hayáis notado una pequeña disminución del
rendimiento: por el trabajo adicional de "traducción".

Espero, como siempre, haber aclarado "algo" hehe

1. Diferencias entre bus de direcciones de 32 y 64 bits


Hola.

Despues de leer el excelente post "cegados por los 64 bits", como dije en el abro un
hilo para conocer las ventajas reales de los 64 bits frente a los 32 bits.

Segun tengo entendido, un procesador trabaja con un tamaño llamado palabra, que
suele coincidir con el bus de datos, que desde el pentium es de 64 bits.

Pero aquel salto de 32 bits de los 486 a los pentium, fue tan solo del bus de datos y
no del de direcciones, y desde mi punto de vista, es ahi donde se aprecia una
mejora significativa, en poder trabajar con el doble de datos.

En cambio, el tamaño del bus de direccion, hasta donde yo se, incide directamente
en la direccionabilidad de la memoria del sistema, es decir, que con 32 bits
direccionamos hasta 2 elevado a 32 = 4GB y con 64 bits direccionariamos 2
elevado a 64 (que no son 64 bits de direccion, sino 40 + 8 virtuales o algo asi)

Ademas, segun he leido en el hilo mencionado anteriormente, el tamaño de una


instruccion es el mismo que el del bus de direccion, cosa que ni sabia ni entiendo.

Siendo asi, que ganamos teniendo una instruccion mas grande? una instruccion
mas compleja no? mas CISC por tanto. Mientras que el A64 tiene el nucleo y
segmentacion mas RISC de todos los procesadores domesticos que han existido.

Pues eso, que al igual que yo, muchisima gente, no sabemos que se gana
realmente en el paso de 32 a 64 bits. No dudo en absoluto que no se gane nada,
pero el que?

Saludos.

1) X4 640 3GHz BOX, GA-880GM-UD2H, 2x2GB DDR1600 Hypx, MAXTOR Plus 10 SATA 200
SEAGATE 7200.10 500 y 7200.12 1TB, Sapphire HD3850 256 GDDR3, NEC 3540, LG16x48,
HP2207h
2) X2 4800+ BOX, Gigabyte MA69GM-S2, 2x1 GB DDR667, SEAGATE PATA 250, LG H62N,
BenQ FP91GX

Citar

2. 30/03/2005, 16:29#2

DarkDante

Sin vida social

Ubicación
Albacete

Mensajes
262

Re: Diferencias entre bus de direcciones de 32 y 64 bits

Iniciado por filth2k3

Ademas, segun he leido en el hilo mencionado anteriormente, el tamaño de una instruccion es


el mismo que el del bus de direccion, cosa que ni sabia ni entiendo.

No he leido con detalle ese hilo entero, pero no recuerdo haber leido nada de eso,
en todo caso no es cierto, las instrucciones x86-64 no son de 64 bits de tamaño,
como tampoco lo son las x86 de 32 bits. Las instrucciones x86-xx tienen tamaños
variables desde 1 byte las mas simples a 15 bytes las mas complejas. Lo de 32 o
64 bits viene por el tamaño de los registros de proposito general y por ende con los
datos y unidades funcionales que los usan o tienen capacidad de usarlos, que dan
lugar a las instrucciones basicas del juego.

Si quieres mas informacion de que ventajas/inconvenientes tienen los 64 bits haz


una busqueda , hay algunos hilos sobre el tema ....

Un saludo.

Citar

3. 30/03/2005, 17:25#3

AvFenix

Master

Ubicación
Valencia

Mensajes

1,248

Re: Diferencias entre bus de direcciones de 32 y 64 bits

Basicamente, las ventajas se resumen, por una parte en una mayor capacidad de
cálculo por ciclo de reloj. Se pueden manejar números mayores de una tacada y
guardar resultados en los registros que al ser de 64 bits te permiten almacenar y
recuperar en menos ciclos. Esto supone que a nivel de microcódigo, tener que
rutinas con menos microinstrucciones y por tanto hacer lo mismo invirtiendo menos
ciclos de reloj. Por otra parte, puedes direccionar cantidades mayores de memoria.
En principio, podemos pensar que eso no es tan importante, pues con un bus de 32
bits se pueden direccionar hasta 4 GB de RAM, y muy pocas veces se supera el GB
de RAM en un PC. Pero la limitación de los 32 bits va más allá, por ejemplo que un
Windows XP de 32 bits no permite asignar más de 2 GB de memoria (incluída la
virtual) por tarea. Podemos pensar que 2 GB es mucho, pero si nos metemos en
infografía, edición de vídeo, grandes bases de datos, 2 GB no es mucho, y es una
gran limitación para los desarrolladores de software. Pensad también que aunque
esto parezca que no nos afecte a la mayoría, si total lo más exigente que usamos
son juegos, si que nos afecta. Y los hace, porque los diseñadores de juegos,
desarrollan pensando en que la mayoría de usuarios no superan los 512 MB de RAM
y muy pocos superan el GB. Si a los desarrolladores de juegos, les pusieras un
panorama, en un usuario medio tiene 4 GB de RAM y con la memoria virtual, puede
superar en mucho esa cantidad, los desarrolladores podrían empezar a hacer cosas
que hoy día ni se plantean, y todo eso naturlmente con un entorno de 64 bits
donde es factible manejar ese volumen extra de información.

Saludos

Citar

4. 30/03/2005, 18:14#4

telekito

Con domicilio en Noticias3d.com

Ubicación
Málaga

Mensajes

9,896

Re: Diferencias entre bus de direcciones de 32 y 64 bits

Tratare de responder, pese a que mis conocimientos de arquitectura de


procesadores estan ya muy difumindos.

Pero aquel salto de 32 bits de los 486 a los pentium, fue tan solo del bus de datos y no del de
direcciones, y desde mi punto de vista, es ahi donde se aprecia una mejora significativa, en
poder trabajar con el doble de datos.
Hablando de pentium el bus de datos es de 64bits, el de direcciones de 32.

Ahora pasamos al K8, tienes bus de datos de 64 (creo, pero no estoy seguro), y
uno de direcciones de 64 (bueno 48 reales), ventajas del bus de direcciones de 64
bit, teorica, pues puede direccionar una cantidad de memoria elevadisima ( vamos
podriamos tener un disco duro de terabytes) ventaja en rendimiento ninguna, este
bus solo implica como he dicho las posisiones de memoria que podemos
direccionar.
Bus de datos de 64 bits que implica, pues las instrucciones que podemos ejecutar
de un solo acceso a memoria, significa que si tenemos una instruccion de 64bits
(como muchas de las SSE, que son incluso de 128 bits) con un bus de 64
accederiamos a memoria 1 vez, con un bus de datos de 32bits para "coger" esa
instruccion necesitamos dos accesos, esas cosas lastran muchisimo el rendimiento.
Por cierto utilidad a corto plazo de incrementar el bus de direcciones NINGUNA, a
nivel nosotros, usuarios domesticos que usa el programa para programas de todo
tipo ya sea render, audio, video, o juegos, quizas dentro de 4 años o 6, mas o
menos, si empiece a tener algun sentido estos buses.

Siendo asi, que ganamos teniendo una instruccion mas grande? una instruccion mas compleja
no? mas CISC por tanto. Mientras que el A64 tiene el nucleo y segmentacion mas RISC de
todos los procesadores domesticos que han existido.
A ver el los PC, en si son CISC, y mas con la inclusion de instrucciones MMX SSE
SSE2 ..., que hace el K8, el K8 y K7 tienen dos capas una interna "muy RISC", y
una especie de emulacion del sistema CISC en una capa mas externa (es que esto
la verdad de otro modo no lo se explicar, quizas siendo muy purista lo que digo a
un experto en procesadores le parezca una gilipolles) de modo que es la interna
muy RISC la que procesa las instrucciones de la capa externa de tipo CISC.
Pero vamos el juego de intrucciones x86-64 es muy CISC (muchas instrucciones y
muy potentes para los que no lo entiendan).

Saludos

Citar

5. 31/03/2005, 07:28#5

filth2k3

Vive aquí

Ubicación
Sevilla

Mensajes

649

Re: Diferencias entre bus de direcciones de 32 y 64 bits

Iniciado por DarkDante

No he leido con detalle ese hilo entero, pero no recuerdo haber leido nada de eso, en todo caso
no es cierto, las instrucciones x86-64 no son de 64 bits de tamaño, como tampoco lo son las
x86 de 32 bits. Las instrucciones x86-xx tienen tamaños variables desde 1 byte las mas simples
a 15 bytes las mas complejas

Si, esta claro que el juego de instruciciones es variable en el tamaño de cada una,
en los CISC, porque se componen de instrucciones simples, complejas, mas
complejas...

No se si lo lei asi exactamente pero ahora he buscado de forma rapida, y he


encontrado esto; Quizas yo no lo entendi bien:
Iniciado por AriesMOo

La mayor repercusión del aumento del tamaño de instruccion (dejando de lado el tema del
aumento en el registro de direcciones, que por cierto es a 40+8 virtuales, no a 64 bits) es que
en cada ciclo de reloj el microprocesador puede operar con el doble de datos

Con respecto a lo de operar con instrucciones mayores a la palabra del procesador


(anchura del bus de datos), en principio las instrucciones no tienen una limitacion
de bits no, "solo" implicaria tardar mas ciclos en ser procesadas. Pero esto seria
incumbencia del bus de datos y no del de direcciones no???

Saludos.

1) X4 640 3GHz BOX, GA-880GM-UD2H, 2x2GB DDR1600 Hypx, MAXTOR Plus 10 SATA 200
SEAGATE 7200.10 500 y 7200.12 1TB, Sapphire HD3850 256 GDDR3, NEC 3540, LG16x48,
HP2207h
2) X2 4800+ BOX, Gigabyte MA69GM-S2, 2x1 GB DDR667, SEAGATE PATA 250, LG H62N,
BenQ FP91GX

Citar

6. 31/03/2005, 07:55#6

ArKang3L

Sin vida social

Mensajes
474

Re: Diferencias entre bus de direcciones de 32 y 64 bits

Holas

Eso de operar con el doble de datos creo que no es cierto, si tenemos un micro de
64 bits y uno de 32 bits, y en los dos tenemos una unidad funcional de suma de
enteros ( por ejemplo ) es lo mismo hacer:

0001 + 0001 = 0002

que

00000001 + 00000001 = 00000002

es decir, si quisiesemos en un mismo ciclo hacer mas instrucciones es necesario


tener mas unidades funcionales de suma.

A mi forma de ver, si nosotros desde un AMD64 pudieramos acceder a la memoria


indexada con 64 bits y conseguir en un mismo ciclo llevarnos para el micro dos
registros de 32 bits, en lo unico que mejoraria el rendimiento seria en las caches,
ya que se perderian menos ciclos accediendo a las memorias externas, pero
recordad que para hacer mas instrucciones por ciclo es necesario mas unidades
logicas.

Eso podria ser una razon del porque el rendimiento no ha subido tanto como se
esperaba. Porque si podemos hacer 2 instrucciones por ciclo el rendimiento tendria
que subir casi al 48% de lo que tenemos ahora y no es asi.

Respecto al tema del bus de 32 bits o 64 bits, sirve para eso, para indexar una
cantidad de memoria, con 32 bits podemos indexar unos 4Gb de memoria, con 64 o
48 muchos mas. Y si no recuerdo mal Intel como AMD siempre han tenido buses de
direccionamiento de 32 bits hasta el momento, que pongan mas de uno en paralelo
y luego te digan que tienen 600 bits es otra cosa. Intel tenia lo del Quad Pumped,
que creo que eran 4 buses de acceso a memria en paralelo, y AMD solo tenia 2.

Enga un saludo

ARKANGEL

Accede a: Proyecto iL-engine

Citar

7. 31/03/2005, 08:18#7

Epaminondas Pantulis

Vive aquí

Edad
44

Mensajes

734

Re: Diferencias entre bus de direcciones de 32 y 64 bits

Iniciado por ArKang3L

Holas

Eso de operar con el doble de datos creo que no es cierto, si tenemos un micro de 64 bits y uno
de 32 bits, y en los dos tenemos una unidad funcional de suma de enteros ( por ejemplo ) es lo
mismo hacer:
0001 + 0001 = 0002

que

00000001 + 00000001 = 00000002

es decir, si quisiesemos en un mismo ciclo hacer mas instrucciones es necesario tener mas
unidades funcionales de suma.

Ya, pero siguiendo con tu ejemplo, ¿cómo sumarías 1AFC8945 + 8571FFA4 en el de


menor capacidad?

Visita mi blog sobre Ruby on Rails.

Citar

8. 31/03/2005, 11:57#8

AriesMOo

Master

Ubicación
after hour

Mensajes

2,338

Re: Diferencias entre bus de direcciones de 32 y 64 bits

Iniciado por filth2k3

No se si lo lei asi exactamente pero ahora he buscado de forma rapida, y he encontrado esto;
Quizas yo no lo entendi bien:

Iniciado por AriesMOo


La mayor repercusión del aumento del tamaño de instruccion (dejando de lado el tema del
aumento en el registro de direcciones, que por cierto es a 40+8 virtuales, no a 64 bits) es que
en cada ciclo de reloj el microprocesador puede operar con el doble de datos

Con respecto a lo de operar con instrucciones mayores a la palabra del procesador (anchura del
bus de datos), en principio las instrucciones no tienen una limitacion de bits no, "solo"
implicaria tardar mas ciclos en ser procesadas. Pero esto seria incumbencia del bus de datos y
no del de direcciones no???

Saludos.
Madre mia vaya lio... vaya lio... que traemos.

A ver, primero, para otra vez que me vuelvas a citar, por favor, avisame, seria todo

un detalle
O directamente pregunta siguiendo el hilo...asi no se sacan las cosas de contexto ni
nada.

Bueno, aclaremos lo dicho antes pues.... (que la verdad, tampoco hay mucho que
aclarar...) Cuando se comentó eso, la discusion en ese post iba a cuento de qué era
lo que se ganaba con el aumento a los 64 bits. Y bueno, la principal repercusion es
eso, que el micro en cada ciclo de reloj puede operar con el doble de datos.
Cuando escribi "dejando de lado al bus de direcciones" me referia a que la
capacidad de direccionar mas de 4 gigas, es la otra ventaja clara del aumento a los
64 bits. No era algo relacionado directamente con lo otro.

Tomatelo como algo plano, sin entrar en tecnicismos ni hacer sumas hexadecimales
para darse cuenta de las cosas :P

Un SaLuDo !!

Los videojuegos no afectan a los niños, es decir, si Pac-Man nos hubiera afectado de niños, estariamos todos
moviendonos por habitaciones oscuras, tragando pastillas magicas y escuchando musica electronica repetitiva.
Kristian Wilson, Nintendo Inc. 1989.
Un hombre con gran vision de futuro xD

Citar

9. 31/03/2005, 14:29#9

DarkDante

Sin vida social

Ubicación
Albacete

Mensajes

262

Re: Diferencias entre bus de direcciones de 32 y 64 bits

Iniciado por ArKang3L

Eso de operar con el doble de datos creo que no es cierto, si tenemos un micro de 64 bits y uno
de 32 bits, y en los dos tenemos una unidad funcional de suma de enteros ( por ejemplo ) es lo
mismo hacer:
0001 + 0001 = 0002

que

00000001 + 00000001 = 00000002

es decir, si quisiesemos en un mismo ciclo hacer mas instrucciones es necesario tener mas
unidades funcionales de suma.

Llevas razón en parte, el hacer operaciones con datos de 64 bits cuando se pueden
hacer con 32 bits no es q sea una chorrada, es que empeora el rendimiento ya que
hay que cargar mas datos y los recursos de ancho de banda de memoria y
capacidad de cache son limitados. Pues bien AMD lo ha solucionado de un plumazo
el tipo de dato típico con el que se compila sigue siendo de 32 bits.

Pero como te ha dicho Epaminondas Pantulis hay operaciones que usan datos de 64
bits y ahí si se nota ya que se hace en un solo ciclo una operación que requeriría
dos ciclos. Esto se nota en criptografía donde estamos limitados por el procesador y
no por el subsistema de memoria.

En criptografía se ven todas las bondades del nuevo juego de instrucciones se


aprecia como al ir aumentando el tamaño de clave que desborde el numero de
registros llega a cuadriplicar el rendimiento frente a 32 bits ya que el aumento de 8
a 16 registros reduce el código del algoritmo al no tener que remplazar registros y
tener los datos para operar.
También se nota en compresión de datos que también opera con enteros de
tamaño máximo, pero aquí el limite lo pone el susbsistema de memoria y no se
nota de una forma tan clara.

Citar

10. 01/04/2005, 05:56#10

filth2k3

Vive aquí

Ubicación
Sevilla

Mensajes

649

Re: Diferencias entre bus de direcciones de 32 y 64 bits

Iniciado por AriesMOo

Madre mia vaya lio... vaya lio... que traemos.

A ver, primero, para otra vez que me vuelvas a citar, por favor, avisame, seria todo un detalle
O directamente pregunta siguiendo el hilo...asi no se sacan las cosas de contexto ni nada.

Bueno, aclaremos lo dicho antes pues.... (que la verdad, tampoco hay mucho que aclarar...)
Cuando se comentó eso, la discusion en ese post iba a cuento de qué era lo que se ganaba con
el aumento a los 64 bits. Y bueno, la principal repercusion es eso, que el micro en cada ciclo de
reloj puede operar con el doble de datos. Cuando escribi "dejando de lado al bus de
direcciones" me referia a que la capacidad de direccionar mas de 4 gigas, es la otra ventaja
clara del aumento a los 64 bits. No era algo relacionado directamente con lo otro.

Ok AriesMOo, perdona. Tomo nota para la siguiente vez que cita algo de otro hilo.
Pense que no era necesario avisar. No continue en aquel hilo, porque aun siendo un
tema relacionado no era al 100% de lo que se trataba, aquello era una critica a los
64 bits, y con este hilo trato de enterarme y conmigo mucha otra gente, de que
ventajas reales aporta el aumento del numero de bits de direccion en un micro, ya
que el aumento del numero de bits de datos hace que podamos trabajar con datos
mas grandes o mayor cantidad de estos. Esto esta claro no?

Con respecto al del bus de direcciones, segun deduzco de los comentarios, se gana:
1)Mayor direccionamiento de memoria
2)"el micro en cada ciclo de reloj puede operar con el doble de datos" -> Esto es
por la mayor capacidad de indexar datos de una instruccion, con lo que se pueden
tener instrucciones complejas procesadas en menos ciclos al hacer las cargas de
esta instruccion de forma mas rapuda al tener mas bits dedicados a "tomar las
partes de la instruccion". Por eso supongo que habran aumentado el numero de
registros de proposito general, para poder almacenar mas datos en cada ciclo.

Saludos.

1) X4 640 3GHz BOX, GA-880GM-UD2H, 2x2GB DDR1600 Hypx, MAXTOR Plus 10 SATA 200
SEAGATE 7200.10 500 y 7200.12 1TB, Sapphire HD3850 256 GDDR3, NEC 3540, LG16x48,
HP2207h
2) X2 4800+ BOX, Gigabyte MA69GM-S2, 2x1 GB DDR667, SEAGATE PATA 250, LG H62N,
BenQ FP91GX

8 bits

En arquitectura de computadoras, 8 bits es un adjetivo usado para describir enteros, direcciones de


memoria u otras unidades de datos que comprenden hasta 8 bits (1 octeto) de ancho, o para referirse a
una arquitectura de CPU y ALU basadas en registros, bus de direcciones o bus de datos de ese ancho.
Las CPU de 8 bits normalmente usan un bus de datos de 8 bits y un bus de direcciones de 16 bits lo que
causa que su memoria direccionable esté limitada a 64 kilobytes; sin embargo esto no es una "ley
natural", ya que existen excepciones.
El primer microprocesador de 8 bits ampliamente utilizado es el Intel 8080, que se usó en computadores
de aficionados a finales de los años 1970 y principio de los años 1980, muchos corriendo el sistema
operativo CP/M. El Zilog Z80 (compatible con el 8080) el Motorola 6800 y el MOS Technology 6502 se
utilizan en varios computadores similares y profesionales. Pero se conocen más por haber sido
ampliamente usados en computadores domésticos y videoconsolas en los 70 y 80, abarcando parte de la
segunda y sobre todo tercera generaciones de videoconsolas. Muchas CPU y microcontroladores de 8
bits son la base hoy en día de los sistemas integrados que encontramos en cualquier sitio desde el coche
al ascensor o la lavadora.
En arquitectura de computadoras, 16 bits, 32 bits o 64 bits es un adjetivo usado para describir enteros,
direcciones de memoria u otras unidades de datos que comprenden hasta 16 bits, 32 bits o 64 bits de
ancho. En el tema que nos ocupa, se utilizan para referirse a una arquitectura de procesador basadas en
registros, bus de direcciones o bus de datos que permiten procesar (interna y externamente) datos de ese
ancho.
Ejemplos:
Lista de CPU de 8 bits
CPUs Intel

Intel 8008
Intel 8080
Intel 8085
Intel 8051
Intel 8088 *NOTA: El Intel 8088 es solo exteriormente de 8 bits
Intel 80188 *NOTA: El Intel 80188 es solo exteriormente de 8 bits

CPUs ZiLOG

Zilog Z80
Zilog Z180
Zilog Z8
Zilog eZ80

CPUs de 8 bits Motorola

Motorola 6800
Motorola 6803
Motorola 6809

CPUs MOS Technology

MOS 6501
MOS 6502
MOS 6510
MOS Technology 6507
MOS Technology 65CE02

Microcontroladores

Microchip PIC10
Microchip PIC12
Microchip PIC16
Microchip PIC18
AVR
NEC 78K0

16 Bit

En arquitectura de computadoras, 16 bits es un adjetivo usado para describir enteros, direcciones de


memoria u otras unidades de datos que comprenden hasta 16 bits (2 octetos) de ancho, o para referirse a
una arquitectura de CPU y ALU basadas en registros, bus de direcciones o bus de datos de ese ancho.

Al igual que en las videoconsolas, se denominan 16 bits a una serie de ordenadores que tenían en común
usar procesadores de 16 bits.

Arquitectura de 16 bits

Los procesadores de 16 bits más conocidos son el PDP-11, Intel 8086, Motorola 68000, Intel 80286 y el
WDC 65C816. El Intel 8088 es compatible en código con el Intel 8086, y puede considerarse de 16 bits en
cuanto a registros e instrucciones aritméticas, mientras que su bus de datos es de 8 bits.

Un entero de 16 bits puede almacenar 2^{16} (ó 65536) valores diferentes. En una representación sin
signo, esos valores son los enteros entre 0 y 65535; usando complemento a dos, el rango de valores
posibles va de 32768 a 32767.

Los microprocesadores de 16 bits han sido sustituidos completamente en la industria del ordenador
personal, pero permanece en uso en una amplia variedad de aplicaciones embebidas, por ejemplo los
procesadores XAP presentes en numerosos ASICs.

Ejemplos:

Modelo de datos de 16 bits Modelo de Datos corto entero largo punteros


IP16L32 (cercano) 16 16 32 16
I16LP32 (lejano) 16 16 32 32

32 y 64 bits

Cuando buscamos información sobre arquitecturas de 32 y 64 bits de Intel y AMD podemos terminar
realmente mareados y confusos entre tantos términos que, en principio, parecen iguales pero en el fondo
no lo son, o que nos llevan a pensar una cosa totalmente errónea. A modo de ejemplo, ¿las arquitecturas
IA-32 e IA-32e son la misma arquitectura? ¿las dos arquitecturas (IA-32 e IA-32e) son de 32 bits? ¿es la
arquitectura x86-64 una arquitectura de Intel cómo lo es la arquitectura x86-32? ¿i386, x86-32, x86 e IA-
32 son lo mismo? ¿es lo mismo x86-64, x64 e IA-64? ¿es lo mismo IA-64 e Intel 64?
Vamos a aclarar un poco las cosas
IA-32 (Intel Architecture, 32 bits) es la arquitectura del conjunto de instrucciones de los procesadores de
Intel 80×86 y de los primeros microprocesadores de AMD. IA-32 fue una extensión de 32 bits,
implementada por primera vez en 1986 en el procesador Intel 80386, sucesor de los antiguos
procesadores Intel 8086, 8088, 80186 y 80286 de 16-bit y el denominador común de todos los diseños
80×86 subsiguientes (80486, 80586, 80686). Por este motivo, también es conocida de manera genérica
como arquitectura i386, x86-32 o x86, aunque bajo esta última denominación (x86), y también como x86-
16, se suele incluir a los procesadores Intel de 16 bits.
El salto a los 64 bits se produjo con la aparición de una nueva extensión en el año 2000 derivada de IA-32
llamada x86-64, desarrollada por AMD y posteriormente renombrada a AMD64 (el primer procesador con
soporte para este conjunto de instrucciones fue el Opteron). Mas tarde, en el 2004, esta arquitectura
extendida fue adoptada por Intel, el nuevo conjunto de instrucciones recibió el acrónimo EM64T
(Extended Memory 64 Technology), cuyo nombre código fue Yamhill o IA-32e, y posteriormente fue
renombrado adoptando el nombre definitivo de Intel 64 (arquitectura utilizada por primera vez a principios
del 2005 con el Pentium 4). A estas arquitecturas de 64 bits se las conoce de manera genérica como x86-
64 o x64, y no debemos confundirlas con la arquitectura IA-64 de 64-bits.
La arquitectura IA-64 (Intel Arquitecture, 64 bits) de Intel (perogrullada), fue lanzada en 1999, y no es
directamente compatible con el conjunto de instrucciones IA-32 (excepto bajo emulación software) como
sí sucede en el caso de las arquitecturas Intel 64 y AMD64. IA-64 es la arquitectura utilizada por la línea
de procesadores Itanium e Itanium 2, por lo que inicialmente fue conocida por el nombre de Intel Itanium
Architecture.
Resumiendo:
Arquitectura: Conocida inicialmente como: Nombre genérico Bits:
IA-32 - i386, x86-32, x86 32 bits
AMD64 x86-64 (Hammer) x86-64, x64 64 bits
Intel 64 EM64T (Yamhill o IA-32e) x86-64, x64 64 bits
IA-64 Itanium Architecture - 64 bits

Ejemplos:

Las arquitecturas de microprocesador de 64 bits (a fecha de 2006) comprenden:

La arquitectura DEC Alpha (véase la cronología de Digital Alpha)


La arquitectura IA-64 de Intel (usada en las CPUs Itanium de Intel)
La arquitectura AMD64 de AMD (previamente conocida como x86-64), una versión de 64 bits de la
arquitectura x86 (usada en las CPUs Athlon 64, Opteron, Sempron y Turion 64).
Intel usa ahora el mismo conjunto de instrucciones en los procesadores Pentium 4 y Xeon nuevos y
en los procesadores Core 2 Duo, llamándola Intel 64 (previamente conocida como EM64T, originalmente
IA-32e). Los fabricantes de software Microsoft y Sun Microsystems llaman a este conjunto de
instrucciones "x64".
La arquitectura SPARC (de 64 bits desde SPARC V9)
La arquitectura UltraSPARC de Sun
La arquitectura SPARC64 de Fujitsu
La arquitectura POWER de IBM (de 64 bits desde POWER3 y las variantes RS64)
La arquitectura PowerPC de IBM/Motorola (el PowerPC 620 de 64 bits y las variantes PowerPC 970)
La arquitectura z/Architecture de IBM, usada por los mainframes zSeries y System z9, una versión de
64 bits de la arquitectura ESA/390
Las arquitecturas MIPS IV, MIPS V, y MIPS64 de MIPS Technologies
La familia PA-RISC de HP (de 64 bits desde el PA-RISC 2.0)

Muchas arquitecturas de procesador de 64 bits pueden ejecutar nativamente código de la versión de 32


bits de la arquitectura sin ninguna penalización en el rendimiento. Este tipo de soporte se conoce
frecuentemente como soporte biarquitectura o más generalmente como soporte
multiarquitectura.

* Genera un numero aleatorio entre dos numeros.


* Entre el minimo y el maximo incluidos
* @param minimo Número mínimo
* @param maximo Número máximo
* @return Número entre minimo y maximo
*/
public static int generaNumeroAleatorio(int minimo, int maximo){

int num=(int)Math.floor(Math.random()*(minimo-
(maximo+1))+(maximo+1));
return num;
}

/**
* Genera un numero aleatorio entre dos numeros reales.
* Entre el minimo y el maximo incluidos
* Devuelve un numero con dos decimales.
* @param minimo Número mínimo
* @param maximo Número máximo
* @return Número entre minimo y maximo
*/
public static double generaNumeroRealAleatorio(double minimo,
double maximo){

double num=Math.rint(Math.floor(Math.random()*(minimo-
((maximo*100)+1))+((maximo*100)+1)))/100;
return num;

}
Una lista enlazada es una colección de objetos enlazadas entre si. Es lo que se denomina
unaestructura dinámica, estas pueden crecer tanto como se quiera.
No se deben confundir con los arrays, estos debemos definirles el tamaño que tendrán al crearlos.

Estas listas esta compuesta por una clase que maneja la lista y otra que contiene la información de
los objetos de la lista, llamados nodos.
Para empezar, vamos a ver el código de la clase Nodo.
1 /**
*
2 * @author DiscoDurodeRoer
3 * @param <T>
4 */
5 public class Nodo<T> {
6
7 private T dato;
private Nodo<T> siguiente;
8
9 /**
10 * Constructor por defecto
11 */
12 public Nodo(){
siguiente=null;
13 }
14
15 /**
16 * Le pasamos un dato al nodo
17 * @param p
*/
18 public Nodo(T p){
19 siguiente=null;
20 dato = p;
21 }
22
23 /**
* Le pasamos un dato y su siguiente nodo al nodo
24 * @param t Dato a insertar
25 * @param siguiente Su sisguiente nodo
26 */
27 public Nodo(T t, Nodo<T> siguiente){
this.siguiente=siguiente;
28
dato = t;
29 }
30
31 public T getDato() {
32 return dato;
33 }
34
public void setDato(T dato) {
35 this.dato = dato;
36 }
37
38 public Nodo<T> getSiguiente() {
39 return siguiente;
40 }
41
public void setSiguiente(Nodo<T> siguiente) {
42 this.siguiente = siguiente;
43 }
44
45 }
46
47
48
49
50
51
52
53
Ahora, vamos con la clase ListaEnlazada.
1 /**
2 * @author DiscoDurodeRoer
* @param <T>
3 * Lista enlazada simple
4 */
5 public class ListaEnlazada<T>{
6
7 //Atributos
8 private Nodo<T> primero;
9
/**
10 * Constructor por defecto
11 */
12 public ListaEnlazada(){
13 listaVacia();
}
14
15 /**
16 * Vacia la lista
17 */
18 private void listaVacia(){
19 primero = null;
}
20
21 /**
22 * Indica si la lista esta vacia o no
23 * @return True = esta vacia
24 */
public boolean estaVacia(){
25
return primero == null;
26 }
27
28 /**
29 * Inserta un objeto al principio de la lista
30 * @param t Dato insertado
*/
31 public void insertarPrimero(T t){
32 Nodo<T> nuevo = new Nodo<>(t);
33
34 if (!estaVacia()){
35 //Sino esta vacia, el primero actual pasa a ser
36 // el siguiente de nuestro nuevo nodo
nuevo.setSiguiente(primero);
37 }
38
39 //el primero apunta al nodo nuevo
40 primero=nuevo;
41
42 }
43
/**
44
* Inserta al final de la lista un objeto
45 * @param t Dato insertado
46 */
47 public void insertarUltimo(T t){
48
49 Nodo<T> aux = new Nodo<>(t);
Nodo<T> rec_aux;
50
51 if (estaVacia()) {
52 insertarPrimero(t);
53 }else {
54 rec_aux = primero;
55
56 //Buscamos el ultimo nodo
while(rec_aux.getSiguiente() != null){
57 rec_aux=rec_aux.getSiguiente();
58 }
59
//Actualizamos el siguiente del ultimo
60 rec_aux.setSiguiente(aux);
61 }
62 }
63
64 /**
* Quita el primer elemento de la lista
65
*/
66 public void quitarPrimero(){
67 Nodo<T> aux;
68 if (!estaVacia()){
69 aux=primero;
primero = primero.getSiguiente();
70 aux=null; //Lo marcamos para el recolector de basura
71 }
72 }
73
74 /**
75 * Quita el ultimo elemento de la lista
*/
76 public void quitarUltimo(){
77 Nodo<T> aux=primero;
78 if(aux.getSiguiente()==null)
79 //Aqi entra, si la lista tiene un elemento
listaVacia();
80 if(!estaVacia()) {
81 aux=primero;
82
83 //Buscamos el penultimo, por eso hay dos getSiguiente()
84 while(aux.getSiguiente().getSiguiente() != null){
85 aux=aux.getSiguiente();
}
86
87 //Marcamos el siguiente del antepenultimo como nulo, eliminando el
88 ultimo
89 aux.setSiguiente(null);
90 }
91
92 }
93
/**
94 * Devuelve el último elemento de la lista
95 * @return Último elemento
96 */
97 public T devolverUltimo(){
T elemen = null;
98 Nodo<T> aux;
99 if (!estaVacia()){
100 aux = primero;
101
102 //Recorremos
103 while(aux.getSiguiente() != null){
aux = aux.getSiguiente();
104 }
105 elemen = aux.getDato();
106 }
107 return elemen;
108 }
109
/**
110 * Devuelve el primer elemento de la lista
111 * @return Primer elemento, null si esta vacia
112 */
113 public T devolverPrimero(){
T elemen = null;
114 if (!estaVacia()){
115 elemen = primero.getDato();
116 }
117 return elemen;
118 }
119
120 /**
* Devuelve el número de elementos de la lista
121 * @return Número de elementos
122 */
123 public int cuantosElementos(){
124 Nodo<T> aux;
125 int numElementos=0;
aux = primero;
126
127 //Recorremos
128 while(aux != null){
129 numElementos++;
130 aux = aux.getSiguiente();
}
131 return numElementos;
132
133 }
134
135 /**
136 * Devuelve el dato del nodo en la posicion pos
137 * @param pos
* @return dato del nodo en la posicion indicada
138 */
139 public T devolverDato(int pos){
140 Nodo<T> aux=primero;
141 int cont=0;
T dato=null;
142
143
if(pos<0 || pos>=cuantosElementos()){
144 System.out.println("La posicion insertada no es correcta");
145 }else{
146 //recorremos
147 while(aux!=null){
if (pos == cont){
148 //Cogemos el dato
149 dato=aux.getDato();
150 }
151
152 aux=aux.getSiguiente();
153 cont++;
154
}
155 }
156
157 return dato;
158
159 }
160
/**
161 * Devuelve el nodo de la posicion indicada
162 * @param pos
163 * @return Nodo de la posicion indicada
164 */
165 public Nodo<T> devolverNodo(int pos){
Nodo<T> aux=primero;
166 int cont=0;
167
168 if(pos<0 || pos>=cuantosElementos()){
169 System.out.println("La posicion insertada no es correcta");
170 }else{
//recorremos
171 while(aux!=null){
172 if (pos == cont){
173 //Devuelvo aux, con esto salimos de la función
174 return aux;
175 }
176
//Actualizo el siguiente
177 aux=aux.getSiguiente();
178 cont++;
179
180 }
181 }
182
183 return aux;
184
}
185
186 /**
187 * Inserta un nuevo nodo en la posicion indicada con el su dato
188 * @param pos
189 * @param dato
190 */
public void introducirDato(int pos, T dato){
191 Nodo<T> aux=primero;
192 Nodo<T> auxDato=null; //Debemos crear un nodo para insetar el dato
193 Nodo<T> anterior=primero; //Debemos crear un nodo para insetar el dato
194
195 int contador=0;
196
197 if(pos<0 || pos>cuantosElementos()){
System.out.println("La posicion insertada no es correcta");
198 }else{
199
200 if(pos==0){
201 insertarPrimero(dato);
202 }else if(pos==cuantosElementos()){
203 insertarUltimo(dato);
}else{
204 //Recorremos
205 while(aux!=null){
206 if (pos == contador){
//Creo el nodo
207 auxDato=new Nodo<>(dato, aux);
208 //El siguiente del anterior a aux es auxDato
anterior.setSiguiente(auxDato);
209 }
210
211 //Actualizo anterior
212 anterior=aux;
213
214 contador++;
215 aux=aux.getSiguiente(); //Actualizo siguiente
}
216 }
217 }
218
219 }
220
221 /**
* Modifica el dato indicado en el nodo de la posicion indicada
222
* @param pos
223 * @param dato
224 */
225 public void modificarDato(int pos, T dato){
226 Nodo<T> aux=primero;
int cont=0;
227
228 if(pos<0 || pos>=cuantosElementos()){
229 System.out.println("La posicion insertada no es correcta");
230 }else{
231 //Recorremos
232 while(aux!=null){
if (pos == cont){
233 //Modificamos el dato directamente
234 aux.setDato(dato);
235 }
236 cont++;
aux=aux.getSiguiente(); //Actualizamos
237
}
238 }
239
240 }
241
242 /**
243 * Borra un elemento de la lista
* @param pos Posición de la lista que queremos borrar
244 */
245 public void borraPosicion(int pos){
246
247 Nodo<T> aux=primero;
248 Nodo<T> anterior=null;
249 int contador=0;
250
if(pos<0 || pos>=cuantosElementos()){
251 System.out.println("La posicion insertada no es correcta");
252 }else{
253 while(aux!=null){
254 if (pos == contador){
if (anterior==null){
255 primero = primero.getSiguiente();
256 }else {
257 //Actualizamos el anterior
258 anterior.setSiguiente(aux.getSiguiente());
}
259 aux=null;
260 }else{
261 anterior=aux;
262 aux=aux.getSiguiente();
contador++;
263 }
264 }
265 }
266 }
267
268 /**
* Devuelve el primer el elemento y lo borra de la lista
269 * @return Primer elemento
270 */
271 public T devolverYBorrarPrimero(){
272
273 T dato=devolverPrimero();
quitarPrimero();
274
return dato;
275 }
276
277 /**
278 * Indica la posición del primer dato que se encuentre
279 * @param t dato buscado
* @return Posición del dato buscado, -1 si no se encuentra o esta vacia
280 */
281 public int indexOf (T t){
282
283 Nodo<T> aux=primero;
284 if (estaVacia()){
285 return -1;
}else{
286 int contador=0;
287 boolean encontrado=false;
288
289 //recorremos, cuando encontrado=true, sale del bucle
290 while(aux!=null && !encontrado){
if(t.equals(aux.getDato())){
291 //Cambiamos a true
292 encontrado=true;
293 }else{
294 contador++;
295 //actualizamos
aux=aux.getSiguiente();
296 }
297 }
298 if(encontrado){
299 return contador;
}else{
300
//no se ha encontrado
301 return -1;
302 }
303 }
304 }
305
/**
306 * Indica la posición del primer dato desde la posicion indicada
307 * @param t dato buscado
308 * @param pos
* @return Posición del dato buscado, -1 si no se encuentra o esta vacia
309 */
310 public int indexOf (T t, int pos){
311
312 Nodo<T> aux;
313 if (estaVacia()){
return -1;
314 }else{
315 int contador=pos;
316 boolean encontrado=false;
317
318 //Empezamos desde el nodo correspondiente
319 aux=devolverNodo(pos);
320
//recorremos, cuando encontrado=true, sale del bucle
321 while(aux!=null && !encontrado){
322 if(t.equals(aux.getDato())){
323 //Cambiamos a true
324 encontrado=true;
325 }else{
contador++;
326 //Actualizamos
327 aux=aux.getSiguiente();
328 }
329 }
if(encontrado){
330 return contador;
331 }else{
332 return -1;
333 }
334 }
}
335
336 /**
337 * Indica si un dato existe en la lista
338 * @param t Dato a comprobar
339 * @return Si el dato existe, devuelve true
*/
340
public boolean datoExistente(T t){
341
342 boolean existe=false;
343
344 Nodo<T> aux=primero;
345
346 while(aux!=null && !existe){
347
348 if(aux.getDato().equals(t)){
existe=true;
349 }
350
351 //Actualizamos
352 aux=aux.getSiguiente();
353 }
354
355 return existe;
}
356
357 /**
358 * Muestra el contenido de la lista
*/
359 public void mostrar(){
360 System.out.println("Contenido de la lista");
361 System.out.println("---------------------");
362
363 Nodo<T> aux=primero;
364
365 while(aux!=null){
System.out.println(aux.getDato());//mostramos el dato
366 aux=aux.getSiguiente();
367 }
368
369 }
370
371 /**
* Devuelve el contenido de la lista en un String
372
* @return contenido de la lista
373 */
374 @Override
375 public String toString(){
376
377 String contenido="";
Nodo<T> aux=primero;
378
379
while(aux!=null){
380 contenido=aux.getDato()+"\n"; //guardamos el dato
381 aux=aux.getSiguiente();
382 }
383
384 return contenido;
}
385
386 }
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
Os dejo también un pequeño fichero de prueba para que veáis como funciona.
/**
1 * Muestra de funcionamiento de la lista enlazada
2 * @author DiscoDurodeRoer
3 */
4 public class ListaEnlazadaSimple {
5
6 public static void main(String[] args) {
7
//Creo la lista enlazada de numeros
8 //Puede ser de String, double, Objetos, etc.
9 ListaEnlazada<Integer> lista=new ListaEnlazada<>();
10
11 System.out.println("Insercion de numeros del 0 al 9 en forma de cola");
12 for(int i=0;i<10;i++){
13 lista.insertarUltimo(i);
}
14
15 //Mostramos la lista
16 lista.mostrar();
17
18 System.out.println("");
19
20 System.out.println("Numero de elementos: " + lista.cuantosElementos());
21 System.out.println("");
22
System.out.println("Eliminación del dato que esta en la posicion 3");
23 lista.borraPosicion(3); //Elimina el el dato 3
24
25 lista.mostrar();
26
27 System.out.println("Numero de elementos: " + lista.cuantosElementos());
28 System.out.println("");
29
30 System.out.println("Insercion del dato 2 en la posicion 5");
lista.introducirDato(5, 2);
31
32 lista.mostrar();
33
34 System.out.println("Numero de elementos: " + lista.cuantosElementos());
35 System.out.println("");
36
37 System.out.println("Modificamos el dato de la posicion 5 por un 3");
38 lista.modificarDato(5, 3);
39
lista.mostrar();
40
41
System.out.println("Numero de elementos: " + lista.cuantosElementos());
42 System.out.println("");
43
44 System.out.println("Inserto en la posicion 0");
45 lista.introducirDato(0, 10);
46
47 lista.mostrar();
System.out.println("");
48
49
System.out.println("Inserto en la ultima posicion");
50 //Equivalente a insertarUltimo
51 lista.introducirDato(lista.cuantosElementos(), 11);
52
53 lista.mostrar();
System.out.println("");
54
55 System.out.println("Posicion del dato 5: "+lista.indexOf(5));
56 System.out.println("Posicion del dato 5 desde la posicion 7:
57 "+lista.indexOf(5, 7));
58
59 System.out.println("");
60
61 System.out.println("¿Existe el dato 10 en la lista?
"+lista.datoExistente(10));
62 System.out.println("¿Existe el dato 20 en la lista?
63 "+lista.datoExistente(20));
64 }
65
66 }
67
68
69
70
71
72

ISTA ENLAZADA SIMPLE

La lista enlazada básica es la lista enlazada simple la cual tiene un enlace por nodo. Este enlace

apunta al siguiente nodo en la lista, o al valor NULL o a la lista vacía, si es el último nodo.

He aquì tenemos un ejemplo de una lista enlazada simple

//DECLARACIÒN DE PROTOTIPOS

#include<alloc.h>

#include<stdlib.h>

#include<conio.h>

#include<iostream.h>

//Declaramosla estructura

typedef struct nodo

int dato;

struct nodo * siguiente;

}tipoNodo;
//reservamos el espacio de memoria

tipoNodo *nuevo_elemento();

//Operaciones que vamos a arealizar

void crear();

void insertar();

void insertar_inicio();

void insertar_ordenado();

void insertar_final();

void presentar();

void modificar();

void buscar();

void ordenar();

void ordenar_ascendente();

void ordenar_descendente();

void eliminar();

void eliminar_cabeza();

//FUNCION PARA EL CUADRO

void cuadro(int x1,int y1, int x2, int y2, char simb);

//NUESTRA CABEZA

tipoNodo *cab;

tipoNodo *nuevo_elemento()

tipoNodo *nodo1;

nodo1=(tipoNodo *)malloc(sizeof(tipoNodo ));

if(!nodo1)

cout<<“No se ha reservado memoria para el nuevo “;

return nodo1;

void main()

clrscr();

crear();

clrscr();

char opc=’ ‘;
do

clrscr();

cuadro(1,10,35,56,’²’);

gotoxy(13,3);cout<<“->[ LISTAS ENLAZADAS ]<-\n”;

gotoxy(12,6);cout<<” MENU PRINCIPAL\n”;

gotoxy(12,9); cout<<” [1]: INSERTAR\n”;

gotoxy(12,12);cout<<” [2]: MODIFICAR\n”;

gotoxy(12,15);cout<<” [3]: BUSCAR\n”;

gotoxy(12,17);cout<<” [4]: ORDENAR\n”;

gotoxy(12,19);cout<<” [5]: ELIMINAR\n”;

gotoxy(12,21);cout<<” [6]: PRESENTAR\n”;

gotoxy(12,24);cout<<” [7]: SALIR DEL MENU\n”;

gotoxy(12,27);cout<<” Elegir una Opci¢n [ ]”;

gotoxy(32,27);cin>>opc;

switch(opc)

case’1′:

clrscr();

insertar();getch();break;

case’2′:

clrscr();

modificar();getch();break;

case’3′:

clrscr();

buscar();getch();break;

case’4′:

clrscr();

ordenar();getch();break;

case’5′:

clrscr();

eliminar();getch();break;

case’6′:

clrscr();

presentar();getch();break;
}

}while(opc!=’7′);

getch();

//CREANDO LA CABEZA

void crear()

clrscr();

cab=nuevo_elemento();

gotoxy(20,20);

cout<<“Ingrese valor de cabeza :\t”;

cin>>cab->dato;

cab->siguiente=NULL;

getch();

//MENU DE INSERTAR

void insertar()

clrscr();

char opc=’ ‘;

do

clrscr();

cuadro(1,10,35,56,’²’);

gotoxy(13,3);cout<<“->[ LISTAS ENLAZADAS ]<-\n”;

gotoxy(12,6);cout<<” MENU PRINCIPAL\n”;

gotoxy(12,9); cout<<” [1]: INSERTAR AL INICIO\n”;

gotoxy(12,12);cout<<” [2]: insertar AL FINAL\n”;

gotoxy(12,15);cout<<” [3]: INSERTAR ORDENADO\n”;

gotoxy(12,18);cout<<” [4]: REGRESAR\n”;

gotoxy(12,21);cout<<” Elegir una Opci¢n [ ]”;

gotoxy(32,21);cin>>opc;
switch(opc)

case’1′:

clrscr();

insertar_inicio();getch();break;

case’2′:

clrscr();

insertar_final();getch();break;

case’3′:

clrscr();

insertar_ordenado();getch();break;

}while(opc!=’4′);

getch();

//INSERATAR AL INICIO

void insertar_inicio()

clrscr();

nodo *pAuxElem;

nodo *recorre;

pAuxElem=(tipoNodo*) malloc(sizeof(tipoNodo));

while(recorre->siguiente!=NULL)

recorre=recorre->siguiente;

int n;

gotoxy(20,20);

cout<<“INGRESE VALOR :\t”;

cin>>n;

pAuxElem->dato=n;

pAuxElem->siguiente=cab;

cab=pAuxElem;

}
//INSERTAR AL FINAL

void insertar_final()

clrscr();

nodo *elem;

elem=nuevo_elemento();

clrscr();

gotoxy(20,20);

cout<<“INGRESE VALOR :\t”;

cin>>elem->dato;

nodo *recorrer;

recorrer=cab;

while(recorrer->siguiente!=NULL)

recorrer=recorrer->siguiente;

recorrer->siguiente=elem;

elem->siguiente=NULL;

getch();

//INSERATAR ORDENADO

void insertar_ordenado()

clrscr();

nodo *pAuxElem;

nodo *post;

nodo *recorre;

pAuxElem=(tipoNodo*) malloc(sizeof(tipoNodo));

post=(tipoNodo*) malloc(sizeof(tipoNodo));

int n;

gotoxy(20,20);

cout<<“INGRESE VALOR :\t”;

cin>>n;

if(n<cab->dato)

post=cab->siguiente;

while((pAuxElem->dato>post->dato)&&(post->siguiente!=NULL))

post=post->siguiente;

}
if(post->siguiente!=NULL)

pAuxElem->siguiente=cab;

cab=pAuxElem;

else

pAuxElem->siguiente=NULL;

post->siguiente=pAuxElem;

else

while(recorre->siguiente!=NULL)

recorre=recorre->siguiente;

pAuxElem->dato=n;

pAuxElem->siguiente=cab;

cab=pAuxElem;

/*cout<<“Ingrese un numero”;

cin>>n;

if(n>cab->dato)

insertar_inicio(n);

else

nodo *aux;

nodo *ant;

aux=cab->siguiente;

while((aux!=NULL)(n>aux->dato))

ant=aux;

aux=aux->siguiente

nodo *nuevo;
nuevo=crear_nuevo();

nuevo->dato=n;

ant->siguiente=nuevo;

nuevo->siguiente=aux;

}*/

//PARA MODIFICAR

void modificar()

clrscr();

nodo *elem;

nodo *ele;

gotoxy(10,25);cout<<“ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;

gotoxy(10,26);cout<<“º º\n”;

gotoxy(10,27);cout<<“ºMODIFICAR NUMERO DE LISTA º\n”;

gotoxy(10,28);cout<<“º º\n”;

gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;

gotoxy(20,20);

cout<<“INGRESE EL VALOR A MODIFICAR :\t”;

cin>>elem->dato;

nodo *recorrer;

recorrer=cab;

while(recorrer!=NULL)

if(recorrer->dato==elem->dato)

clrscr();

gotoxy(20,20);

cout<<“INGRESE VALOR :\t”;

cin>>ele->dato;

recorrer->dato=ele->dato;

recorrer=recorrer->siguiente;

getch();
}

//PARA BUSCAR

void buscar()

clrscr();

nodo *elem;

gotoxy(10,25);cout<<“ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;

gotoxy(10,26);cout<<“º º\n”;

gotoxy(10,27);cout<<“ºBUSCADOR DE NUMERO DE LISTAº\n”;

gotoxy(10,28);cout<<“º º\n”;

gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;

gotoxy(20,20);

cout<<“INGRESE EL VALOR A BUSCAR :\t”;

cin>>elem->dato;

nodo *recorrer;

recorrer=cab;

while(recorrer!=NULL)

if(recorrer->dato==elem->dato)

clrscr();

gotoxy(20,20);

cout<<elem->dato<<“:\t”;

cout<<“ESTE ELEMENTO SI EXISTE”;

recorrer->dato=elem->dato;

recorrer=recorrer->siguiente;

getch();

//ORDENAR

void ordenar()

clrscr();

char opc=’ ‘;
do

clrscr();

cuadro(1,10,25,56,’²’);

gotoxy(13,3);cout<<“->[ ORDENAR LAS LISTAS ENLAZADAS ]<-\n”;

gotoxy(12,6);cout<<” MENU PRINCIPAL\n”;

gotoxy(12,9); cout<<” [1]: ORDENAR ASCENDENTE\n”;

gotoxy(12,12);cout<<” [2]: ORDENAR DESCENDENTE\n”;

gotoxy(12,15);cout<<” [3]: REGRESAR\n”;

gotoxy(12,17);cout<<” Elegir una Opci¢n [ ]”;

gotoxy(32,17);cin>>opc;

switch(opc)

case’1′:

clrscr();

ordenar_ascendente();getch();break;

case’2′:

clrscr();

ordenar_descendente();getch();break;

while(opc!=’3′);

getch();

void ordenar_ascendente()

nodo* aux;

nodo* temp;

int vaux;

aux=(tipoNodo *)malloc(sizeof(tipoNodo));

temp=(tipoNodo *)malloc(sizeof(tipoNodo));

aux=cab;

while (aux!=NULL)
{

temp=aux;

while(temp->siguiente!=NULL)

temp=temp->siguiente;

if(aux->dato>temp->dato)

vaux=aux->dato;

aux->dato=temp->dato;

temp->dato=vaux;

aux=aux->siguiente;

void ordenar_descendente()

nodo* aux;

nodo* temp;

int vaux;

aux=(tipoNodo *)malloc(sizeof(tipoNodo));

temp=(tipoNodo *)malloc(sizeof(tipoNodo));

aux=cab;

while (aux!=NULL)

temp=aux;

while(temp->siguiente!=NULL)

temp=temp->siguiente;

if(aux->dato<temp->dato)

vaux=aux->dato;

aux->dato=temp->dato;

temp->dato=vaux;

aux=aux->siguiente;

}
}

//ELIMINAR

void eliminar()

presentar();

nodo *eliminar;

// nodo *recorrer;

nodo *asigna;

gotoxy(10,25);cout<<“ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;

gotoxy(10,26);cout<<“º º\n”;

gotoxy(10,27);cout<<“ºINSERTAR NUMERO A ELIMINARº\n”;

gotoxy(10,28);cout<<“º º\n”;

gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;

gotoxy(10,31);cout<<“Ingrese el n—mero a eliminar\t”;

cin>>eliminar->dato;

// recorrer=cab;

if (eliminar->dato==cab->dato)

eliminar_cabeza();

else

nodo *anterior=cab;

nodo * aux=cab->siguiente;

while((aux!=NULL)&&(aux->dato!=eliminar->dato))

anterior=aux;

aux=aux->siguiente;

if(aux!=NULL)

anterior->siguiente=aux->siguiente;

aux->siguiente=NULL;

free(aux);

else
{

gotoxy(10,33);

cout<<“NO SE ENCUENTRA”;

//ELIMINAR CABEZA

void eliminar_cabeza()

nodo *aux;

aux=cab;

cab=cab->siguiente;

aux->siguiente=NULL;

free(aux);

//PRESENTAR LA LISTA

void presentar()

clrscr();

int f=10;

nodo *recorrer;

recorrer=cab;

gotoxy(20,f);

while(recorrer!=NULL)

gotoxy(20,f);

cout<<recorrer->dato;

cout<<“\n\n”;

recorrer=recorrer->siguiente;

f=f+2;

getch();

//ESTA FUNCION PERMITE PRESENTAR LOS BORDES DE UN CUADRO

void cuadro(int x1,int y1, int x2, int y2, char simb)

for (int i1=y1;i1<=y2;i1++)


{

gotoxy(i1,x1);cout<<simb;

gotoxy(i1,x2);cout<<simb;

for (int i2=x1;i2<=x2;i2++)

gotoxy(y1,i2);cout<<simb;

gotoxy(y2,i2);cout<<simb;

LISTAS ENLAZADAS DOBLES

Cada nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL o a la lista vacía si

es el primer nodo; y otro que apunta al siguiente nodo siguiente, o apunta al valor NULL o a la lista

vacía si es el último nodo.

He aquì tenemos un ejemplo de una lista enlazada simple

//LISTA DOBLE ENLAZADA

//DECLARACIÒN DE PROTOTIPOS

#include<alloc.h>

#include<stdlib.h>
#include<conio.h>

#include<iostream.h>

//Estructuras Doblemente enlazadas

typedef struct nododoble

int dato;

struct nododoble *sig;

struct nododoble *ant;

}tipoNodo;

//PROTOTIPOS

tipoNodo *nuevo_elemento();

void creardoble();

void presentar();

void insertar();

void insertarfinaldoble();

void insertarordenadodoble();

void insertariniciodoble();

void modificar();

void buscar();

void ordenar();

void ordenardoblesasc();

void ordenardoblesdesc();

void eliminar();

void eliminar_cabeza();

void cuadro(int x1,int y1,int x2,int y2,char c);

tipoNodo *cab;

tipoNodo *cola;

tipoNodo *nuevo_elemento()

tipoNodo *nodo1;

nodo1=(tipoNodo *)malloc(sizeof(tipoNodo ));

if(!nodo1)
cout<<“No se ha reservado memoria para el nuevo “;

return nodo1;

//MENU PRINCIPAL

void main()

clrscr();

creardoble();

clrscr();

char opc=’ ‘;

do

clrscr();

cuadro(1,10,35,56,’’);

gotoxy(13,3);cout<<“->[ LISTAS ENLAZADAS DOBLES ]<-\n”;

gotoxy(12,6);cout<<” MENU PRINCIPAL\n”;

gotoxy(12,9); cout<<” [1]: INSERTAR \n”;

gotoxy(12,12);cout<<” [2]: MODIFICAR\n”;

gotoxy(12,15);cout<<” [3]: BUSCAR\n”;

gotoxy(12,17);cout<<” [4]: ORDENAR\n”;

gotoxy(12,19);cout<<” [5]: ELIMINAR\n”;

gotoxy(12,21);cout<<” [6]: PRESENTAR\n”;

gotoxy(12,24);cout<<” [7]: SALIR DEL MENU\n”;

gotoxy(12,27);cout<<” Elegir una Opci¢n [ ]”;

gotoxy(32,27);cin>>opc;

switch(opc)

case’1′:

clrscr();

insertar();;getch();break;

case’2′:

clrscr();

modificar();getch();break;

case’3′:

clrscr();
buscar();getch();break;

case’4′:

clrscr();

ordenar();getch();break;

case’5′:

clrscr();

eliminar();getch();break;

case’6′:

clrscr();

presentar();getch();break;

}while(opc!=’7′);

getch();

//CREAR LA CABEZA

void creardoble()

clrscr();

int dat;

gotoxy(20,20);

cout<<“Ingrese Elemento: “;

cin>>dat;

cab=nuevo_elemento();

cola=nuevo_elemento();

cab->dato=dat;

cab->sig=NULL;

cab->ant=NULL;

cola=cab;

getch();

void insertar()

{
clrscr();

char opc=’ ‘;

do

clrscr();

cuadro(1,10,25,56,’’);

gotoxy(13,3);cout<<“->[ INSERTAR ELEMENMTOS A LA LISTA ENLAZADA ]<-\n”;

gotoxy(12,6); cout<<” [1]: INSERTAR ORDENADO\n”;

gotoxy(12,9);cout<<” [2]: INSERTAR CABEZA\n”;

gotoxy(12,12);cout<<” [3]: INSERTAR AL FINAL\n”;

gotoxy(12,15);cout<<” [4]: REGRESAR\n”;

gotoxy(12,17);cout<<” Elegir una Opci¢n [ ]”;

gotoxy(32,17);cin>>opc;

switch(opc)

case’1′:

clrscr();

insertarordenadodoble();getch();break;

case’2′:

clrscr();

insertariniciodoble();getch();break;

case’3′:

clrscr();

insertarfinaldoble();getch();break;

while(opc!=’4′);

getch();

void insertarfinaldoble()

{
clrscr();

nododoble *elem;

elem=nuevo_elemento();

clrscr();

gotoxy(20,20);

cout<<“\t\t”<<“INGRESE VALOR :\t”;

cin>>elem->dato;

cola->sig=elem;

elem->sig=NULL;

elem->ant=cola;

cola=elem;

getch();

void insertarordenadodoble()

int dat;

nododoble *aux;

nododoble *ant;

nododoble *post;

aux=nuevo_elemento();

ant=nuevo_elemento();

post=nuevo_elemento();

gotoxy(18,22);

cout<<“Ingrese un elemento: “;

cin>>dat;

aux->dato=dat;

if(aux->dato>cab->dato)

ant=cab;

post=cab->sig;

while((aux->dato>post->dato) && (post->sig!=NULL))

ant=post;

post=post->sig;

}
if (post->sig==NULL)

if (aux->dato<post->dato){

aux->sig=post;

post->ant=aux;

ant->sig=aux;

aux->ant=ant;

}else{

aux->sig=NULL;

post->sig=aux;

aux->ant=post;

else

aux->sig=post;

post->ant=aux;

ant->sig=aux;

aux->ant=ant;

else{

aux->dato=dat;

aux->sig=cab;

cab->ant=aux;

aux->ant=NULL;

cab=aux;

void insertariniciodoble()

nododoble *Aux;

int dat;

Aux=nuevo_elemento();

gotoxy(18,22);

cout<<“Ingrese un numero:”;

cin>>dat;

Aux->dato=dat;
Aux->ant=NULL;

Aux->sig=cab;

cab->ant=Aux;

cab=Aux;

void modificar()

clrscr();

nododoble *modificar;

nododoble *ele;

modificar=nuevo_elemento();

int db,encontrado=0;

modificar=cab;

gotoxy(10,20);

cout<<“\t”<<“INGRESE EL VALOR A MODIFICAR :\t”;

cin>> db;

while(modificar!=NULL)

if(db==modificar->dato)

gotoxy(10,22);cout<<“Elemento existente en la lista”;

encontrado=1;

gotoxy(10,25);

cout<<“\t\t”<<“INGRESE VALOR :\t”;

cin>>ele->dato;

modificar->dato=ele->dato;

modificar=modificar->sig;

if(encontrado==0)

gotoxy(10,22);cout<<“Elemento no existente en la lista”;

getch();

}
void buscar()

clrscr();

nododoble *buscar;

buscar=nuevo_elemento();

int db,encontrado=0;

buscar=cab;

gotoxy(18,15);

cout<<“Ingrese el numero a buscar: “;

cin>> db;

while(buscar!=NULL)

if(db==buscar->dato)

gotoxy(18,18);cout<<“Elemento existente en la lista”;

encontrado=1;

buscar=buscar->sig;

if(encontrado==0)

gotoxy(18,18);cout<<“Elemento no existente en la lista”;

getch();

void ordenar()

clrscr();

char opc=’ ‘;

do

clrscr();

cuadro(1,10,25,56,’’);

gotoxy(13,3);cout<<“->[ ORDENAR LAS LISTAS ENLAZADAS ]<-\n”;

gotoxy(12,6);cout<<” MENU PRINCIPAL\n”;

gotoxy(12,9); cout<<” [1]: ORDENAR ASCENDENTE\n”;


gotoxy(12,12);cout<<” [2]: ORDENAR DESCENDENTE\n”;

gotoxy(12,15);cout<<” [3]: REGRESAR\n”;

gotoxy(12,17);cout<<” Elegir una Opci¢n [ ]”;

gotoxy(32,17);cin>>opc;

switch(opc)

case’1′:

clrscr();

ordenardoblesasc();break;

case’2′:

clrscr();

ordenardoblesdesc();break;

while(opc!=’3′);

getch();

void ordenardoblesasc()

nododoble *aux;

nododoble *temp;

int vaux;

aux=nuevo_elemento();

temp=nuevo_elemento();

aux=cab;

while (aux!=NULL)

temp=aux;

while(temp->sig!=NULL)

temp=temp->sig;

if(aux->dato>temp->dato)

vaux=aux->dato;
aux->dato=temp->dato;

temp->dato=vaux;

aux=aux->sig;

void ordenardoblesdesc()

nododoble *aux;

nododoble *temp;

int vaux;

aux=nuevo_elemento();

temp=nuevo_elemento();

aux=cab;

while (aux!=NULL)

temp=aux;

while(temp->sig!=NULL)

temp=temp->sig;

if(aux->dato<temp->dato)

vaux=aux->dato;

aux->dato=temp->dato;

temp->dato=vaux;

aux=aux->sig;

void presentar()

clrscr();

int c=8;

nododoble *recorre;

recorre=nuevo_elemento();
recorre=cab;

gotoxy(18,7);

cout<<” ELEMENTOS INSERTADOS: \n”;

while(recorre!=NULL)

c=c+1;

gotoxy(30,c);cout<<recorre->dato<<“\n”;

recorre=recorre->sig;

getch();

void eliminar()

presentar();

nododoble *eliminar;

nododoble *asigna;

gotoxy(10,25);cout<<“ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;

gotoxy(10,26);cout<<“º º\n”;

gotoxy(10,27);cout<<“ºINSERTAR NUMERO A ELIMINARº\n”;

gotoxy(10,28);cout<<“º º\n”;

gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;

gotoxy(10,31);cout<<“Ingrese el n—mero a eliminar\t”;

cin>>eliminar->dato;

if (eliminar->dato==cab->dato)

eliminar_cabeza();

else

nododoble *anterior=cab;

nododoble * aux=cab->sig;

while((aux!=NULL)&&(aux->dato!=eliminar->dato))

anterior=aux;

aux=aux->sig;
}

if(aux!=NULL)

asigna=aux->sig;

anterior->sig=asigna;

aux->ant=anterior;

aux->ant=NULL;

aux->sig=NULL;

free(aux);

else

gotoxy(10,33);

cout<<“NO SE ENCUENTRA”;

void eliminar_cabeza()

nododoble *aux;

aux=cab;

cab=cab->sig;

aux->sig=NULL;

aux->ant=NULL;

free(aux);

void cuadro(int x1,int y1, int x2, int y2, char simb)

for (int i1=y1;i1<=y2;i1++)

gotoxy(i1,x1);cout<<simb;

gotoxy(i1,x2);cout<<simb;

for (int i2=x1;i2<=x2;i2++)

gotoxy(y1,i2);cout<<simb;
gotoxy(y2,i2);cout<<simb;

Listas enlazadas circulares

En una lista enlazada circular, el primer y el último nodo están unidos juntos. Esto se puede hacer

tanto para listas enlazadas simples como para las doblemente enlazadas. Para recorrer un lista

enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier dirección hasta

que se regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas circulares

pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas es el más usado para dirigir

buffers para “ingerir” datos, y para visitar todos los nodos de una lista a partir de uno dado.

Listas enlazadas circulares simples

Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que el siguiente nodo

del último apunta al primero. Como en una lista enlazada simple, los nuevos nodos pueden ser solo

eficientemente insertados después de uno que ya tengamos referenciado. Por esta razón, es usual

quedarse con una referencia solamente al último elemento en una lista enlazada circular simple, esto

nos permite rápidas inserciones al principio, y también permite accesos al primer nodo desde el

puntero del último nodo.

Lista Enlazada Doblemente Circular

En una lista enlazada doblemente circular, cada nodo tiene dos enlaces, similares a los de la lista

doblemente enlazada, excepto que el enlace anterior del primer nodo apunta al último y el enlace

siguiente del último nodo, apunta al primero. Como en una lista doblemente enlazada, las inserciones

y eliminaciones pueden ser hechas desde cualquier punto con acceso a algún nodo cercano. Aunque

estructuralmente una lista circular doblemente enlazada no tiene ni principio ni fin, un puntero de

acceso externo puede establecer el nodo apuntado que está en la cabeza o al nodo cola, y así

mantener el orden tan bien como una lista doblemente enlazada con falsos nodos.

Aquì un ejemplo de lista circular doblemente enlazadas en C++

//LISTA DOBLE CIRCULARES

#include<iostream.h>

#include<conio.h>
#include<stdio.h>

#include<stdlib.h>

//Estructuras Doblemente enlazadas

typedef struct nododoble

int dato;

struct nodoc *sig;

struct nodoc *ant;

}tipoNodo;

//PROTOTIPOS

tipoNodo *nuevo_elemento();

void crearc();

void presentar();

void presentar_recorrido();

void insertar();

void insertarfinalc();

void insertarordenadoc();

void insertarinicioc();

void modificar();

void buscar();

void ordenar();

void ordenarc();

void ordenarcdesc();

void eliminar();

void eliminar_cabeza();

void cuadro(int x1,int y1,int x2,int y2,char c);

tipoNodo *cab;

tipoNodo *cola;

tipoNodo *nuevo_elemento()

tipoNodo *nodo1;

nodo1=(tipoNodo *)malloc(sizeof(tipoNodo ));

if(!nodo1)

cout<<“No se ha reservado memoria para el nuevo “;


return nodo1;

//MENU PRINCIPAL

void main()

clrscr();

creardoble();

clrscr();

char opc=’ ‘;

do

clrscr();

cuadro(1,10,35,56,’’);

gotoxy(13,3);cout<<“->[ LISTAS ENLAZADAS CIRCULARES ]<-\n”;

gotoxy(12,6);cout<<” MENU PRINCIPAL\n”;

gotoxy(12,9); cout<<” [1]: INSERTAR \n”;

gotoxy(12,12);cout<<” [2]: MODIFICAR\n”;

gotoxy(12,15);cout<<” [3]: BUSCAR\n”;

gotoxy(12,18);cout<<” [4]: ORDENAR\n”;

gotoxy(12,21);cout<<” [5]: ELIMINAR\n”;

gotoxy(12,24);cout<<” [6]: PRESENTAR\n”;

gotoxy(12,27);cout<<” [7]: PRESENTAR RECORRIDO\n”;

gotoxy(12,30);cout<<” [8]: SALIR DEL MENU\n”;

gotoxy(12,33);cout<<” Elegir una Opci¢n [ ]”;

gotoxy(32,33);cin>>opc;

switch(opc)

case’1′:

clrscr();

insertar();;getch();break;

case’2′:

clrscr();

modificar();getch();break;

case’3′:

clrscr();
buscar();getch();break;

case’4′:

clrscr();

ordenar();getch();break;

case’5′:

clrscr();

eliminar();getch();break;

case’6′:

clrscr();

presentar();getch();break;

case’7′:

clrscr();

presentar_recorrido();getch();break;

}while(opc!=’8′);

getch();

//CREAR LA CABEZA

void crearc()

clrscr();

int dat;

gotoxy(20,20);

cout<<“Ingrese Elemento: “;

cin>>dat;

cab=nuevo_elemento();

cab->dato=dat;

cola=cab;

cola->sig=cab;

cab->ant=cola;

getch();

void insertar()

{
clrscr();

char opc=’ ‘;

do

clrscr();

cuadro(1,10,25,56,’’);

gotoxy(13,3);cout<<“->[ INSERTAR ELEMENMTOS A LA LISTA ENLAZADA ]<-\n”;

gotoxy(12,6); cout<<” [1]: INSERTAR ORDENADO\n”;

gotoxy(12,9);cout<<” [2]: INSERTAR CABEZA\n”;

gotoxy(12,12);cout<<” [3]: INSERTAR AL FINAL\n”;

gotoxy(12,15);cout<<” [4]: REGRESAR\n”;

gotoxy(12,17);cout<<” Elegir una Opci¢n [ ]”;

gotoxy(32,17);cin>>opc;

switch(opc)

case’1′:

clrscr();

insertarordenadoc();getch();break;

case’2′:

clrscr();

insertarinicioc();getch();break;

case’3′:

clrscr();

insertarfinalc();getch();break;

while(opc!=’4′);

getch();

void insertarfinalc()

{
clrscr();

nodoc *elem;

elem=nuevo_elemento();

clrscr();

gotoxy(20,20);

cout<<“\t\t”<<“INGRESE VALOR :\t”;

cin>>elem->dato;

cola->sig=elem;

elem->ant=cola;

elem->sig=cab;

cab->ant=elem;

cola=elem;

getch();

void insertarordenadoc()

nodoc *ant;

nodoc *Aux;

nodoc *post;

int dat;

Aux=nuevo_elemento();

ant=nuevo_elemento();

post=nuevo_elemento();

gotoxy(18,22);

cout<<“Ingrese un elemento: “;

cin>>dat;

Aux->dato=dat;

if(Aux->dato>cab->dato)

ant=cab;

post=cab->sig;

while((Aux->dato>post->dato)&&(post->sig!=cab))

ant=post;

post=post->sig;

if(post->sig==cab)
{

if (Aux->dato<post->dato)

Aux->sig=post;

post->ant=Aux;

ant->sig=Aux;

Aux->ant=ant;

else

Aux->sig=cab;

post->sig=Aux;

Aux->ant=post;

cab->ant=Aux;

cola=Aux;

else

Aux->sig=post;

post->ant=Aux;

ant->sig=Aux;

Aux->ant=ant;

else

Aux->dato=dat;

Aux->sig=cab;

cab->ant=Aux;

Aux->ant=cola;

cab=Aux;

cola->sig=cab;

void insertarinicioc()

nodoc *Aux;
int dat;

Aux=nuevo_elemento();

gotoxy(18,22);

cout<<“Ingrese un numero:”;

cin>>dat;

Aux->dato=dat;

Aux->sig=cab;

cab->ant=Aux;

cola->sig=Aux;

Aux->ant=cola;

cab=Aux;

getch();

void modificar()

clrscr();

nodoc *modificar;

nodoc *ele;

modificar=nuevo_elemento();

int db,encontrado=0;

modificar=cab;

gotoxy(10,20);

cout<<“\t”<<“INGRESE EL VALOR A MODIFICAR :\t”;

cin>> db;

for(int c=0;c<=1;c++)

while(db!=modificar->dato)

modificar=modificar->sig;

gotoxy(10,22);

cout<<“Elemento existente en la lista”;

encontrado=1;

gotoxy(10,25);

cout<<“\t\t”<<“INGRESE VALOR :\t”;


cin>>ele->dato;

modificar->dato=ele->dato;

c++;

if(encontrado==0)

gotoxy(10,22);

cout<<“Elemento no existente en la lista”;

getch();

void buscar()

clrscr();

cuadro(15,5,50,25,’’);

nodoc *buscar;

buscar=nuevo_elemento();

int db,encontrado=0;

buscar=cab;

gotoxy(18,15);

cout<<“Ingrese el numero a buscar: “;

cin>> db;

for(int c=0;c<=1;c++)

while(buscar->dato!=db)

buscar=buscar->sig;

gotoxy(18,18);

cout<<“Elemento existente en la lista”;

encontrado=1;

c++;

if(encontrado==0)
{

gotoxy(18,18);cout<<“Elemento no existente en la lista”;

getch();

void ordenar()

clrscr();

char opc=’ ‘;

do

clrscr();

cuadro(1,10,25,56,’’);

gotoxy(13,3);cout<<“->[ ORDENAR LAS LISTAS ENLAZADAS ]<-\n”;

gotoxy(12,6);cout<<” MENU PRINCIPAL\n”;

gotoxy(12,9); cout<<” [1]: ORDENAR ASCENDENTE\n”;

gotoxy(12,12);cout<<” [2]: ORDENAR DESCENDENTE\n”;

gotoxy(12,15);cout<<” [3]: REGRESAR\n”;

gotoxy(12,17);cout<<” Elegir una Opci¢n [ ]”;

gotoxy(32,17);cin>>opc;

switch(opc)

case’1′:

clrscr();

ordenarc();break;

case’2′:

clrscr();

ordenarcdesc();break;

while(opc!=’3′);

getch();
}

void ordenarc()

nodoc *aux;

nodoc *temp;

int vaux;

aux=nuevo_elemento();

temp=nuevo_elemento();

aux=cab;

while (aux->sig!=cab)

temp=aux;

while(temp->sig!=cab)

temp=temp->sig;

if(aux->dato>temp->dato)

vaux=aux->dato;

aux->dato=temp->dato;

temp->dato=vaux;

aux=aux->sig;

void ordenarcdesc()

nodoc *aux;

nodoc *temp;

int vaux;

aux=nuevo_elemento();

temp=nuevo_elemento();

aux=cab;

while (aux->sig!=cab)

temp=aux;

while(temp->sig!=cab)

{
temp=temp->sig;

if(aux->dato<temp->dato)

vaux=aux->dato;

aux->dato=temp->dato;

temp->dato=vaux;

aux=aux->sig;

void presentar()

clrscr();

nodoc * recorre;

recorre=nuevo_elemento();

recorre=cab;

cout<<“Elementos insertados:\n\n”;

for(int c=0;c<=1;c++)

cout<<recorre->dato<<“\t”;

recorre=recorre->sig;

while(recorre!=cab)

cout<<recorre->dato<<“\t”;

recorre=recorre->sig;

c++;

getch();

void presentar_recorrido()

clrscr();

nodoc * recorre;

recorre=nuevo_elemento();

recorre=cab;
cout<<“Elementos insertados:\n\n”;

for(int c=0;c<=1;c++)

cout<<recorre->dato<<“\t”;

recorre=recorre->sig;

while(recorre!=cab)

cout<<recorre->dato<<“\t”;

recorre=recorre->sig;

cout<<“\n”;

getch();

void eliminar()

presentar();

nodoc *eliminar;

nodoc *asigna;

gotoxy(10,25);cout<<“ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n”;

gotoxy(10,26);cout<<“º º\n”;

gotoxy(10,27);cout<<“ºINSERTAR NUMERO A ELIMINARº\n”;

gotoxy(10,28);cout<<“º º\n”;

gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;

gotoxy(10,31);cout<<“Ingrese el n—mero a eliminar\t”;

cin>>eliminar->dato;

if (eliminar->dato==cab->dato)

eliminar_cabeza();

else

nodoc *anterior=cab;

nodoc * aux=cab->sig;
while((aux!=NULL)&&(aux->dato!=eliminar->dato))

anterior=aux;

aux=aux->sig;

if(aux!=NULL)

asigna=aux->sig;

anterior->sig=asigna;

aux->ant=anterior;

aux->ant=NULL;

aux->sig=NULL;

free(aux);

else

gotoxy(10,33);

cout<<“NO SE ENCUENTRA”;

void eliminar_cabeza()

/* nododoble *aux;

aux=cab;

cab=cab->sig;

// cab->ant=cola;

aux->sig=NULL;

cab->ant=cola;

aux->ant=NULL;

free(aux); */

nodoc *aux;

aux=cab;

cab=cab->sig;

// aux->sig=NULL;

aux->ant=NULL;

free(aux);
}

void cuadro(int x1,int y1, int x2, int y2, char simb)

for (int i1=y1;i1<=y2;i1++)

gotoxy(i1,x1);cout<<simb;

gotoxy(i1,x2);cout<<simb;

for (int i2=x1;i2<=x2;i2++)

gotoxy(y1,i2);cout<<simb;

gotoxy(y2,i2);cout<<simb;

Implementacion de una lista simple enlazada.

Tal vez le interese leer también sobre pilas y colas


Definición auspiciada por Wikipedia: una lista enlazada es una de las
estructuras de datos fundamentales, y puede ser usada para implementar
otras estructuras de datos. Consiste en una secuencia denodos, en los que
se guardan campos de datos arbitrarios y una o dos referencias (punteros)
al nodo anterior o posterior.

Generalmente se usa una lista enlazada cuando no sabemos de antemano


en numero de datos u objetos que queremos almacenar.

Personalmente uso en estos caso como lista un ArrayList.

Humildemente implemento en tres clases una lista sin hace uso de


ninguna librería especificada por la sentencia import; espero les guste y les
sirva.
//Autor: Rey Salcedo
public class Nodo{

private Object dato;


private Nodo nodo;

public Nodo(){
dato = null;
Nodo nodo = null;
}
public Nodo(Object dato){
this();
this.dato = dato;
}
public void setDato(Object dato){
this.dato = dato;
}

public Object getDato(){


return dato;
}

public void setNodo(Nodo nodo){


this.nodo = nodo;
}

public Nodo getNodo(){


return nodo;
}
}
//Autor: Rey Salcedo
public class Lista{
private Nodo cabecera;
private int tamaño;

public Lista(){
tamaño = 0;
cabecera = new Nodo();
}

public int getTamaño(){


return tamaño;
}

public boolean addDato(Object dato){


Nodo nodoUltimo = getUltimoNodo();
if(dato != null && nodoUltimo != null){
nodoUltimo.setNodo(new Nodo(dato));
tamaño ++;
return true;
}else{
return false;
}
}

private Nodo getUltimoNodo(){


Nodo nodoUltimo = null;
if(cabecera != null){
nodoUltimo = cabecera;
while(nodoUltimo.getNodo() != null){
nodoUltimo = nodoUltimo.getNodo();
}
}
return nodoUltimo;
}

public Object getDato(int pos){


Nodo nodoUltimo = null;
int contador = 0;
Object dato = null;
if(cabecera != null){
nodoUltimo = cabecera;
do{
nodoUltimo = nodoUltimo.getNodo();
if(contador == pos){
dato = nodoUltimo.getDato();
break;
}else{
contador++;
}
}while(nodoUltimo.getNodo() != null);
}
return dato;
}
}
//Autor: Rey Salcedo
public class Main{
public static void main(String []args){
Lista lista = new Lista();

//Adjuntando datos
lista.addDato("Hola");
lista.addDato("mundo");
lista.addDato("aqui");
lista.addDato("estoy");

System.out.println("-------Imprimiendo datos-------");

for(int i = 0;i < lista.getTamaño();i ++){


System.out.println(lista.getDato(i));
}
}
}
- See more at: http://usandojava.blogspot.pe/2011/12/implementacion-de-una-lista- Field Code Changed
simple.html#sthash.7iuKWkQ8.dpuf

Un bus de datos es un sistema que se encarga de transferir datos entre componentes


de una computadora o red de computadoras.

En simples palabras, el bus permite la conexión entre diferentes elementos (o sub


sistemas) de un sistema digital principal, y envía datos entre dichos elementos. Estos
“datos” se encuentran en formas de señales (digitales) que pueden ser precisamente
de “datos”, de “direcciones” o de “control”.

Como todo lo relacionado a la tecnología, y principalmente lo ligado a la informática,


podemos descifrar que elementos como un bus de datos ha ido evolucionando con el
tiempo. Y así es efectivamente. Los primeros buses de datos se denominaban
“paralelos”, por lo cual la conexión entre elementos de una misma computadora (o
sistema digital) se realizaba mediante cintas que conectaban unos y otros elementos.

En cambio, los ordenadores más modernos, a partir del desarrollo de la conexión USB,
los buses de datos ahora se denominan “seriales” y ofrece este cambio una mayor
velocidad de respuesta y eficacia potenciada.

El sistema de medición de la capacidad de un bus de datos está ligada a su frecuencia


máxima de envío posee y el ancho de datos. En general, ambas variables son
inversamente proporcionales (cuando asciende una, descienda la otra, y a la inversa):
si el bus de datos posee una alta frecuencia, el ancho de datos deberá entonces ser
pequeño. Por ello, un bus de datos con pocas señales (o “datos”) puede funcionar a
altas velocidades.

En cuanto a la evolución de los buses de datos podemos identificar tres


“generaciones”: la primera de ellas, remite a aquellos sistemas digitales o
computadores que poseían dos buses de datos, uno de ellos asignado a la memoria, y
el otro asignado a los demás dispositivos. Esta primera generación de buses de datos
fue desarrollada entre la década del ´70 y ’80. Recordemos que los buses siempre
enviaban datos a la CPU, y su acción era en combinación con la misma. Los buses de
segunda generación, poseen mayor autonomía, algunos integrados al chipset del
sistema y otros con controladores instalados en el propio bus, que permitía mayor
velocidad.

La tercera generación está signada por el tipo de buses “seriales”, que tienen como
objetivo reducir el número de conexiones de cada dispositivo que se conecta a la
computadora. El “trámite” es directamente entre el dispositivo conectado (mediante
conexión USB, por ejemplo) y el bus de datos que recibe las órdenes.

Definición Siguiente >>

Relacionadas

ConexiónUSBBase de DatosDatosPuerto ParaleloCPU

... Via Definicion.mx: http://definicion.mx/bus-de-datos/

5 - Funcionamiento de los Buses de datos, de


dirección y de control
¿QUE ES UN BUS?
En informática, un bus es un conjunto cableado que sirve para que los dispositivos
hardware puedan comunicarse entre sí. Son rutas compartidas por todos los
dispositivos y les permiten transmitir información de unos a otros, son, en definitiva, las
autopistas de la información interna, las que permiten las transferencias de toda la
información manejada por el sistema.

En un bus, todos los nodos conectados a él reciben los datos que se vuelcan, pero sólo
aquél dispositivo al que va dirigida la información es quien la toma y la procesa, el resto
la ignora.

Los conductores eléctricos de un bus pueden ser tanto en paralelo como en serie. El bus
de datos de los discos duros IDE (ATA) es paralelo (varios cables); en cambio, en los
discos Serial ATA, el bus es serie (una sola vía de datos).

Existen varios tipos:


- Bus de direcciones
- Bus de control
- Bus de datos

En esta imagen tenemos una representación de la arquitectura Northbridge/Southbridge.


Las flechas indican buses de datos que comunican los diferentes dispositivos de un
ordenador. El chipset de una placa base, formado básicamente por el Northbridge
(controlador de puente norte) y el Southbridge (controlador de puente sur), se encarga
de gobernar las comunicaciones en los buses, de la misma manera que los semáforos
regulan el tráfico en las calles de una ciudad.

El Northbridge es el chip más importante, el núcleo de la placa base; tiene la función de


controlar las comunicaciones entre procesador, memoria RAM, tarjeta gráfica y el
Southbridge, y servir de conexión central entre los dispositivos mencionados.

El Southbridge es un chip que controla los dispositivos de entrada/salida del sistema


(periféricos como disco duro, teclado, ratón, puertos PCI...), se comunica con el resto del
sistema mediante el chip principal: Northbridge.

Uno de los buses de datos más importante es el que conecta al procesador (CPU) con el
resto del sistema a través del Northbridge, se le conoce como FSB (bus frontal), y
transmite toda la información del procesador al resto de dispositivos y viceversa. La
frecuencia de un procesador se expresa en términos de la frecuencia del FSB
multiplicado por un valor predeterminado por el fabricante, por eso conocer bien el FSB
es vital en la práctica del Overclocking (forzar un procesador a trabajar a una velocidad
mayor que la de serie).

El resto de buses no tienen un nombre concreto y se les conoce por el dispositivo con el
que conectan. El bus de memoria conecta la memoria RAM al sistema mediante el
Northbridge (en algunas arquitecturas, como HyperTransport, la memoria RAM se
comunica directamente con el procesador sin pasar por el Northbridge), el bus AGP (o
PCI-Express) conecta la tarjeta gráfica con el Northbridge. También existe un bus
especial que conecta el Northbridge con el Southbridge, ya que estos chips deben
pasarse grandes cantidades de datos debido a la naturaleza de los dispositivos que
controlan.
En la siguiente imagen mostramos una variación de la arquitectura mencionada
anteriormente, aunque sus fundamentos son muy similares. En este caso la memoria se
conecta a la CPU directamente mediante un controlador independiente, el resto es
similar cambiando algunos nombres. Las flechas y barras de color verde (y negro)
indican buses de datos.

Por tanto, el bus de datos y las interconexiones de la placa base, así como su chipset,
son esenciales para la eficiencia. De nada serviría un procesador extremadamente
rápido, si las tuberías que le abastecen y a través de las cuales debe mandar la
información son lentas. De ahí que una buena placa base, con un chipset potente y unas
conexiones internas rápidas, sea extremadamente importante al comprar un ordenador a
fin de mantener estabilidad y equilibrio entre los componentes.

FUNCIONAMIENTO
En el bus se encuentran dos pistas separadas, el bus de datos y el bus de direcciones.
La CPU escribe la dirección de la posición deseada de la memoria en el bus de
direcciones accediendo a la memoria, teniendo cada una de las líneas carácter binario.
Es decir solo pueden representar 0 o 1 y de esta manera forman conjuntamente el
numero de la posición dentro de la memoria (es decir: la dirección). Cuanto mas líneas
haya disponibles, mayor es la dirección máxima y mayor es la memoria a la cual puede
dirigirse de esta forma. En el bus de direcciones original habían ya 20 direcciones, ya
que con 20 bits se puede dirigir a una memoria de 1 MB y esto era exactamente lo que
correspondía a la CPU.

Esto que en le teoría parece tan fácil es bastante mas complicado en la práctica, ya que
aparte de los bus de datos y de direcciones existen también casi dos docenas más de
líneas de señal en la comunicación entre la CPU y la memoria, a las cuales también se
acude. Todas las tarjetas del bus escuchan, y se tendrá que encontrar en primer lugar
una tarjeta que mediante el envío de una señal adecuada indique a la CPU que es
responsable de la dirección que se ha introducido. Las demás tarjetas se despreocupan
del resto de la comunicación y quedan a la espera del próximo ciclo de transporte de
datos que quizás les incumba a ellas.

PROCESADOR Bus de direcciones Bus de datos

8086 20 16

8088 20 8

80186 20 16

80188 20 8

80286 24 16

80386 SX 32 16

80386 DX 32 32

80486 DX 32 32

80486 SX 32 32

PENTIUM 32 64

PENTIUM PRO 32 64

Este mismo concepto es también la razón por la cual al utilizar tarjetas de ampliación en
un PC surgen problemas una y otra vez, si hay dos tarjetas que reclaman para ellas el
mismo campo de dirección o campos de dirección que se solapan entre ellos.

Los datos en si no se mandan al bus de direcciones sino al bus de datos. El bus XT tenía
solo 8 bits con lo cual sólo podía transportar 1 byte a la vez. Si la CPU quería depositar el
contenido de un registro de 16 bits o por valor de 16 bits, tenía que desdoblarlos en dos
bytes y efectuar la transferencia de datos uno detrás de otro.

De todas maneras para los fabricantes de tarjetas de ampliación, cuyos productos deben
atenderse a este protocolo, es de una importancia básica la regulación del tiempo de las
señales del bus, para poder trabajar de forma inmejorable con el PC. Pero precisamente
este protocolo no ha sido nunca publicado por lBM con lo que se obliga a los fabricantes
a medir las señales con la ayuda de tarjetas ya existentes e imitarlas. Por lo tanto no es
de extrañar que se pusieran en juego tolerancias que dejaron algunas tarjetas totalmente
eliminadas.

Bus de direcciones

Es utilizado por el microprocesador para señalar la celda de memoria (o el


dispositivo de E/S) con el que se quiere operar. El tipo de operación será de
lectura o de escritura y los datos implicados viajarán por el bus de datos.

Por él circula la expresión binaria de la dirección de memoria a la cual el


microprocesador quiere acceder. Tiene sentido de flujo unidireccional desde el
microprocesador hacia la memoria. Una vez localizados los datos perdidos, su
transmisión hacia el microprocesador (o hacia donde sea) se hará a través del
bus de datos.

Los dispositivos de E/S intercambian la información con el microprocesador


mediante los puertos de E/S. Cada puerto está asociado con un determinado
dispositivo y tiene una dirección que lo identifica.

El ancho de este bus también es una medida de la potencia del


microprocesador, ya que determina la cantidad de memoria a la que éste puede
acceder, es decir, la cantidad de espacio direccionable. El espacio de
direcciones es el rango de valores distintos que el microprocesador puede
seleccionar. La cantidad máxima de direcciones disponibles será 2 a la n, siendo
n el número de líneas del bus de direcciones.

Tipos de bus

Existen dos grandes tipos clasificados por el método de envío de la información: bus
paralelo o bus serie.

Hay diferencias en el desempeño y hasta hace unos años se consideraba que el uso
apropiado dependía de la longitud física de la conexión: para cortas distancias el bus
paralelo, para largas el serial.

Bus paralelo
Es un bus en el cual los datos son enviados por bytes al mismo tiempo, con la ayuda de
varias líneas que tienen funciones fijas. La cantidad de datos enviada es bastante grande
con una frecuencia moderada y es igual al ancho de los datos por la frecuencia de
funcionamiento. En los computadores ha sido usado de manera intensiva, desde el bus
del procesador, los buses de discos duros, tarjetas de expansión y de vídeo, hasta las
impresoras.
Diagrama de un Bus Backplane como extensión del bus de procesador.

El Front Side Bus de los procesadores Intel es un bus de este tipo y como cualquier bus
presenta unas funciones en líneas dedicadas:

 Las Líneas de Dirección son las encargadas de indicar la posición de memoria o


el dispositivo con el que se desea establecer comunicación.
 Las Líneas de Control son las encargadas de enviar señales de arbitraje entre los
dispositivos. Entre las más importantes están las líneas de interrupción, DMA y los
indicadores de estado.
 Las Líneas de Datos trasmiten los bits de forma aleatoria de manera que por lo
general un bus tiene un ancho que es potencia de 2.
Un bus paralelo tiene conexiones físicas complejas, pero la lógica es sencilla, que lo
hace útil en sistemas con poco poder de cómputo. En los primeros microcomputadores,
el bus era simplemente la extensión del bus del procesador y los demás integrados
"escuchan" las línea de direcciones, en espera de recibir instrucciones. En el PC IBM
original, el diseño del bus fue determinante a la hora de elegir un procesador con I/O de
8 bits (Intel 8088), sobre uno de 16 (el 8086), porque era posible usar hardware diseñado
para otros procesadores, abaratando el producto.
Bus serie

En este los datos son enviados, bit a bit y se reconstruyen por medio de registros o
rutinas de software. Está formado por pocos conductores y su ancho de banda depende
de la frecuencia. Es usado desde hace menos de 10 años en buses para discos duros,
unidades de estado sólido, tarjetas de expansión y para el bus del procesador.

Publicado por DJ_masters2411 en 11:55


Buses

Todos estos elementos se comunican entre si a través de buses, ya


sea para manejar las acciones a realizar por la máquina o para
mover datos. Hay tres tipos de buses.

El bus de datos perite el intercambio de datos (ya sean


instrucciones o datos) con el resto de elementos de la
arquitectura. Es decir, mediante el bus de datos la unidad de
control recibe las instrucciones y la ALU los datos desde la
memoria, al igual que también los envían por este medio.

El bus de instrucciones transmite las direcciones de memoria que


van a ser usadas desde la CPU, para poder seleccionar los datos
que serán usados.

El bus de control es el que transporta las ordenes generadas por


la CPU para controlar los diversos procesos de la máquina.

Funcionamiento de la arquitectura

Para ver cómo funciona la arquitectura he creado una


representación documentada del proceso.

Este diseño de la arquitectura, como ya he comentado, es el


básico (con acumulador como registro de entrada) y el ancho de
los datos es de 8 bits. Las instrucciones están formadas por dos
bloques de 4 bits, los primeros para instrucciones y los últimos
para la dirección de la memoria.
Siempre que se usa en una instrucción un número está destinado
a la dirección de memoria, donde se usa el verdadero número que
se usará para una operación.

Actualmente se usan anchos de 32, 64 o 128 bits en


computadoras, y no tiene porqué seguir el mismo patrón.
Seguidamente voy a exponer varios patrones que se pueden dar,
a fin de completar un poco más la representación que es muy
simple al disponer solo de 8 bits.

# Tal como aparece en la representación

0111 0011

+------+------+

| 0111 | 0011 |

+------+------+

| | Dirección de memoria a usar

| Instrucción

# Ejemplo con 16 bits y varios registros


0011 1010 1001 0101

+------+--------+--------+

| 0011 | 101010 | 010101 |

+------+--------+--------+

| | | Registro de entrada 2

| | Registro de entrada 1

| Instrucción

# Ejemplo con 32 bits, varios registros y lugar a almacenar resultado

0011 1010 1001 0101 0011 0110 1110 0101

+----------+----------+----------+----------+

| 00111010 | 10010101 | 00110110 | 11100101 |


+----------+----------+----------+----------+

| | | | Dirección de destino del

resultado

| | | Registro de entrada 2

| | Registro de entrada 1

| Instrucción

Nota: cada procesador es distinto, por lo que quizás alguno de


los ejemplos sea verídico o similar a alguno en uso, pero no tiene
porqué.

Como había dicho, aquí tenemos la simulación documentada de


como funciona la arquitectura de Von Neumann, que podéis ver
con mayor tamaño también. (Es más cómodo pasar al siguiente
paso pulsando enter).

Resumen

Aunque es un poco difícil de comprender a la primera es esencial


conocer las bases de la computación cuando uno se dedica a la
programación, y así llegar a comprender como afecta nuestros
programas a la interacción del sistema. Aunque actualmente
muchos lenguajes nos abstraen de todo esto, pero eso ya sería
entrar en arquitectura del software.
Bus de Datos. Cómo se transportan
los datos.
en Componentes del ordenador por Angel Calzado

H asta el momento hemos comparado las partes del cuerpo con los diferentes
elementos de un computador. Ahora vamos a hablar del Bus de datos. El Bus de datos
es como nuestro sistema circulatorio, sólo que cambiamos venas y arterias por cables y
redes de circuitos integrados en placa. Por lo tanto, el Bus de datos es el que tiene la
misión de repartir todos los datos a través del ordenador. Por analogía, imaginemos
cualquier ciudad del mundo con todos sus elementos: El ayuntamiento, el campo de
fútbol o la universidad que están conectados a través de calles y carreteras. Si lo
miramos bien, todo está conectado con todo. Asimismo, la comunicación es mejor
cuanto mayor es el caudal de tráfico que pueden manejar esas calles y carreteras.
Cuando hay más vehículos de los que puede absorber una vía, lo normal es que se
produzcan atascos y los vehículos circulen con mayor lentitud o incluso dejen de
circular. Con el Bus de datos pasa lo mismo; si no es capaz de absorber el tránsito de
comunicaciones entre los diferentes elementos del computador, los procesos se realizan
con mayor lentitud, y, por lo tanto, el rendimiento baja o incluso hace que el
computador se detenga.
Bus en placa impresa
A la hora de vendernos cualquier computador nos dan un montón de especificaciones
técnicas tales como la capacidad, el tamaño de disco duro, la memoria Ram o los
píxeles de resolución de la imagen de la cámara, pero siempre suelen obviar la
capacidad de transmisión de datos del Bus.
A la hora de transmitir la información hay que hacerlo de manera organizada, de manera
que para ello hay tres tipos básicos de Bus, que son una evolución constante del mismo
concepto:

Tipos de Bus

 Bus de Control: Es el que realiza el control de lo que se transmite y cuando se transmite,


teniendo control sobre los usos y direcciones.
 Bus de Direcciones: Es un canal independiente al Bus de datos general que sirve para
asignar posiciones en la entrada de las direcciones de la memoria.
 Bus de datos: Es propiamente dicho el envío de datos entre los diferentes elementos que
forman el computador.
Jerarquía de diversos buses en un equipo relativamente moderno: SATA, FSB, AGP,
USB entre otros.
«Chipset 875 Intel» por Chrihern – Trabajo propio. Disponible bajo la licencia Public domain vía Wikimedia Commons.

Por lo tanto, el Bus de dirección asigna hacía donde se va, el Bus de control realiza el
seguimiento de lo que se envía y como se envía y el Bus de datos es el que envía los
datos que deben ser procesados o ejecutados según corresponda. Haciendo una
comparación con la vida real, imaginemos que un vehículo tiene que ir de un extremo a
otro de una ciudad. El mapa que lleva el conductor asigna el lugar al que hay que ir, los
semáforos y las señales de tráfico controlan el recorrido y dentro del coche va el
paquete que debemos llevar de un lugar a otro a través de las carreteras y calles.
El Bus de datos puede sufrir atascos.
Como resumen diremos que el Bus es un elemento tan importante dentro de un
computador que a la hora de comprar informática hay que tomarlo muy en cuenta, ya
que si tenemos una CPU de alto rendimiento, una memoria Ram con una capacidad muy
alta y un Bus de baja tasa de datos y baja calidad, el computador funcionará mal. Un
ejemplo suele ser la gama baja de muchas marcas de tablets y smartphones; buen
procesador, memoria Ram aceptable y Bus penoso dando como resultado un equipo que
sólo nos dará problemas.

Bus de datos USB. Lo conecta casi


todo.
en Componentes del ordenador por Angel Calzado
H ace unos artículos hablamos del Bus de datos, que es la manera de transmitir
datos de un lugar a otro dentro de un ordenador, incluidas las comunicaciones con otros
aparatos, también denominados periféricos. Pues dentro de todos los Buses de datos
existentes para comunicarse con el exterior, el que más importancia con diferencia tiene
es el Bus de datos USB. Como casi todo en informática el nombre del Bus de datos
USB proviene del inglés, en concreto de “Universal Serial Bus”. Se trata de un Bus que
no sólo traslada datos, sino que provee de energía eléctrica a otros aparatos o periféricos
que pueda tener un ordenador. Cuando hablamos del Bus de datos USB se suman los
conectores, los cables y los protocolos (o sea, los idiomas ) que se usan para su uso.

Conectores USB type-A en placa base


El Bus de datos USB es el estándar más usado en la actualidad para la conexión de
periféricos de todo tipo, desde una cámara de vídeo a una impresora, pasando por el
teclado y el ratón. La aparición y difusión del Bus de datos USB ha supuesto la
eliminación de multitud de conectores de todo tipo, algunos de los cuales todavía siguen
apareciendo en algunas placas base por razones más históricas que prácticas.
Conectores usados antes de aparecer el Bus de datos USB

 Conectores PS/2. Se trata de un tipo de conectores diseñados en 1987 por IBM y que se
hicieron muy populares. Servían sólo para conectar el teclado y el ratón al computador. En
la actualidad casi no se usan ya que USB lo sustituye por completo.

Conectores ps/2

 Puerto Paralelo. Muy utilizado para la conexión con impresoras y muy usado para
conexiones en equipos de imagen y sonido en general. Se sigue usando para la conexión
de discos duros internos (PATA) a través de conectores internos en la placa base, aunque
ha sido sustituido por USB para casi cualquier periférico.
Conector paralelo

 Puerto Serie. Puerto que ya no se usa para casi nada por su lentitud, aunque sigue
presente en algunas placas base y fue muy usado en equipos de la marca Apple.
 Firewire IEEE 1394. Es uno de los grandes perdedores por la aparición de USB. Se utiliza
para la conexión de videocámaras y cámaras digitales al ordenador de manera que se
pueda capturar la imagen ofrecida por las cámaras. Tiene altas tasas de transferencia de
datos, incluso superiores a algunos tipos de USB. Sin embargo, las políticas de Apple y la
gran difusión y mejora de USB han hecho de este conector algo casi del pasado, por lo
menos en lo que se refiere a la informática de usuarios.
Conector Firewire IEEE 1394 en placa base

 Conectores de dispositivos móviles. La telefonía móvil, desde la aparición de los


ordenadores personales, ha intentado comunicarse con ellos a través de diferentes
conectores. Cada marca utilizaba conectores completamente diferentes creándose una
gran industria alrededor de la venta de cables y alimentadores. Con el tiempo, y por
razones medioambientales, entre otras, la gran mayoría de los fabricantes acordaron
utilizar USB para todas las conexiones de datos, excepto Apple, que, por el momento, usa
conectores propios para productos como Iphone o Ipad.
Conectores variados para dispositivos móviles
Los conectores del Bus de datos USB pueden tener varias formas y tamaños que quedan
resumidos en el siguiente dibujo.
No vamos a dar los datos técnicos de cada conector, pero como se puede ver, como todo
en la vida, USB ha evolucionado con el paso del tiempo. Destacar que en el momento
de redactar este artículo se ha finalizado el diseño de un nuevo conector USB 3.1 type-
C reversible que pretende sustituir a todos los que existen en la actualidad y que pronto
comenzará a incluirse en equipos nuevos. Para todos aquellos que deseen conocer las
características de este nuevo conector dejo aquí el enlace del conector reversible USB
3.1 Type-C. Eso sí, siento decir que la documentación está en inglés, pero, aún así,
aparecen unos esquemas y dibujos muy interesantes.

Resumiendo, a día de hoy, USB lo conecta casi todo en cuanto a la transferencia de


datos, tiene la gama de conectores más usada en la actualidad y es un amigo inseparable
de la informática de usuarios.
Compartir




 1

Relacionado
Placa Base. El cuerpo de un ordenador.
En "Componentes del ordenador"

El ordenador y sus partes fundamentales.


En "Componentes del ordenador"

Bus de Datos. Cómo se transportan los datos.


En "Componentes del ordenador"
POS DE BUSES POR SU USO

Bus de Direcciones : Este es un bus unidireccional debido a que


la información fluye es una sola dirección, de la CPU a la
memoria ó a los elementos de entrada y salida. La CPU sola
puede colocar niveles lógicos en las n líneas de dirección, con la
cual se genera 2n posibles direcciones diferentes. Cada una de
estas direcciones corresponde a una localidad de la memoria ó
dispositivo de E / S.
Los microprocesadores 8086 y 8088 usados en los primeros
computadores personales (PC) podían direccionar hasta 1
megabyte de memoria (1.048.576 bytes). Es necesario contar con
20 líneas de dirección. Para poder manejar más de 1 megabyte de
memoria , en los computadores AT (con procesadores 80286) se
utilizó un bus de direcciones de 24 bits, permitiendo así
direccionar hasta 16 MB de memoria RAM (16.777.216 bytes). En
la actualidad los procesadores 80386DX pueden direccionar
directamente 4 gigabytes de memoria principal y el procesador
80486DX hasta 64 GB.

Bus de Datos : Este es un bus bidireccional, pues los datos


pueden fluir hacia ó desde la CPU. Los m terminales de la CPU,
de D0 - Dm-1 , pueden ser entradas ó salidas, según la operación
que se este realizando ( lectura ó escritura ) . en todos los casos,
las palabras de datos transmitidas tiene m bits de longitud debido
a que la CPU maneja palabras de datos de m bits; del número de
bits del bus de datos, depende la clasificación del
microprocesador.
En algunos microprocesadores, el bus de datos se usa para
transmitir otra información además de los datos ( por ejemplo,
bits de dirección ó información de condiciones ). Es decir, el bus
de datos es compartido en el tiempo ó multiplexado. En general
se adoptó 8 bits como ancho estándar para el bus de datos de los
primeros computadores PC y XT. Usualmente el computador
transmite un caracter por cada pulsación de reloj que controla el
bus (bus clock), el cual deriva sus pulsaciones del reloj del
sistema (system clock). Algunos computadores lentos necesitan
hasta dos pulsaciones de reloj para transmitir un caracter.
Los computadores con procesador 80286 usan un bus de datos
de 16 bits de ancho, lo cual permite la comunicación de dos
caracteres o bytes a la vez por cada pulsación de reloj en el bus.
Los procesadores 80386 y 80486 usan buses de 32 bits. El
PENTIUM de Intel utiliza bus externo de datos de 64 bits, y uno de
32 bits interno en el microprocesador.

Bus de Control : Este conjunto de señales se usa para sincronizar


las actividades y transacciones con los periféricos del sistema.
Algunas de estas señales, como R / W , son señales que la CPU
envía para indicar que tipo de operación se espera en ese
momento. Los periféricos también pueden remitir señales de
control a la CPU, como son INT, RESET, BUS RQ.
Las señales más importantes en el bus de control son las señales
de cronómetro, que generan los intervalos de tiempo durante los
cuales se realizan las operaciones. Este tipo de señales depende
directamente del tipo del microprocesador.

TIPOS DE BUSES POR SU TECNOLOGIA


¿Qué son los Buses?
Un bus se puede definir como una línea de interconexión
portadora de información, constituida por varios hilos
conductores (en sentido físico) o varios canales (en sentido de la
lógica), por cada una de las cuales se transporta un bit de
información. El número de líneas que forman los buses (ancho
del bus) es fundamental: Si un bus está compuesto por 16 líneas,
podrá enviar 16 bits al mismo tiempo.
Los buses interconexionan toda la circuitería interna.
Es decir, los distintos subsistemas del ordenador intercambian
datos gracias a los buses.
Podemos clasificar a los buses, según el criterio de su situación
física:

Buses internos
Buses Externos

Bus Interno: Este mueve datos entre los componentes internos


del microprocesador.

Todas las partes del microprocesador están unidas mediante


diversas líneas eléctricas. El conjunto de estas líneas se
denominan bus interno del microprocesador. Por este bus interno
circulan los datos (bus de datos), las señales de control (bus de
control) o las direcciones de memoria (bus de direcciones).
Cuando se habla de un microprocesador de 32 bits, se esta
diciendo que el número de líneas del bus interno es de 32.

El bus interno puede compararse a los vasos sanguíneos del


cuerpo humano. Así,por las diferentes líneas fluye la información,
llegando o abandonando los registros y las memorias.

Bus Externo: Este se utiliza para comunicar el micro y otras


partes, como periféricos y memoria.

Tipos de Buses

La placa madre es la tarjeta más grande que se puede visualizar


dentro de una PC y la más importante, ya que la misma contiene
todo el circuito lógico principal para que funcione, además de
alojar el procesador y otros componentes de suma importancia.

Dentro de esta placa los buses de datos comúnmente llamadas


ranuras de expansión ocupan gran parte de la misma. Estas
ranuras indican la denominada arquitectura de sistema.

Los buses de datos sirven para instalar las placas controladoras


que realizan funcion es específicas, como por ejemplo, la tarjeta
de video, controladora de disco, placa de sonido, etc.

A través de estos buses circulan datos y direcciones que serán


tratados por los dispositivos y el procesador de acuerdo a un
régimen de llamadas o interrupciones que indican desde donde
provienen los datos o hacia donde deben viajar.

Buses ISA:

Las siglas significan INDUSTRY STANDARD ARQUITECTURE.

Las primeras computadoras personales estaban equipadas con


ranuras de 8 bits, que para la velocidad de aquellos procesadores
eran suficiente. Actualmente son lentas para los procesadores
que existen.

Buses MCA:

A medida que los procesadores aumentaron su velocidad, los


buses ISA debieron mantener su velocidad para permanecer
dentro del estándar, desaprovechando los mayores rendimientos
de procesadores y dispositivos.

IBM desarrolló la denominada ARQUITECTURA DE BUS


MICROCANAL (MCA). Basada en
ranuras de expansión 32 bits, introdujo cambios de diseño y
nuevos conceptos de gestión y funcionamiento del bus.

El bus MCA es totalmente incompatible con los demás y de uso


exclusivo de IBM. Por ello,quedó prácticamente en desuso.

Buses EISA:

Las siglas significan EXTENDED INDUSTRY STANDARD


ARQUITECTURE.
Arquitectura estándar industrial extendida. Tiene características
de la ISA en cuanto a su compatibilidad pero con la velocidad de
MCA es decir, 32 bits.

Buses VESA:

Las ranuras VESA (VIDEO ELECTRONICA STANDARD


ASOCIATION) son una extensión de
ISA. Incluye toda la tecnología de EISA, funcionan al ritmo del
microprocesador y permiten la transferencia de datos sin
necesidad de que estos intervengan permitiendo procesos
mucho más rápidos y dejando mayor tiempo libre al
microprocesador central. Si bien esta característica lo hace más
rápido, lo complejo de su coxionado límite, la cantidad de 2 o 3
ranuras solamente.

Buses PCI:

Las siglas significan PERIPHERICAL COMPONENT


INTERCONECT.

Interconexión a componentes perimetrales. Es de características


similares a VESA, pero se
distingue porque la conexión del bus con el microprocesador se
efectúa por intermedio de un
chip adicional que simplifica y suprime las limitaciones de la
conexión directa.

Permite hasta 10 ranuras de expansión simultáneas pero


direccionables, es decir, no es lo
mismo colocar una placa PCI en cualquier ranura, deben tener un
orden determinado.

Bus AGP
Las siglas AGP corresponden a Advanced Graphics Port, o
Puerto Avanzado de Gráficos. Se trata de un nuevo sistema para
conectar periféricos en la placa base del PC; es decir, es un
nuevo bus por el que van datos del microprocesador al
periférico.

Su propio nombre nos define este nuevo bus: Puerto, puesto que
se comunica con el micro de manera más íntima que otros buses
como PCI (a costa de permitir sólo 1 ranura o slot); Avanzado,
como corresponde a una tecnología moderna que pretende
superar las limitaciones del PCI ; y de Gráficos, ya que ha sido
diseñado pensando en ese uso exclusivamente.

El objetivo a la hora de crear este bus era conseguir una tasa de


transferencia de datos micro-tarjeta gráfica superior a la que
ofrece el PCI de 32 bits a 33 MHz, 132 MB/s. Esta tasa resulta
suficiente para aplicaciones 2D, pero insuficiente (al menos en
teoría) para las nuevas tarjetas 3D, que deben transmitir varios
"megas" de texturas para obtener el máximo realismo.

CardBus y PC Card (comúnmente PCMCIA)

Las computadoras portátiles tienen dos slots para adaptadores


de "credit card". Esta interface fue llamada "PCMCIA", hoy
también se conoce como "PC Card.". Estos son mucho mas
pequeños, mas caros y mas lentos que los ISA y EISA.
En un portátil cada conector es en si mismo un dispositivo de
I/O.

BIBLIOGRAFIA:
www.educar.org/estudiantes/Bus/index.htm
www.conozcasuhardware.com/articulo/notic1.htm
atenea.udistrital.edu.co/egresados/jaime/buses.html#controlLOS
TIPOS DE BUSES DE DATOS
En arquitectura de computadores, el bus es un sistema digital que transfiere datos
entre los componentes de una computadora o entre computadoras. Está formado por
cables o pistas en un circuito impreso, dispositivos
como resistencias ycondensadores además de circuitos integrados.
En los primeros computadores electrónicos, todos los buses eran de tipo paralelo, de
manera que la comunicación entre las partes del computador se hacía por medio de
cintas o muchas pistas en el circuito impreso, en los cuales cada conductor tiene una
función fija y la conexión es sencilla requiriendo únicamente puertos de entrada y de
salida para cada dispositivo
una computadora o entre computadoras. Está formado por cables o pistas en
uncircuito impreso, dispositivos como resistencias y condensadores además
decircuitos integrados.
En los primeros computadores electrónicos, todos los buses eran de tipo paralelo, de
manera que la comunicación entre las partes del computador se hacía por medio de
cintas o muchas pistas en el circuito impreso, en los cuales cada conductor tiene una
función fija y la conexión es sencilla requiriendo únicamente puertos de entrada y de
salida para cada dispositivo
TIPOS DE
BUS Ex
isten dos grandes tipos clasificados por el método de envío de la información:bus
paralelo o bus serie.
Hay diferencias en el desempeño y hasta hace unos años se consideraba que el uso
apropiado dependía de la longitud física de la conexión: para cortas distancias el bus
paralelo, para largas el serial.

BUS PARALELO
Es un bus en el cual los datos son enviados por bytes al mismo tiempo, con la ayuda
de varias líneas que tienen funciones fijas. La cantidad de datos enviada es bastante
grande con una frecuencia moderada y es igual al ancho de los datos por la frecuencia
de funcionamiento. En los computadores ha sido usado de manera intensiva, desde el
bus del procesador, los buses de discos duros, tarjetas de expansión y de vídeo, hasta
las impresoras.

Diagrama de un Bus Backplane como extensión del bus de procesador.

 Las Líneas de Dirección son las encargadas de indicar la posición de


memoria o el dispositivo con el que se desea establecer comunicación.
 Las Líneas de Control son las encargadas de enviar señales de arbitraje entre
los dispositivos. Entre las más importantes están las líneas de interrupción, DMA y los
indicadores de estado.
 Las Líneas de Datos trasmiten los bits de forma aleatoria de manera que por
lo general un bus tiene un ancho que es potencia de 2.
Un bus paralelo tiene conexiones físicas complejas, pero la lógica es sencilla, que lo
hace útil en sistemas con poco poder de cómputo. En los primeros
microcomputadores, el bus era simplemente la extensión del bus del procesador y los
demás integrados "escuchan" las línea de direcciones, en espera de recibir
instrucciones. En el PC IBM original, el diseño del bus fue determinante a la hora de
elegir un procesador con I/O de 8 bits (Intel 8088), sobre uno de 16 (el 8086), porque
era posible usar hardware diseñado para otros procesadores, abaratando el producto.
BUS
SERIE
En este los datos son enviados, bit a bit y se reconstruyen
por medio de registros o rutinas de sofware Está formado por
pocos conductores y su ancho de banda depende de la
frecuencia. Es usado desde hace menos de 10 años en buses
para discos duros, unidades de estado sólido, tarjetas de
expansión y para el bus del procesador.

BUSES, TIPOS DE
BUSES Y FUNCIÓN DE
CADA UNO DE
ELLOS.
sábado, 7 de marzo de 2015

BUSES, TIPOS DE BUSES Y FUNCIÓN DE CADA UNO DE ELLOS.


BUSES, TIPOS DE BUSES Y FUNCIÓN DE CADA UNO DE ELLOS.

Los buses son el elemento permite transferir toda la información, desde las operaciones más
sencillas de la UCP, así como toda transferencia de datos entre los distintos dispositivos
conectados al sistema central. Memoria, tarjetas gráficas, teclados, etc.… y en definitiva
cualquier periférico o dispositivo del ordenador se comunica a través de este elemento.
Existen dispositivos mucho más conocidos que los buses del sistema, pero incluso la tarjeta
gráfica más potente del mercado necesitará comunicar los datos con el sistema, y no sólo eso,
porqué además serán las características del bus las que marcarán el rendimiento de dicha
tarjeta.

BUSES

Un bus, mes un canal de comunicación que las computadoras usan para comunicar
sus componentes entre sí, por ejemplo para comunicar el procesador con los
periféricos, memoria o dispositivos de almacenamiento.

Generalmente el Bus está integrado a la tarjeta madre, en una tarjeta madre muy
posiblemente se encuentre diferentes tipos de buses.

El objetivo de que El bus esté conectado a la tarjeta madre es que los dispositivos
que se conecten a ella, actúen como si estuvieran directamente conectadas con el
procesador.
El bus es el elemento más corriente de comunicación en los computadores y consta
de un camino que permite comunicar selectivamente un número de componentes o
dispositivos, de acuerdo a unas ciertas reglas o normas de conexión. Desempeña por
tanto las tareas de enlace y de conmutador, puesto que permite, en cada momento,
seleccionar los dispositivos que se comunican a través suyo.

En las transferencias de información que se realizan en los buses, hay como mínimo
dos agentes involucrados: el que origina la transferencia, que denominaremos
maestro de la transferencia y el que responde a la misma, que denominaremos
esclavo de la transferencia. No todos los elementos conectados a un bus pueden
actuar como a estos de la transferencia; se denominan maestros potenciales aquellos
elementos que sí tienen esta capacidad.

La operación básica del bus se denomina ciclo de bus. Un ciclo permite realizar una
transferencia elemental de un dato entre dos dispositivos. En esta transferencia, la
información se lleva de un elemento que se denomina fuente a otro que se denomina
destino. Los buses modernos permiten agrupar varias transferencias en una sola
operación, que denominaremos transacción, estas pueden tener los mismos o
distintos destinos, o incluso un mismo elemento puede actuar como fuente y como
destino en distintas transferencias de una misma transacción.

TIPOS DE BUSES POR TECNOLOGÍA

En forma muy general existen tres tipos de buses, de acuerdo a la función que
realizan.

1. Bus de direcciones

2. Bus de datos

3. Bus de control
Bus de Direcciones

Este es un bus unidireccional debido a que la información fluye es una sola dirección,
de la CPU a la memoria ó a los elementos de entrada y salida. La CPU sola puede
colocar niveles lógicos en las n líneas de dirección, con la cual se genera 2n posibles
direcciones diferentes. Cada una de estas direcciones corresponde a una localidad de
la memoria ó dispositivo de E / S.

Bus de Datos

Este es un bus bidireccional, pues los datos pueden fluir hacia o desde la CPU. Los m
terminales de la CPU, de D0 - Dm-1, pueden ser entradas o salidas, según la
operación que se esté realizando (lectura o escritura ) . En todos los casos, las
palabras de datos transmitidas tiene m bits de longitud debido a que la CPU maneja
palabras de datos de m bits; del número de bits del bus de datos, depende la
clasificación del microprocesador.

Bus de Control

Este conjunto de señales se usa para sincronizar las actividades y transacciones con
los periféricos del sistema. Algunas de estas señales, como R / W , son señales que la
CPU envía para indicar que tipo de operación se espera en ese momento. Los
periféricos también pueden remitir señales de control a la CPU, como son INT,
RESET, BUS RQ.
Las señales más importantes en el bus de control son las señales de cronómetro, que
generan los intervalos de tiempo durante los cuales se realizan las operaciones. Este
tipo de señales depende directamente del tipo del microprocesador.

TIPOS DE BUSES POR SU TECNOLOGIA

¿Qué son los Buses?

Un bus se puede definir como una línea de interconexión portadora de información,


constituida por varios hilos conductores (en sentido físico) o varios canales (en
sentido de la lógica), por cada una de las cuales se transporta un bit de información.
El número de líneas que forman los buses (ancho del bus) es fundamental: Si un bus
está compuesto por 16 líneas, podrá enviar 16 bits al mismo tiempo.

Los buses interconexionan toda la circuitería interna.

Es decir, los distintos subsistemas del ordenador intercambian datos gracias a los
buses.

Podemos clasificar a los buses, según el criterio de su situación física:

Buses internos
Buses Externos

Bus Interno: Este mueve datos entre los componentes internos del microprocesador.

Todas las partes del microprocesador están unidas mediante diversas líneas
eléctricas. El conjunto de estas líneas se denominan bus interno del
microprocesador. Por este bus interno circulan los datos (bus de datos), las señales
de control (bus de control) o las direcciones de memoria (bus de direcciones).
Cuando se habla de un microprocesador de 32 bits, se estadiciendo que el número de
líneas del bus interno es de 32.

El bus interno puede compararse a los vasos sanguíneos del cuerpo humano. Así,por
las diferentes líneas fluye la información, llegando o abandonando los registros y las
memorias.

Bus Externo: Este se utiliza para comunicar el micro y otras partes, como periféricos
y memoria.

Tipos de Buses

La placa madre es la tarjeta más grande que se puede visualizar dentro de una PC y
la más importante, ya que la misma contiene todo el circuito lógico principal para
que funcione, además de alojar el procesador y otros componentes de suma
importancia.

Dentro de esta placa los buses de datos comúnmente llamadas ranuras de expansión
ocupan gran parte de la misma. Estas ranuras indican la denominada arquitectura de
sistema.

Los buses de datos sirven para instalar las placas controladoras que
realizan función es específicas, como por ejemplo, la tarjeta de vídeo, controladora
de disco, placa de sonido, etc.

A través de estos buses circulan datos y direcciones que serán tratados por los
dispositivos y el procesador de acuerdo a un régimen de llamadas o interrupciones
que indican desde donde provienen los datos o hacia donde deben viajar.

You might also like