Indice1. 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