Indice
1. El
procesador
2. Arquitectura de su
procesador
3. Memoria
4. Efecto de
tuberías
5. Lenguajes De
Programación
El procesador es el
cerebro del
ordenador. Controla el funcionamiento de la computadora
y lleva a cabo las funciones de
procesamiento de
datos. La velocidad del
microprocesador
se mide en Mega Hertz, aunque solo es la fuerza bruta
del procesador. Este
va montado sobre un socket de la mother board, existe otra
velocidad, la
FBS, que es la velocidad con la que se comunican el procesador y
la mother board.
Partes De Un Microprocesador
1. – Encapsulado: rodea el chip, sirve para protegerlo contra los
agentes externos y para montar los conectores externos para
montarlo en la mother board.
2. – La memoria
caché: memoria muy
rápida donde el procesador almacena los datos que
está usando o los que va a usar próximamente.
3. – FPU, floating point unit: parte especializada en
cálculos de punto flotante.
4. – Existen otras piezas que no es necesario mencionar por el
momento.
Por su estructura
Por su fuente de energía.
La forma más común de alimentación de una
computadora
pues es la energía
eléctrica, antes las computadoras
gastaban muchísima electricidad, hoy
en día gracias a las nuevas
tecnologías en los componentes se ahorra mucha
electricidad.
Entre esta clase de computadoras están las
analógicas y las digitales.
Las computadoras analógicas basan su funcionamiento en
comparar parámetros y hacer mediciones, analogía
quiere decir comparación. Sus cálculos los hacen
con base a comparaciones que realizan por medio de instrumentos
mecánicos.
Las computadoras digitales realizan todas sus operaciones
basándose en cálculos matemáticos
exclusivamente. Se basan en el sistema
binario y en las matemáticas discretas, de estado finito,
a diferencia de las analógicas que siguen unas matemáticas continuas.
En el siglo XIX Charles Babbage desarrolló una computadora
analógica que funcionaba a base de engranes, Claro
está que su propulsión era puramente mecánica, fue ayudado por Ada Lovelace, a
quien se le atribuye el haber escrito el primer algoritmo de
computación. La idea de la máquina
de Babbage era buena, pero nunca funcionó bien debido a
que la precisión que requerían las piezas
sobrepasaba la tecnología de aquel
tiempo.
Por su tamaño.
La característica es su tamaño,
refiriéndose a su capacidad de cómputo.
Macrocomputadora: máquina utilizada en grandes organizaciones,
es capaz de comunicarse con varios usuarios a la vez. El trabajar
con varios usuarios a la vez se logra debido a la gran capacidad
de esta clase de máquina y a un método que
se llama tiempo
compartido. El tiempo compartido se basa en que el procesador
tiene tiempos muertos, entonces para evitar esto se asignan
pequeños espacios de tiempo a cada usuario en los cuales
se realizan parte de las operaciones que
solicita el usuario, dado el corto espacio de tiempo entre las
interrupciones de un usuario a otro no se siente ninguna clase de
retraso o de tiempo de espera. Además también se
debe a la gran rapidez del sistema.
Minicomputadora: también es una máquina
multiusuario, pero no es tan grande como una
macrocomputadora.
Estación de trabajo: esta es más potente que una
microcomputadora, también tiene potencia para ser
multiusuario, pero es mas frecuentemente utilizada por ingenieros
o científicos que requieran una gran cantidad de
cálculos. Entre la comunidad de
desarrolladores de software una estación
de trabajo es muy útil, porque además de hacer
el trabajo en
red mas
dinámico se requiere de bastante potencia para
compilar programas de gran
tamaño. Aunque se puede decir que una estación de
trabajo es solo una PC pero más potente.
Microcomputadora: es una PC, son utilizadas para trabajos de
oficina o para
entretenimiento multimedia. Las
hay de escritorio o portátiles.
2. Arquitectura de
su procesador
Procesadores CISC y RISC.
Agrupados en dos familias, la más antigua es la CISC,
complex instruction set computer. Corresponde a procesadores
capaces de ejecutar un gran número de instrucciones
pre-definidas en lenguaje
máquina, en un orden de centenas.
Los procesadores
RISC, reduced instruction set computer. Permite una
ejecución más rápida, pero requiere de
compiladores
más complejos ya que el RISC admite menos instrucciones
que un CISC.
RISC
Las características comunes a todos los
procesadores RISC, fuente de sus capacidades de altas prestaciones,
son:
1.Modelo de
conjunto de instrucciones Load/Store (Cargar/Almacenar).
Sólo las instrucciones Load/Store acceden a memoria; las
demás operaciones en un RISC, tienen lugar en su gran
conjunto de registros. Ello
simplifica el direccionamiento y acorta los tiempos de los ciclos
de la CPU, y
además facilita la gestión
de los fallos de paginas (page faults) en entornos de memoria
virtual. Además, permite un elevado nivel de
concurrencia a consecuencia de la independencia
de las operaciones de Load/Store de la ejecución del resto
de las instrucciones.
2.Arquitectura
no destructiva de tres direcciones. Los procesadores CISC
destruyen la información que existe en alguno de los
registros,
como consecuencia de la ejecución normal de instrucciones;
esto es debido a su arquitectura de dos direcciones, por la cual
el resultado de una operación sobrescribe uno de los
registros que contenía a los operandos. Por contra, las
instrucciones RISC, con tres direcciones, contienen los campos de
los dos operándoos y de su resultado. Por lo tanto, tanto
los operandos origen como el destino, son mantenidos en los
registros tras haber sido completada la operación. Esta
arquitectura "no destructiva" permite a los compiladores
organizar las instrucciones de modo que mantengan llenos los
conductos (pipelines) del chip, y por tanto reutilizar los
operandos optimizando la concurrencia.
3.Instrucciones simples, de formato fijo, con pocos modos de
direccionamiento. Las instrucciones simples reducen de manera muy
significativa el esfuerzo para su descodificación, y
favorecen su ejecución en pipelines. Las instrucciones de
longitud fija, con formatos fijos, implican que los campos de
códigos de operación (opcodes) y de los operandos
están siempre codificados en las mismas posiciones,
permitiendo el acceso a los registros al mismo tiempo que se
está descodificando el código
de operación. Todas las instrucciones tienen una longitud
equivalente a una palabra y están alineadas en la memoria en
límites
de palabra (word
boundaries), ya que no pueden ser repartidas en pedazos que
puedan estar en diferentes páginas.
4.Ausencia de microcódigo. El microcódigo no se
presta a la ejecución en ciclos únicos, ya que
requiere que el hardware sea dedicado a su
interpretación dinámica. La programación en microcódigo no hace
que el software sea
más rápido que el programado con un conjunto de
instrucciones simples. Todas las funciones y el
control, en los
procesadores RISC, están "cableados" (hardwired), para
lograr una máxima velocidad y eficiencia.
5.Ejecución en conductos (pipelined). Las instrucciones
simples, de formato fijo y ciclo único permiten que las
diferentes etapas de los ciclos de ejecución
(búsqueda o fetch, descodificación,
ejecución, y escritura del
resultado o result write-back) para instrucciones
múltiples, se puedan realizar simultáneamente, de
un modo más simple y eficaz.
6.Ejecución en ciclos únicos (single-cycle). El
resultado directo de los conjuntos de
instrucciones que ofrecen los procesadores RISC, es que cada
instrucción puede ser ejecutada en un único ciclo
de la CPU. Esto
invalida la creencia de que las microinstrucciones en
microcódigo, creadas para ser ejecutadas en un solo ciclo
de procesador, son más rápidas que las
instrucciones del lenguaje
ensamblador. Ya que el caché esta construido partiendo
de la misma tecnología que el
almacenamiento de
control del
microprograma, una única instrucción puede ser
ejecutada a la misma velocidad que una microinstrucción.
La ejecución en ciclos únicos también
simplifica la gestión
de las interrupciones y los conductos (pipelines).
RISC frente a CISC:
Existen varios mitos que
contraponen las ventajas de la tecnología RISC frente a la
CISC, que es importante descalificar:
a. Los procesadores RISC ofrecen peor soporte para los lenguajes
de alto nivel o HLL (High Level Language) que lo CISC. Esta
creencia se argumenta en que un conjunto de instrucciones de
"alto nivel" (CISC) es mejor soporte para lenguajes de alto
nivel. Sin embargo, la característica fundamental de los
lenguajes de alto nivel, implica que el programador sólo
interacciona con el ordenador a través del propio lenguaje de
alto nivel (programación, depuración, mensajes
del sistema, etc.),
por lo que todos los problemas a
"bajo nivel", deben de ser transparentes y desconocidos para
él. Por ello, son de nulas consecuencias para el
programador y los lenguajes de alto nivel, como se implementan
las funciones, en función
del tipo de CPU.
b. Es más complicado escribir compiladores RISC que CISC.
Dado que los procesadores CISC tienen un mayor número de
instrucciones y modos de direccionamiento, existen por tanto
más formas de hacer la misma tarea, lo que puede confundir
tanto al compilador como al que lo escribe. Por ello,
subjetivamente es posible escoger una forma de hacerlo poco
adecuada, por el tipo de instrucciones o por el tiempo de
ejecución que requieren. En cambio, en un
procesador RISC, hay menos opciones, por lo que el compilador es
más simple, aunque se genere, habitualmente, un 20-30%
más código;
a cambio, se
consigue un incremento de la velocidad de hasta un 500%.
c. Un programa es
más rápido cuanto más pequeño. La
velocidad a la que un programa puede
ser ejecutado no depende en absoluto de su tamaño, sino
del tiempo de ejecución de cada una de sus instrucciones.
Dado que las instrucciones RISC son más rápidas, y
admiten mejor los pipelines, puede haber mayor paralelismo y
simultaneidad en la ejecución de pequeñas secciones
de código. Dichas secciones de código pueden ser
ejecutadas en una fracción del tiempo que requiere una
sola instrucción CISC.
Resumiendo:
No es un hecho meramente académico, sino puramente
comercial y económico. La "era RISC" ha alcanzado a todos
los fabricantes de semiconductores:
AMD, Intel, MIPS, Motorola, ROSS, …; y todos ellos son productos
usados por fabricantes de ordenadores y estaciones de trabajo:
Apple, DEC, HP, IBM, SUN, etc. y sus correspondientes
clónicos.
El tiempo de diseño
de estos productos se
reduce sensiblemente, lo que disminuye su coste final, y por
tanto, se incrementan sus expectativas, al poder llegar
al mercado en un
tiempo más adecuado, y con menos posibilidades de
errores.
Además, son globalmente más eficaces, de menores
dimensiones y más bajo consumo,
ofreciendo siempre claras ventajas técnicas
frente a los más avanzados CISC.
Actualmente, las estaciones de trabajo RISC multiprocesadoras de
mayor éxito,
se basan en diferentes versiones de la tecnología SPARC:
superSPARC e HyperSPARC.
Esta claro que el futuro pertenece a los RISC y a los sistemas
multiprocesador, a no ser que la física y la electrónica logren superar las barreras
tecnológicas para incrementar muy por encima de las cotas
actuales, las velocidades y prestaciones
de una única CPU.
También cabe esperar, y por que no, la pronta
aparición de otras tecnologías que compitan con
CISC y RISC.
Arquitectura Von Newman.
En los primeros tiempos de los ordenadores se utilizaba el
sistema decimal, por lo tanto una electrónica sumamente complicada y propensa
a fallos. Además un sistema de programación
cableado o mediante fichas, Von
Newman propuso dos conceptos básicos que revolucionaron la
informática.
a) La utilización del sistema
binario. Esto simplificaba muchísimo la
electrónica de las operaciones matemáticas y
lógicas, a la vez este sistema era más inmune a los
fallos, esto es la electrónica digital.
b) Almacenamiento de
la secuencia de instrucciones de que consta el programa en una
memoria interna, fácilmente accesible, lo cual reduce el
tiempo de espera.
Multiprocesamiento
Multiprocesadores débilmente acoplados. Consiste en un
conjunto de sistemas
relativamente autónomos, donde cada CPU tiene su propia
memoria principal y sus canales E / S.
Procesadores de uso específico. Por ejemplo los
procesadores de E / S, en este caso hay un procesador maestro, y
los procesadores de uso específico están
controlados por la CPU maestra.
Multiprocesadores fuertemente acoplados. Conjunto de procesadores
que comparten la misma memoria principal.
Procesadores paralelos. Multiprocesadores fuertemente acoplados
que pueden cooperar en la ejecución en paralelo de una
misma tarea.
Procesador
Unidad de control
Controla las operaciones que se deben realizar. Su
operación obedece a las instrucciones aportadas por el
programa que se esté ejecutando, recoge las instrucciones
del programa directamente de la memoria central y administra las
operaciones de los demás componentes del procesador,
ordenando y guardando los datos en la
memoria antes y después de haber sido tratados por la
unidad aritmética-lógica.
Realiza dos tareas básicas:
SECUENCIAMIENTO. Hace que la CPU avance a través de las
micro operaciones al tiempo debido.
EJECUCIÓN. Se encarga de que las operaciones sean
ejecutadas.
ENTRADAS. Permiten determinar el estado del
sistema.
SALIDAS. Permiten controlar el estado del
sistema.
Unidad de ejecución
Es la que ejecuta las instrucciones y realiza los cálculos
a partir de las señales de control.
Bus interno.
Conecta todos los componentes de la CPU al chipset y a la memoria
principal. La velocidad de este es muy importante, ya que si la
velocidad del bus es muy poca,
aumentará el tiempo de espera del procesador, no obstante
se tenga un procesador muy bueno, claro, en todo debe haber un
equilibrio,
por ejemplo el procesador PI de 166 MHz trabaja sobre un bus de
sistema de 66 MHz y el PIIII trabaja con un bus de 400 MHz,
aunque trabajaría mejor con un bus de 800, este bus no
salió por problemas con
los fabricantes de tarjetas
madre.
Memoria caché
Memoria ultra rápida donde la CPU almacena los datos que
va a usar o que está usando, haciendo que el tiempo de
respuesta no se ralentice debido a la menor velocidad de la
RAM. Esta memoria
es sumamente rápida, unas 5 o 6 veces más
rápida que la memoria RAM,
hablando de equilibrio se
debe mantener este en todos los aspectos, una caché muy
pequeña puede hacer que el procesador se tarde mucho en
encontrar los datos que necesita al buscarlos en la memoria RAM, y
por el contrario una caché muy grande puede hacer que el
procesador se tarde más en encontrar los datos que
busca.
Pila y cola
Pila.
Colección de elementos donde se pueden suprimir o insertar
nuevos elementos por un lado.
Cola.
Colección de elementos donde se pueden insertar elementos
nuevos por un lado llamado final y eliminarlos por un lado llamado frente.
3. Memoria
En un sistema los programas a
ejecutarse deben ser almacenados en una memoria para que la CPU
pueda acceder a ellos y realizar operaciones con ellos, una
computadora sin memoria sería totalmente
inservible.
Memoria Principal
Es la unidad de almacenamiento central, es aquí donde se
almacenan los datos y los programas que la computadora
está usando en ese momento, debe de ser suficientemente
grande para soportar al sistema. La mayoría de esta
memoria es memoria RAM, pero
también está la memoria ROM, que
contiene las instrucciones base de la computadora, es la que
reconoce los dispositivos que esta posee, así como el
conjunto de instrucciones para su funcionamiento.
Memoria RAM
Es una memoria bastante rápida, de acceso aleatorio, es
volátil, así que solo almacena los datos
temporalmente para ser usados mientras se ejecuta el programa en
curso.
Memoria ROM
Memoria de solo lectura, esta
memoria no se puede borrar, es programada por el proveedor de la
computadora, esto de solo lectura es
relativo, ya que si se puede borrar o alterar, pero no es
volátil como la memoria RAM.
EPROM. Esta memoria solo se puede borrar con rayos ultravioleta,
se puede usar para un propósito especial en hardware.
EEPROM. Es eléctricamente borrable y se puede programar
mediante una interfase especial conectada a una computadora.
PROM. Esta puede ser programada una sola vez por el usuario o por
el fabricante.
Memoria Secundaria
En esta memoria se almacenan los datos de manera permanente, para
ser utilizados después. Estos datos pueden ser manipulados
por el usuario ya que es aquí donde se guardan todos los
archivos de
este, incluyendo los programas que utiliza el sistema para
funcionar, entre otros programas del usuario.
Disco duro.
Unidad fija de gran capacidad, hasta de 120 Giga Bytes, Almacena
los datos de forma permanente.
Discos flexibles.
Unidad extraíble de pequeña capacidad, hasta 1.6
Mega Bytes dependiendo del sistema de archivos,
almacena los datos como cargas magnéticas al igual que el
disco
duro.
Puertos
Definición:
Un puerto es el lugar donde el CPU
se comunica con otros dispositivos, existen de varios tipos, hay
puertos de entrada, de salida y ambos. Además estos pueden
ser seriales o paralelos.
Puertos de entrada:
Estos puertos recogen datos de algún dispositivo externo,
externo se refiere a estar fuera del CPU, no del gabinete.
Existen muchos dispositivos
periféricos que se conectan a un puerto de entrada,
por ejemplo tenemos al teclado y al
mouse,
también están los lápices ópticos,
los lectores de código se barras, etc.
Puertos de salida:
Son todos aquellos por donde el CPU envía datos a otros
dispositivos, por ejemplo están la salida de video y de
sonido.
Puertos de entrada / salida:
Estos son una clase de puertos por donde el CPU puede enviar y
recibir información. Son muy importantes, ya que
entre estos se encuentran las memorias del
CPU como son la RAM, ROM, los floppys y discos duros.
Estos puertos pueden ser usados para controlar dispositivos,
tales como las impresoras y
los quemadores externos, por ejemplo.
Nosotros vamos a hablar acerca de los puertos que se encuentran
fuera del gabinete, hablaremos de los puertos de teclado,
mouse,
impresoras,
etc. La computadora por si misma no seria capaz de realizar
operaciones útiles para nosotros si no podemos
comunicarnos con ella, necesita dispositivos periféricos por donde pueda darnos mensajes
y nosotros podamos enviarle órdenes. Ahora bien, existen
infinidad de dispositivos que sirven de extensión a la
computadora, muchos son para fines muy específicos y no se
pueden abarcar, entre los dispositivos que son de uso
común se encuentra la impresora, el
teclado, el mouse y el monitor.
Puerto serial:
El puerto serial es
aquel que envía y recibe los datos BIT por BIT, entre los
puertos seriales se puede mencionar el puerto de teclado, o el
puerto del MODEM.
Puerto paralelo:
Este tipo de puerto transmite la información byte por
byte, o sea que transmite ocho bits al mismo tiempo, de forma
paralela. un puerto
paralelo por excelencia pues es el puerto para impresora
Se puede observar que un puerto de entrada puede ser paralelo o
serial, lo mismo que un puerto de entrada o de entrada /
salida.
A cada puerto la bios le asigna
una dirección de memoria para que pueda
trabajar, dependiendo de que clase de puerto sea se le asigna un
determinado espacio exclusivo para él. Por medio de estas
localidades de memoria el sistema puede enviarles o recibir
información, es una especie de memoria de intercambio para
la transmisión de dados de un lugar a otro. A esto se le
llama espacio de localidades de memoria y se realiza dentro del
primer kilo bite de la memoria principal. Existen otras
asignaciones de memoria en otras capas superiores de memoria pero
estas son hechas por el sistema operativo
y por los demás programas, pero estas asignaciones son
para fines específicos de los demás programas.
Los puertos no solo se limitan a recibir la información, o
enviarla, según sea el caso. El puerto provee la corriente
eléctrica necesaria para el funcionamiento del
dispositivo y revisa el estado de
este.
Las tuberías son el medio mediante dos procesos se
comunica entre sí, son unidireccionales, o sea que existe
un proceso que
genera la tubería y otro que recibe la información.
En UNIX la
tubería se genera mediante una pipa o pipe en inglés:
Root@darkstar# <proceso 1>
| <proceso 2>
Esto genera una tubería del proceso uno al proceso dos,
pero, ¿qué es esto? Esto significa que la salida
del proceso uno servirá de entrada al proceso dos.
Lógica
Predictiva
Aquí el procesador puede decidir el curso que
seguirán los procesos a
ejecutar, lo cual permite adelantarse al "curso natural de los
sucesos" y "adelantarse" a las siguientes instrucciones.
Así es que el procesador predice en cada
bifurcación si el proceso tomará o no la
bifurcación y por lo tanto las búsquedas y
ejecuciones de las instrucciones subsecuentes. Si la
predicción es correcta la ejecución seguirá
sin interrupción. En cambio si es incorrecta cualquier
instrucción ejecutada después de la
bifurcación será cancelada y el procesador retorna
al estado en que estaba antes de tomar dicha bifurcación y
continua con el camino correcto.
Segmentación
La segmentación permite al programador
considerar la memoria como un conjunto de bloques o segmentos,
pueden ser de tamaño desigual.
La segmentación simplifica el manejo de
estructuras de
datos dinámicas, asignando un segmento del tamaño
adecuado para la estructura y
agregando o reduciendo el espacio según se vaya
requiriendo espacio en la memoria. Permite alterar y recompilar
los programas de forma independiente sin tener que volver a ligar
y cargar el conjunto entero de programas. Además como se
conoce el espacio del segmento se pueden tener restricciones o
privilegios al acceder a este espacio de memoria.
Computadoras Matriciales
Procesadores vectoriales.
Existe un problema que está fuera del alcance de las
computadoras convencionales, es cuando se requiere una gran
cantidad de cálculos que a una computadora convencional le
tomaría días resolver. Para este fin se
desarrollaron las supercomputadoras con capacidades especiales
para resolver problemas tales como simulaciones
aerodinámicas y espaciales y sistemas
expertos.
Supercomputadoras
Sistema con capacidades procesamiento paralelo y de gran
potencia. Capaces de realizar cientos de millones de operaciones
en coma flotante por segundo, diseñadas para la
multiprogramación y las entradas y saldas intensivas.
Hay otro tipo de sistemas conocidos como procesadores
matriciales, que han sido diseñados para realizar
cálculos vectoriales, están configurados como
dispositivos
periféricos para que los usuarios de computadoras
centrales y minicomputadoras puedan ejecutar partes vectorizadas
de sus programas.
Sistemas Multiprocesadores
La industria
informática, ha tenido siempre un objetivo
primordial, repetido a lo largo de toda su cadena (fabricantes de
semiconductores, fabricantes de sistemas y
usuarios): la búsqueda de la velocidad. Para alcanzar este
objetivo se
han invertido ingentes cantidades de recursos, hasta
alcanzar los límites
físicos del silicio.
Obviamente, la velocidad va ligada a las prestaciones, y por lo
general, la primera ha sido la principal medida para decidirse
por un sistema u otro. Sin embargo, por muy evidente que parezca,
y dados los límites físicos de los semiconductores,
las prestaciones pueden no estar forzosamente ligadas a la
velocidad. Hoy es posible construir sistemas, que aún
teniendo procesadores más "lentos" que otros, ofrezcan
unas prestaciones significativamente superiores. Son los sistemas
multiprocesador, que como su denominación indica,
incorporan varios procesadores para llevar a cabo las mismas
funciones.
No es un concepto nuevo,
ya que los "minicomputadores" construidos por
compañías como NCR, Sequent y Stratus, ya empleaban
varios nodos de proceso como alternativas económicas a
otros productos de otras compañías. Sin embargo,
aquellos sistemas aún duplicaban recursos caros
del sistema, como memoria y dispositivos de
entrada/salida, y por tanto, confinaban a los sistemas
multiprocesador al mundo de los sistemas de alto nivel.
Ahora, y en gran medida gracias a los procesadores de
arquitectura RISC, el soporte multiprocesador es una
solución integrada y fácilmente disponible en
estaciones de trabajo de sobremesa, que resuelve, a través
de hardware VLSI, los complejos problemas de compartición
de recursos (memoria compartida) de aquellas primeras máquinas.
Evidentemente, estas mejoras en el hardware, para ser
funcionales, requieren importantes desarrollos en el software, y
de hecho, muchos sistemas
operativos admiten extensiones multiproceso (Match, SCO,
Solaris, System V, etc.), que proporcionan paralelismo "en bruto"
(asignando múltiples tareas a múltiples
procesadores) a nivel del sistema
operativo.
Las aplicaciones escritas para facilitar el paralelismo en su
ejecución, incrementan significativamente las prestaciones
globales del sistema; esto es lo que se denomina multi-enhebrado
(multithreading), que implica dividir una sola aplicación
entre varios procesadores. Sin embargo, los desarrolladores de
software y programadores de aplicaciones sólo han
comenzado a explorar las vastas posibilidades de incremento de
prestaciones que ofrecen los sistemas con capacidades reales de
proceso en paralelo.
El multiproceso no es algo difícil de entender: más
procesadores significan mas potencia computacional. Un conjunto
de tareas puede ser completado más rápidamente si
hay varias unidades de proceso ejecutándolas en paralelo.
Esa es la teoría,
pero otra historia es la
práctica, como hacer funcionar el multiproceso, lo que
requiere unos profundos conocimientos tanto del hardware como del
software. Es necesario conocer ampliamente como están
interconectados dichos procesadores, y la forma en que el
código que se ejecuta en los mismos ha sido escrito para
escribir aplicaciones y software que aproveche al máximo
sus prestaciones.
Para lograrlo, es necesario modificar varias facetas del sistema
operativo, la
organización del código de las propias
aplicaciones, así como los lenguajes de
programación.
Es difícil dar una definición exacta de un sistema
multiprocesador, aunque podemos establecer una
clasificación de los sistemas de procesadores en:
SISD o secuencia única de instrucciones y datos (Single
Instruction, Single Data): una sola secuencia de instrucciones
opera sobre una sola secuencia de datos (caso típico de
los ordenadores personales).
SIMD o secuencia única de instrucciones y múltiple
de datos (Single Instruction, Multiple Data): una sola secuencia
de instrucciones opera, simultáneamente, sobre
múltiples secuencias de datos (array processors).
MISD o múltiples secuencias de instrucciones y
única de datos (Multiple Instruction, Single Data):
múltiples secuencias de instrucciones operan,
simultáneamente, sobre una sola secuencia de datos (sin
implementaciones útiles actualmente).
MIMD o múltiples secuencias de instrucciones y datos
(Multiple Instruction, Multiple Data): múltiples
secuencias de instrucciones operan, simultáneamente, sobre
múltiples secuencias de datos.
Los sistemas multiprocesadores pueden ser clasificados con mayor
propiedad como
sistemas MIMD. Ello implica que son máquinas
con múltiples y autónomos nodos de proceso, cada
uno de los cuales opera sobre su propio conjunto de datos. Todos
los nodos son idénticos en funciones, por lo que cada uno
puede operar en cualquier tarea o porción de la misma.
El sistema en que la memoria está conectada a los nodos de
proceso establece el primer nivel de distinción entre
diferentes sistemas multiprocesador:
1.Multiprocesadores de memoria distribuida (distributed-memory
multiprocessors), también denominados multiprocesadores
vagamente acoplados (loosely coupled multiprocessors). Se
caracterizan porque cada procesador sólo puede acceder a
su propia memoria. Se requiere la
comunicación entre los nodos de proceso para coordinar
las operaciones y mover los datos. Los datos pueden ser
intercambiados, pero no compartidos. Dado que los procesadores no
comparten un espacio de direcciones común, no hay
problemas asociados con tener múltiples copias de los
datos, y por tanto los procesadores no tienen que competir entre
ellos para obtener sus datos. Ya que cada nodo es un sistema
completo, por si mismo (incluso sus propios dispositivos de
entrada/salida si son necesarios), el único
límite práctico para incrementar las prestaciones
añadiendo nuevos nodos, esta dictado por la topología empleado para su
interconexión. De hecho, el esquema de
interconexión (anillos, matrices,
cubos, …), tiene un fuerte impacto en las prestaciones de estos
sistemas. Además de la complejidad de las interconexiones,
una de las principales desventajas de estos sistemas, como es
evidente, es la duplicación de recursos caros como
memoria, dispositivos de entrada/salida, que además
están desocupados en gran parte del tiempo.
2.Multiprocesadores de memoria compartida (shared-memory
multiprocessors), también llamados multiprocesadores
estrechamente acoplados (tightly coupled multiprocessors). Son
sistemas con múltiples procesadores que comparten un
único espacio de direcciones de memoria. Cualquier
procesador puede acceder a los mismos datos, al igual que puede
acceder a ellos cualquier dispositivo de entrada/salida. El
sistema de interconexión más empleado para estos
casos, es el de bus compartido (shared-bus). Tener muchos
procesadores en un único bus tiene el inconveniente de
limitar las prestaciones del sistema a medida que se
añaden nuevos procesadores. La razón es la
saturación del bus, es decir, su sobre utilización;
en un sistema de bus compartido, se deriva por la contienda entre
los diferentes dispositivos y procesadores para obtener el
control del bus, para obtener su utilización.
Es evidente, que los sistemas actuales tienden al uso de
arquitecturas de memoria compartida, fundamentalmente por razones
de costes, a pesar del problema de la contienda por el bus. Los
tres fuentes
fundamentalmente responsables de dicha disputa son la memoria
(cada CPU debe usar el bus para acceder a la memoria principal),
la comunicación (el bus es usado por los "bus
masters" para la
comunicación y coordinación), y la latencia de la memoria
(el subsistema de memoria mantiene al bus durante las
transferencias de datos, y en función de
la velocidad a la que la memoria puede responder a las
peticiones, puede llegar a ser un factor muy
significativo).
Los sistemas de memoria caché y el
multiproceso:
Los sistemas de memoria multinivel (caché) son un esfuerzo
para evitar el número de peticiones realizadas por cada
CPU al bus. Los caches son pequeñas y rápidas (y
por tanto caras) memorias, que
hacen de tampón (buffer) entre la CPU y la memoria
externa, para mantener los datos y/o instrucciones. Se basan en
el principio de la "localidad", lo que significa que, dada la
fundamental naturaleza
secuencial de los programas, los siguientes datos o instrucciones
requeridas, estarán localizadas inmediatamente a
continuación de las actuales.
Los datos contenidos en la memoria caché se organizan en
bloques denominados líneas. Las líneas son cargadas
en el caché como copias exactas de los datos situados en
la memoria externa. Para referenciar a los datos de la memoria
caché, se emplean marcas (tags) que
identifican a cada línea. Las marcas o tags
emplean una porción de la dirección física de los datos,
para compararla con la dirección física solicitada
por la CPU. Cuando existe una coincidencia exacta de la
dirección y de otros cualificadores (estado, privilegio,
contexto, etc.), se dice que ha tenido lugar un acierto (hit) de
caché; en caso contrario, tiene lugar un fallo (miss) del
caché, y en ese caso, los datos han de ser recuperados
desde la memoria.
El empleo de
memoria caché se ha popularizado, como medida para
acelerar el tiempo de acceso a la memoria principal, incluso en
los sistemas monoprocesador, evitando así, según se
incrementa la velocidad de los propios procesadores, aumentar la
velocidad de dicha memoria, y por tanto encarecer el sistema.
La forma en que la memoria es actualizada por los cachés
locales puede tener un gran impacto en las prestaciones de un
sistema multiprocesador. Básicamente hay dos métodos:
1.Escritura
continua (write-through). Requiere que todas las escrituras
realizadas en el caché actualicen asimismo los datos de la
memoria principal. De esta forma, la memoria principal siempre
tiene la última copia de los datos, y por tanto no hay
nunca ninguna incoherencia con el caché. El inconveniente
es que se producen frecuentes accesos a memoria, especialmente
superfluos cuando el software está modificando las mismas
secciones de datos repetidamente (por ejemplo ejecutando
bucles).
2.Copia posterior (copy-back). Es un sistema mucho más
eficiente, aunque también más complejo de
implementar. En este caso, la CPU puede modificar la línea
de caché sin necesidad de actualizar inmediatamente la
memoria principal. Los datos sólo son copiados a la
memoria principal cuando la línea de caché va a ser
reemplazada con una nueva. Ello no solo minimiza el
tráfico del bus, de vital importancia para el resto de los
procesadores, sino que también libera al procesador de la
tarea de escribir en la memoria principal. Sin embargo, este
sistema, en una arquitectura de bus compartido, implica un nuevo
nivel de dificultad, denominado coherencia o consistencia
(coherency o consistency); dado que cada caché puede tener
una copia de los datos existentes en la memoria principal, el
desafío es asegurar que los datos permanecen iguales entre
todos los caches. Hay dos métodos
para mantener cada línea de caché idéntica a
las demás:
a. Escritura radiada (write-broadcast), que requiere que la CPU
que modifica los datos compartidos actualice los otros caches,
para lo cual escribe en el bus la dirección de los datos,
y los datos mismos, de modo que todos los dispositivos
interesados (otras CPU’s) los capturen. Esto asegura que
cada línea de caché en el sistema es una copia
exacta de las demás.
b. Escritura invalidada (write-invalidate), impide a una CPU
modificar los datos compartidos en su caché hasta que
otros caches han invalidado sus copias. En cuanto otros caches
invalidan sus líneas, el caché modificado tiene la
única copia; de este modo, se garantiza que un sólo
caché escribe una línea compartida en un momento
dado. Tiene la ventaja de conservar el ancho de banda del bus ya
que los datos modificados no tienen que ser enviados a otros
caches.
Ambos sistemas requieren que los caches sean capaces de
identificar peticiones en el bus que afecten a sus datos, lo que
se realiza con una técnica conocida como "sondeo del bus"
(bus snooping). Cada caché compara las direcciones de las
peticiones en el bus compartido con los datos en su propio cache,
usando las marcas (tags).
Este sistema requiere un acceso concurrente a las marcas (tags)
del caché por parte del bus del sistema y del bus del
procesador. Sin dicho acceso concurrente, el procesador no
podría acceder al caché durante las operaciones de
sondeo del bus (que tienen que tener prioridad de acceso a las
marcas, para poder mantener la coherencia del caché). El
resultado son frecuentes atascos del procesador y
consecuentemente, bajo rendimiento.
A su vez, hay varios protocolos
asociados con el sondeo del bus para el movimiento de
los datos y los mensajes entre los caches:
1.Intervención indirecta de los datos (indirect data
intervention). Es el método
más simple de intercambio de datos entre
procesadores, aunque también el menos eficiente. La
1ª CPU hace una petición de datos, que es sondeada
por la 2ª; tiene lugar un acierto de sondeo (snoop hit) si
dichos datos están en el caché de la 2ª CPU,
entonces esta obtiene el control del bus e indica a la 1ª
que lo reintente más tarde. La 2ª CPU escribe los
datos de su caché a la memoria, y la 1ª CPU obtiene
el control del bus de nuevo, reiniciando la petición. Los
datos son ahora suministrados por la memoria.
2.Intervención directa de los datos (direct data
intervention). Los datos son suministrados directamente por la
2ª CPU a la 1ª. Este mecanismo es aplicable
fundamentalmente a los sistemas con sistemas de cache de copia
posterior (copy-back). Aunque pueden evitar muchos ciclos
comparados con la intervención indirecta, la memoria
principal permanece inconsistente con el caché, y debe de
ser actualizada cuando la línea de caché es
vaciada.
3.Reflexión a memoria (memory reflection) con
intervención directa. La memoria captura los datos que han
sido depositados en el bus, mientras son enviados a la CPU
solicitante. Si la línea de caché no ha sido
modificada antes de que tenga lugar la última
transacción de intervención de datos, no es
necesario escribir a la memoria, con lo que se conserva el ancho
de banda. Esta actualización del cache solicitante y la
memoria puede tener lugar en un mismo y único ciclo de
reloj.
Al desarrollarse las primeras computadoras
electrónicas se dio la necesidad de programarlas para
realizar tareas útiles. En un principio se programaban
conectando cables en distintas posiciones para lograr así
un resultado, se usaban como calculadoras simples para realizar
operaciones de una por una. En los años cincuentas se
empezaron a desarrollar lenguajes para programar las tareas de
las computadoras. El más primitivo de los lenguajes de
alto nivel es FORTRAN, COBOL
también es un veterano. FORTRAN mostró el uso de
expresiones simbólicas y subrutinas y COBOL el
concepto de
descripción de datos.
Evolución
Los lenguajes más primitivos eran lenguajes de
máquina, o sea programar con base a números que la
máquina entendiera. Esto es muy complicado y propenso a
errores, pero no había alternativa.
El primer gran logro fue el lenguaje
ensamblador,
junto con él, el nacimiento de herramientas
automáticas para generar el lenguaje
máquina. Aunque en este lenguaje sigue siendo
difícil no equivocarse, ya que se debe trabajar de la
misma forma en que trabaja el procesador y entender bien su
funcionamiento.
El lenguaje
ensamblador es una abstracción del lenguaje
máquina, que asocia palabras fáciles de entender
para el ser humano con números que puede entender la
maquina. Traduciendo así los códigos del lenguaje
al lenguaje máquina directamente. Esto se hacía
mediante unas tablas de códigos, haciendo la
traducción a mano, pero dada la sencillez de la
traducción pronto aparecieron los primeros programas
ensambladores que realizaban dichas traducciones al lenguaje
maquina, también conocido como código objeto.
Con el desarrollo en
los años cincuentas y sesentas de los algoritmos de
mas alto nivel, junto con el aumento del poder del hardware,
científicos de otras ramas empezaron a utilizar las
computadoras, pero no sabían mucho de computación. Entonces se creó el
primer lenguaje de alto nivel junto con el propio concepto,
nació el primer compilador FORTRAN. Aumentando la productividad al
escribir un código sencillo, con la herramienta del
compilador que traduce el código al lenguaje
máquina de manera automática. A partir de esto se
han desarrollado otros lenguajes de alto nivel, entre ellos el
lenguaje c, y
cobol.
Cabe destacar que dadas ciertas características del
lenguaje c,
este se considera de nivel medio ya que puede ser usado como
lenguaje de alto nivel con sus instrucciones en ingles y sus
librerías, pero tiene características de un
lenguaje de bajo nivel, ya que fue escrito para diseñar
sistemas
operativos.
Lenguajes de alto nivel.
Los lenguajes de alto nivel se caracterizan porque utilizan
palabras y frases más fáciles de entender para las
personas. Como palabras en ingles o frases abreviadas.
FORTRAN. FORmula TRANslator, traductor de formula, uno de los
primeros de alto nivel.
COBOL. Comon Business Oriented Languaje, lenguaje orientado a
negocios
comunes. Uno de los primeros.
BASIC. Beginners Allpurpose Symbolic Instruction Code,
código de instrucción simbólica de
propósito general dirigido a principiantes, Comenzó
como un lenguaje herramienta para enseñar
programación a principiantes.
PASCAL. Se
diseñó para enseñar programación
estructurada, se considera que es excelente en este aspecto y aun
se sigue usando con el mismo fin.
Lenguaje C.
Predecesor del lenguaje B, fue desarrollado para escribir
UNIX, es muy
poderoso, ya que con este lenguaje se puede hacer casi todo lo
que la computadora puede realizar, es portable, o sea que puede
ser compilado en diferentes sistemas
operativos con muy pocos cambios, a diferencia de otros que
no pueden ser compilados en diversos sistemas
operativos. Es sumamente ligero y rápido, un programa
hecho en vbasic es de 50 a 100 veces más pesado que uno
echo en c.
Nunca podrá desligarse el software del hardware, es
importante tomar en cuenta qué lenguaje se
utilizará para desarrollar alguna clase de proyecto. Por
ejemplo, si se requiere alguna aplicación de oficina en modo
gráfico, que no requiera de mucho desempeño tal vez visual basic o
visual C++
para Windows sea
buena opción, o si se requiere de una aplicación
para Internet donde
se tiene un buen ancho de banda pues Java sería
una buena opción, en cambio, si se quiere un desempeño eficaz, donde este sea crucial,
pues c es el lenguaje apropiado, o para aplicaciones de internet que requieran
rapidez en la respuesta, HTML + lenguaje c
sería eficaz. Aunque sería una perdida de tiempo y
esfuerzo tener que hacer un programa en c si se cuenta con un
software potente que soporte bien lenguajes más pesados
como Fox pro o Python,
y en cambio sería una tontería querer implementar
una base de datos en
basic si se cuenta con pocos recursos.
Autor:
Mario Andres cuevas Gutierrez