Professional Documents
Culture Documents
Busess L
Busess L
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.
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:
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
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.
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
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
Compartir
455
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.
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
0010101010110101101101011010110110100110111011100011101011101101
Los alumnos
Si es un niño, se le asignará un 0
Si es una niña, se le asignará un 1
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.
00101010101101011011010110101101
10100110111011100011101011101101
10100110111011100011101011101101
00101010101101011011010110101101
0-00101010101101011011010110101101
1-10100110111011100011101011101101
0-0010101010110101101101011010110
1-1101001101110111000111010111011
X-01
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
Conclusió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:
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.
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".
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)
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
Ubicación
Albacete
Mensajes
262
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.
Un saludo.
Citar
3. 30/03/2005, 17:25#3
AvFenix
Master
Ubicación
Valencia
Mensajes
1,248
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
Ubicación
Málaga
Mensajes
9,896
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
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...
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
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
Mensajes
474
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:
que
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
Citar
7. 31/03/2005, 08:18#7
Epaminondas Pantulis
Vive aquí
Edad
44
Mensajes
734
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
es decir, si quisiesemos en un mismo ciclo hacer mas instrucciones es necesario tener mas
unidades funcionales de suma.
Citar
8. 31/03/2005, 11:57#8
AriesMOo
Master
Ubicación
after hour
Mensajes
2,338
No se si lo lei asi exactamente pero ahora he buscado de forma rapida, y he encontrado esto;
Quizas yo no lo entendi bien:
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
Ubicación
Albacete
Mensajes
262
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
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.
Citar
filth2k3
Vive aquí
Ubicación
Sevilla
Mensajes
649
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
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
Motorola 6800
Motorola 6803
Motorola 6809
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
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:
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:
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
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.
//DECLARACIÒN DE PROTOTIPOS
#include<alloc.h>
#include<stdlib.h>
#include<conio.h>
#include<iostream.h>
//Declaramosla estructura
int dato;
}tipoNodo;
//reservamos el espacio de memoria
tipoNodo *nuevo_elemento();
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();
void cuadro(int x1,int y1, int x2, int y2, char simb);
//NUESTRA CABEZA
tipoNodo *cab;
tipoNodo *nuevo_elemento()
tipoNodo *nodo1;
if(!nodo1)
return nodo1;
void main()
clrscr();
crear();
clrscr();
char opc=’ ‘;
do
clrscr();
cuadro(1,10,35,56,’²’);
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);
cin>>cab->dato;
cab->siguiente=NULL;
getch();
//MENU DE INSERTAR
void insertar()
clrscr();
char opc=’ ‘;
do
clrscr();
cuadro(1,10,35,56,’²’);
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);
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);
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);
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,28);cout<<“º º\n”;
gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
gotoxy(20,20);
cin>>elem->dato;
nodo *recorrer;
recorrer=cab;
while(recorrer!=NULL)
if(recorrer->dato==elem->dato)
clrscr();
gotoxy(20,20);
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,28);cout<<“º º\n”;
gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
gotoxy(20,20);
cin>>elem->dato;
nodo *recorrer;
recorrer=cab;
while(recorrer!=NULL)
if(recorrer->dato==elem->dato)
clrscr();
gotoxy(20,20);
cout<<elem->dato<<“:\t”;
recorrer->dato=elem->dato;
recorrer=recorrer->siguiente;
getch();
//ORDENAR
void ordenar()
clrscr();
char opc=’ ‘;
do
clrscr();
cuadro(1,10,25,56,’²’);
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,28);cout<<“º º\n”;
gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
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();
void cuadro(int x1,int y1, int x2, int y2, char simb)
gotoxy(i1,x1);cout<<simb;
gotoxy(i1,x2);cout<<simb;
gotoxy(y1,i2);cout<<simb;
gotoxy(y2,i2);cout<<simb;
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
//DECLARACIÒN DE PROTOTIPOS
#include<alloc.h>
#include<stdlib.h>
#include<conio.h>
#include<iostream.h>
int dato;
}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();
tipoNodo *cab;
tipoNodo *cola;
tipoNodo *nuevo_elemento()
tipoNodo *nodo1;
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(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(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);
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;
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);
cin>> db;
while(modificar!=NULL)
if(db==modificar->dato)
encontrado=1;
gotoxy(10,25);
cin>>ele->dato;
modificar->dato=ele->dato;
modificar=modificar->sig;
if(encontrado==0)
getch();
}
void buscar()
clrscr();
nododoble *buscar;
buscar=nuevo_elemento();
int db,encontrado=0;
buscar=cab;
gotoxy(18,15);
cin>> db;
while(buscar!=NULL)
if(db==buscar->dato)
encontrado=1;
buscar=buscar->sig;
if(encontrado==0)
getch();
void ordenar()
clrscr();
char opc=’ ‘;
do
clrscr();
cuadro(1,10,25,56,’’);
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);
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,28);cout<<“º º\n”;
gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
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)
gotoxy(i1,x1);cout<<simb;
gotoxy(i1,x2);cout<<simb;
gotoxy(y1,i2);cout<<simb;
gotoxy(y2,i2);cout<<simb;
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.
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
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.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
int dato;
}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();
tipoNodo *cab;
tipoNodo *cola;
tipoNodo *nuevo_elemento()
tipoNodo *nodo1;
if(!nodo1)
//MENU PRINCIPAL
void main()
clrscr();
creardoble();
clrscr();
char opc=’ ‘;
do
clrscr();
cuadro(1,10,35,56,’’);
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(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);
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);
cin>> db;
for(int c=0;c<=1;c++)
while(db!=modificar->dato)
modificar=modificar->sig;
gotoxy(10,22);
encontrado=1;
gotoxy(10,25);
modificar->dato=ele->dato;
c++;
if(encontrado==0)
gotoxy(10,22);
getch();
void buscar()
clrscr();
cuadro(15,5,50,25,’’);
nodoc *buscar;
buscar=nuevo_elemento();
int db,encontrado=0;
buscar=cab;
gotoxy(18,15);
cin>> db;
for(int c=0;c<=1;c++)
while(buscar->dato!=db)
buscar=buscar->sig;
gotoxy(18,18);
encontrado=1;
c++;
if(encontrado==0)
{
getch();
void ordenar()
clrscr();
char opc=’ ‘;
do
clrscr();
cuadro(1,10,25,56,’’);
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,28);cout<<“º º\n”;
gotoxy(10,29);cout<<“ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n”;
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)
gotoxy(i1,x1);cout<<simb;
gotoxy(i1,x2);cout<<simb;
gotoxy(y1,i2);cout<<simb;
gotoxy(y2,i2);cout<<simb;
public Nodo(){
dato = null;
Nodo nodo = null;
}
public Nodo(Object dato){
this();
this.dato = dato;
}
public void setDato(Object dato){
this.dato = dato;
}
public Lista(){
tamaño = 0;
cabecera = new Nodo();
}
//Adjuntando datos
lista.addDato("Hola");
lista.addDato("mundo");
lista.addDato("aqui");
lista.addDato("estoy");
System.out.println("-------Imprimiendo datos-------");
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.
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.
Relacionadas
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).
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.
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
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:
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.
Funcionamiento de la arquitectura
0111 0011
+------+------+
| 0111 | 0011 |
+------+------+
| Instrucción
+------+--------+--------+
+------+--------+--------+
| | | Registro de entrada 2
| | Registro de entrada 1
| Instrucción
+----------+----------+----------+----------+
resultado
| | | Registro de entrada 2
| | Registro de entrada 1
| Instrucción
Resumen
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
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.
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
1
Relacionado
Placa Base. El cuerpo de un ordenador.
En "Componentes del ordenador"
Buses internos
Buses Externos
Tipos de Buses
Buses ISA:
Buses MCA:
Buses EISA:
Buses VESA:
Buses PCI:
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.
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.
BUSES, TIPOS DE
BUSES Y FUNCIÓN DE
CADA UNO DE
ELLOS.
sábado, 7 de marzo de 2015
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.
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.
Es decir, los distintos subsistemas del ordenador intercambian datos gracias a los
buses.
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.