GESTIÓN DE MEMORIA, SEGMENTACIÓN Y PAGINACIÓN DE MICROPROCESADORES


GESTIÓN DE MEMORIA, SEGMENTACIÓN Y PAGINACIÓN


INTRODUCCIÓN :

  • Memoria es uno de los principales recursos del computador. Siempre existió el problema de falta de memoria.
  • La parte del sistema operativo que administra la memoria se llama administrador de memoria, y su labor consiste en llevar un registro de las partes de memoria que se estén utilizando y aquellas que no, con el fin de asignar espacio en memoria a los procesos cuando éstos la necesiten y liberándola cuando terminen, así como administrar el intercambio entre la memoria principal y el disco en los casos en los que la memoria principal no le pueda dar capacidad a todos los procesos que tienen necesidad de ella.
  • Los sistemas de administración de memoria se pueden clasificar en dos tipos: los que desplazan los procesos de la memoria principal al disco y viceversa durante la ejecución y los que no. 
  • El propósito principal de una computadora es el de ejecutar programas. (programas + info que accesan -> memoria principal)
  • Para optimizar el uso del CPU y de la memoria, el sistema operativo debe de tener varios procesos a la vez en la memoria principal, para lo cual dispone de varias opciones de administración tanto del procesador como de la memoria.
1.- GESTIÓN DE MEMORIA


1.1  Protección: 
Si  varios  procesos  comparten la  memoria  principal,  se debe asegurar que ninguno de ellos pueda modificar  posiciones de memoria de otro proceso.
Aunque la escritura de memoria tiene efectos más desastrosos , la lectura de memoria ajena tampoco debe estar permitida, pues cada proceso debe mantener su privacidad. Ya que muchos lenguajes de programación disponen de punteros dinámicos e indexación de vectores o matrices, las comprobaciones en tiempo de compilación no son suficientes y  se requiere que el sistema de gestión de memoria realice chequeos adicionales durante la ejecución.
Debe disponerse de un sistema de permisos de acceso que especifique los derechos que tiene cada proceso en el acceso a zonas de memoria de otros procesos.

1.2. Compartimiento : 

El compartimiento de la memoria parece estar en contradicción con la protección, pero es que a menudo también es necesario que varios procesos puedan compartir y actualizar estructuras de datos comunes, por ejemplo, en un sistema de bases de datos. En otras ocasiones, lo que se requiere es compartir zonas de código, por ejemplo, en rutinas de biblioteca, para no tener en memoria distintas copias de la misma rutina. En este caso, se hace necesaria alguna protección para que un proceso no modifique inadvertidamente el código de las rutinas.

1.3. Reubicación:

La multiprogramación requiere que varios procesos residan simultáneamente en memoria. Lo que no se puede saber antes de llevarlo a memoria es la dirección absoluta en la que se va a cargar el proceso, por lo que no es práctico utilizar direcciones absolutas en el programa.
En su lugar, es preferible realizar direccionamientos relativos para permitir que un programa pueda ser cargado y ejecutado en cualquier parte de la memoria.

1.4. Organización de memoria:

La memoria se debe organizar tanto física como lógicamente.
Debido al coste de la rápida memoria RAM, normalmente se necesita ampliarla con memoria secundaria más barata (y más lenta), utilizando para ello dispositivos tales como discos o cintas magnéticas. Por el contrario, también puede resultar conveniente añadir memoria de acceso más rápido que la RAM principal, como es el caso de la memoria caché, en la que se mantienen los datos de acceso más frecuente. Esta jerarquía física de memorias hace necesario un sistema que controle el flujo de información entre los distintos dispositivos de almacenamiento. Esta tarea la realizaba el programador utilizando overlays, pero consume una gran cantidad de tiempo y, debido a la reubicación dinámica, el programador no siempre sabe la cantidad y lugar de la memoria que se va a necesitar.

Por esto, parece conveniente que sea el gestor de memoria el que se ocupe de esta labor. Aunque la mayoría de las memorias están organizadas como un único  espacio lineal de direcciones secuenciales, que van desde 0 hasta un máximo,  esto no refleja la estructura lógica de los programas, que utilizan estructuras lógicas de instrucciones y datos, tales como módulos, rutinas o procedimientos, matrices, registros, etc. Si una gestión de memoria pudiera proporcionar varios espacios de direcciones, cada estructura lógica podría ser una entidad independiente: un segmento. Esto sería ventajoso por varias razones, pues  los segmentos pueden compilarse y cargarse de forma independiente, teniendo cada uno de ellos sus  propios derechos de acceso (lectura, escritura, ejecución). Un sistema simple de segmentación puede constar de sólo dos segmentos: uno para código (con permiso de ejecución) y otro para datos (con permiso de lectura y escritura). Una segmentación más sofisticada podría utilizar un segmento para cada estructura lógica.

2.  GESTIÓN DE MEMORIA INTERNA  

En los sistemas de gestión de memoria sin intercambio, la idea básica consiste en cargar el programa a ejecutar en algún lugar de la memoria principal,donde permanece hasta que finaliza su ejecución, momento en el que abandona el espacio de memoria utilizado.

2.1. Mono programación

El esquema de memoria más simple consiste en mantener la memoria ocupada con un único proceso. Cuando se carga un programa que se hace cargo de toda la memoria y del control completo de la máquina, se dice que el programa se carga sobre una máquina desnuda es decir, una máquina en la que solamente se ofrece el hardware puro, sin ninguna ayuda software que lo recubra. Las máquinas desnudas se utilizaron de forma general hasta principios de los años 60, y actualmente se suelen utilizar en sistemas empotrados de control.

Más tarde, a las máquinas desnudas se les añadió una especie de sistema operativo muy rudimentario al que se le denominó monitor. Las funciones que ofrecía el monitor eran las estrictamente necesarias para cargar un programa en memoria y controlar su ejecución, todo de forma muy manual y con una completa supervisión del usuario. 

La memoria está ocupada por el sistema operativo, que suele estar en RAM, y por el cargador inicial del sistema operativo (IPL) y los  de dispositivos, que suelen estar en memoria ROM. El resto de la memoria RAM queda disponible como área de usuario. Cuando el sistema está organizado de esta manera (por ejemplo MS-DOS), sólo se ejecuta un proceso a la vez. El usuario teclea un comando en el terminal, y el sistema operativo carga el programa correspondiente de disco a memoria principal y lo ejecuta. Cuando el programa termina, el sistema queda a la espera de que el usuario escriba otro comando, para cargar otro programa en la misma zona de memoria que el anterior.

2.2 Multiprogramación Con Particiones Fijas

Ya que, en general, es deseable que haya varios procesos de usuario residiendo en memoria al mismo tiempo, se hace necesario considerar el problema de cómo asignar memoria disponible a varios de los procesos que están en la cola de espera para ser traídos a memoria principal. Lo más inmediato y simple es dividir la memoria en b particiones (posiblemente de distinto tamaño), de tal forma que en cada partición se mete un proceso, donde permanece hasta que finaliza su ejecución. Una vez terminado el proceso, la partición queda libre para acoger a un nuevo trabajo. Con la llegada de la multiprogramación y este esquema de memoria aparecen algunos problemas y cuestiones que deben solventarse, como la planificación de procesos a largo plazo, la determinación del número y tamaño de las particiones, la ubicación de los programas y la protección de las particiones de memoria.

- Planificación

  • Un esquema posible para la planificación de procesos a largo plazo, o sea, para seleccionar los procesos que van cargarse en memoria para ser ejecutados, puede consistir en que cada una de las particiones tenga una cola asociada, de tal manera que en cada una de ellas se van encolando los trabajos o procesos dependiendo del espacio de memoria requerido. Cuando hay que cargar un trabajo, se le pone en la cola de entrada de la partición más pequeña en la que quepa. Ya que en este esquema las particiones son de tamaño fijo preestablecido, cualquier espacio de una partición no utilizado por el proceso cargado, se desaprovecha. La desventaja de meter en colas los trabajos según su tamaño se hace patente cuando la cola de una partición grande está vacía, pero la cola de una partición pequeña tiene muchos trabajos. Una solución consiste en tener una única cola. Cuando una partición se queda libre, el primer trabajo de la cola que quepa en esa partición, se carga en ella y se ejecuta

  • Ya que no es deseable malgastar una partición grande con un trabajo pequeño, una alternativa puede ser el  recorrer la cola entera y elegir el trabajo más grande que se pueda cargar en la partición que acaba de quedar libre. No obstante, esto supone una discriminación de los trabajos con pocos requisitos de memoria, que no son merecedores de tener una partición grande, mientras que normalmente a los trabajos pequeños se les suele dar el mejor servicio, no el peor.
  • Para solucionarlo, se suele disponer siempre de alguna partición de poco tamaño, para permitir que los pequeños trabajos también se ejecuten sin necesidad de asignarles grandes particiones de memoria. No obstante, debe tenerse en cuenta que un proceso que requiera poca memoria y mucha CPU puede entonces formar una larga cola de espera por su partición.
- Tamaño De Las Particiones

  • El tamaño de cada una de las particiones lo puede establecer el operador en el momento de arranque del sistema o figurar en algún fichero de configuración del sistema. Como se puede ver, el grado de multiprogramación está directamente ligado al número de particiones del sistema. A más particiones, más procesos cargados y, por lo tanto,  mayor aprovechamiento de la CPU. Así, cuanta más memoria se desperdicie, menos procesos se podrán tener en memoria. Para lograr el mayor aprovechamiento de la memoria los procesos deberían cargarse en particiones cuyo tamaño se ajuste lo más posible (por exceso) al del proceso. Por una parte tenemos que si dividimos la memoria del sistema en muchas particiones pequeñas, puede dar lugar a que algunos programas grandes no puedan cargarse en memoria aunque haya suficiente memoria disponible, si ésta no se encuentra adyacente en una única partición, dando lugar, en este caso, a una fragmentación externa de la memoria. Si por el contrario, se dispone de unas pocas particiones grandes, los programas pequeños desaprovecharán la memoria sobrante de la partición que ocupen, lo que da lugar a una fragmentación interna.
          Los tamaños de las particiones suelen establecerse después de un estudio sobre los tamaños 
          habituales de los programas que se ejecutan en cada máquina. 

- Reubicación De Programas

  • Cuando se monta o enlaza un programa compuesto por diferentes módulos, todos ellos se combinan en un único módulo cargable, en el que las referencias a sus objetos locales (rutinas o datos) son direcciones que van desde cero hasta la correspondiente al tamaño del módulo. Así, si el módulo se carga en la dirección cero de memoria principal, se ejecutará correctamente, pero no si se carga en cualquier otra dirección. Según esto, habría que decirle al montador en qué dirección se va a cargar ese programa.  
  •  Una posible solución consiste en modificar las direcciones del programa a medida que se carga en memoria. O sea, que a los programas que se carguen en la partición 1 se les añadirá Base_Partición_1 a todas las direcciones a las que haga referencia, Base_Partición_2 a los que se carguen en la partición 2, etc.; siendo la base de la partición, su dirección de comienzo. Para realizar esto, el montador debe incluir en el módulo cargable una lista con las direcciones relativas del programa en las que hay bytes o palabras cuyo contenido son referencias a memoria, de tal forma que puedan ser reubicadas en la carga. Con esta solución se consiguen programas Estáticamente reubicables (reubicables en tiempo de carga), pero tienen una pega:
  • “No permite que un programa cargado en una partición pueda moverse a otra distinta antes de finalizar su ejecución, lo cual resulta de gran utilidad, como veremos posteriormente.”
  • Este problema se solventa con un poco de ayuda del hardware. Consiste en equipar al procesador con un nuevo registro: el Registro Base



Cuando un proceso es seleccionado para pasar a ejecución, el registro base se carga con la dirección de la partición que contiene al proceso en cuestión. Una vez que el proceso está en ejecución, a cada referencia a memoria se le añade automáticamente el contenido del registro base, generando así la dirección definitiva, sin necesidad de modificar el contenido del módulo ejecutable, ni en la carga ni durante la ejecución. A este sistema en el que ya sí se permite ejecutar programas en cualquier partición de memoria e incluso cambiarlos de partición durante su ejecución, se le conoce como sistema de reubicación dinámica.
Solucionado el asunto de la reubicación, debemos afrontar un último problema, pues el sistema de gestión de memoria que hemos visto hasta ahora no  segura que un programa no pueda construir una instrucción en la que referencie cualquier dirección de memoria y acceda ilegalmente a datos de áreas no autorizadas. Esto se resuelve con un “sistema de protección”.


-Protección: 

El sistema de protección se encarga de evitar el acceso indiscriminado a cualquier área de memoria. A partir del sistema de reubicación dinámica resulta fácil limitar las referencias a memoria que puedan hacerse desde un programa. Para ello añadimos un registro más al procesador: el Registro Lïmite.El registro límite expresa el tamaño del programa en ejecución. Cada dirección virtual (relativa) a la que se hace referencia en el proceso se compara con el valor del registro límite, de tal forma que si tal dirección es menor que el registro límite, quiere decir que hace referencia a una posición dentro del programa, por lo que simplemente hay que añadirle el contenido del registro base para obtener la dirección efectiva (También puede realizarse la comprobación del registro límite paralelamente a la suma del registro base). Si por el contrario, la dirección virtual excede al valor del registro límite, indica que se intenta un acceso a una posición de memoria fuera del área ocupada por el programa, en cuyo caso habrá que generar la correspondiente excepción de  Error de Direccionamiento, para darle el tratamiento pertinente.

El tamaño que ocupa un proceso suele venir indicado en el módulo cargable, y puede guardarse en el BCP de cada proceso. El uso de las particiones fijas es prácticamente nulo hoy día. Como ejemplo de un sistema operativo con esta gestión de memoria tenemos al antiguo OS/MFT, utilizado por los grandes ordenadores de IBM.
-->
1.2.3 Intercambio De Memoria

Consiste en trasladar el código y los datos de un proceso completo de memoria al sistema de almacenamiento secundario, para cargar otro previamente almacenado, no permiten a un proceso utilizar más memoria RAM de la que realmente existe en el sistema. Esta técnica puede ser ineficiente ya que se tiene que hacer el intercambio completo del proceso, aunque éste solo vaya a ejecutar una pequeña porción del código.

Durante el intercambio un proceso puede ser sacado temporalmente de memoria y llevado a un lugar especial del disco y posteriormente vuelto a memoria y continuada su ejecución.

Asignación contigua

La memoria principal normalmente se divide en dos particiones: Sistema operativo residente, normalmente en la parte baja de memoria con los vectores de interrupción. Procesos de usuario en la parte alta.

Asignación de partición simple

Puede utilizarse un esquema de registro de relocalización y límite para proteger un proceso de usuario de otro y de cambios del código y datos del sistema operativo.
El registro de relocalización contiene la dirección física más pequeña; el registro limite contiene el rango de las direcciones lógicas. Cada dirección lógica debe ser menor al registro limite

Asignación de particiones múltiples

Bloques de distintos tamaños están distribuidos en memoria, cuando llega un proceso se le asigna un hueco suficientemente grande para acomodarle.

  • El sistema operativo debe tener información sobre:
  - Particiones asignadas
  - Particiones libres (huecos)
  - Asignación de partición dinámica

  El proceso de compactación es una instancia particular del problema de asignación de memoria dinámica, el cual es el cómo satisfacer una necesidad de tamaño n con una lista de huecos libres. Existen muchas soluciones para el problema. El conjunto de huecos es analizado para determinar cuál hueco es el más indicado para asignarse. 

Las estrategias más comunes para asignar algún hueco de la tabla son:

Primer ajuste
Consiste en asignar el primer hueco con capacidad suficiente. La búsqueda puede iniciar ya sea al inicio o al final del conjunto de huecos o en donde terminó la última búsqueda. La búsqueda termina al encontrar un hueco lo suficientemente grande.

Mejor ajuste
Busca asignar el espacio más pequeño de los espacios con capacidad suficiente. La búsqueda se debe de realizar en toda la tabla, a menos que la tabla esté ordenada por tamaño. Esta estrategia produce el menor desperdicio de memoria posible.

 Peor ajuste

Asigna el hueco más grande. Una vez más, se debe de buscar en toda la tabla de huecos a menos que esté organizada por tamaño. Esta estrategia produce los huecos de sobra más grandes, los cuales pudieran ser de más uso si llegan procesos de tamaño mediano que quepan en ellos. 




1.2.4 Multiprogramación Con Particiones Variables

El tamaño de las particiones varía constantemente a medida que los procesos van y vienen.
Inicialmente toda la memoria de usuario está disponible, organizada como un único y gran bloque de memoria libre, Cuando un proceso llega y necesita memoria, se busca en el conjunto de huecos uno que sea suficientemente grande. Si el hueco es demasiado grande, se parte en dos: uno se asigna al proceso, y el otro se devuelve al conjunto de huecos. Cuando un proceso finaliza, se libera su bloque de memoria, que se pone de vuelta en el conjunto de huecos. Si este hueco resulta estar adyacente a otros huecos (a otros bloques libres), se unen los bloques adyacentes en un único bloque del tamaño total. Ahora hay que comprobar si hay más procesos esperando memoria y si este nuevo bloque liberado y recombinado puede satisfacer las demandas de cualquiera de estos procesos que están esperando.

OS/MVT es uno de los antiguos e importantes sistemas operativos de IBM que utilizaba particiones variables.



1.3 Gestión de bloques de memorias
En general, hay tres métodos utilizados por los sistemas operativos para llevar la cuenta de la memoria utilizada y de los huecos libres:

1.3.1 Mapa de Bits
Con este método de gestión de memoria, ésta se divide en cuyo tamaño puede ir desde unas cuantas palabras a varios Kbytes, cada una de estas unidades de asignación se corresponde con un bit en el mapa de bits de memoria; la primera unidad con el primer bit, la segunda con el segundo, etc., de tal forma que si el bit está a 0 indica que la unidad de asignación correspondiente se encuentra libre, mientras que si está a 1 quiere decir que la unidad está ocupada, o sea, asignada a algún proceso. El tamaño de la unidad de asignación es una cuestión muy importante. Cuanta más pequeña sea la unidad, mayor será el mapa de bits.

No obstante, obsérvese que incluso con una unidad de tan solo 4 bytes, tenemos que 32 bits de memoria requieren solamente 1 bit en el mapa. Si la unidad de asignación es de gran tamaño, habrá pocas unidades, luego el mapa de bits ocupará poco espacio; pero por contra, tenemos que puede empezar a ser significativo el espacio correspondiente al 50% de memoria que por término medio se desperdicia en la   última de las unidades asignadas al proceso. Este método es simple y sencillo de implementar, pero tiene la desventaja de que cuando se buscan ‘n’ unidades consecutivas de memoria para asignar a algún proceso, se debe buscar en el mapa de bits hasta encontrar ‘n’ bits consecutivos a 0.

Aunque esta operación es lenta, los procesadores actuales suelen incluir instrucciones de búsquedas de cadenas de bits, favoreciendo así la utilización  de los  mapas de bits.


1.3.2  Lista de bloques

  • El algoritmo más simple es el primero que sirve. El gestor de memoria recorre la lista hasta encontrar un hueco que sea suficientemente grande para satisfacer la petición. Si el hueco elegido no es exactamente del tamaño  solicitado, se divide en dos partes: una (del tamaño solicitado) se le asigna al proceso que lo solicitó, y la otra (con la memoria sobrante) se deja como un hueco de menor tamaño. 

  • el siguiente que sirva. Con este algoritmo, la lista es circular, es decir, que el último nodo apunta al primero y la cabecera no es siempre la misma, sino que va rotando por la lista, es decir, que el orden de la lista va rotando.Esto hace que los bloques fraccionados no se amontonen en una parte de la lista sino que se distribuyan de manera uniforme. Así, cada vez que se comienza una búsqueda, no habrá que atravesar todos los bloques pequeños, sino solamente algunos, con la consecuente ganancia de tiempo. 
  • el que mejor se adapte que recorre la lista completa para seleccionar el hueco que mejor se adapte, o sea, el menor de los que sirvan, para no fraccionar un bloque grande que pudiera servir para alguna petición posterior. 
  • el que peor se adapte que se selecciona el bloque más grande de la lista y se parte en dos, generando así un nuevo bloque libre que, aunque más pequeño, seguramente tendrá un tamaño significativo, evitando así la generación de huecos pequeños. Sin embargo, la simulación ha demostrado que tampoco ha resultado ser una buena idea.
1.3.3.- Sistemas buddy

La ventaja de este algoritmo sobre otros que también ordenan conforme al tamaño, es que cuando se libera un bloque de tamaño 2k  bytes, el gestor de memoria  para ver si la compactación es posible.

Solamente  tiene que buscar en la lista de huecos de longitud 2. La desventaja es su ineficiencia en el aprovechamiento de la memoria, debido a los redondeos hasta una potencia de 2 en el tamaño de los  bloques asignados, dando lugar, en consecuencia, a una fragmentación interna.



MEMORIA VIRTUAL

Sabemos que para ejecutar las instrucciones de un programa, éstas, al igual que sus operandos, tienen que estar en memoria principal. Esta imposición parece necesaria y razonable,  pero  por  desgracia  limita  el  tamaño  de  un  programa  al espacio de memoria física (RAM).

Sin embargo, el examen de los programas reales nos muestra que en muchos casos no es necesario que el programa entero permanezca siempre en memoria. Por ejemplo:
Los  programas  suelen  tener  código  para  manejar  condiciones  de  error inusuales. Ya que estos errores raramente se producen en la práctica, este código casi nunca se ejecuta.

A veces, las tablas, listas o matrices se declaran con más tamaño del que luego realmente necesitan. Una matriz se puede declarar de 100 por 100 aunque raramente ocupe más de 10 por 10; o un ensamblador puede tener una tabla para albergar a 3000 símbolos, aunque la media de los programas no tengan más de 200.

La memoria virtual es una técnica que permite la ejecución de procesos que pueden no estar completamente en memoria principal.

La habilidad de poder ejecutar un programa que sólo está parcialmente en memoria principal acarrea los siguientes beneficios:

  • El tamaño de un programa no está limitado por la cantidad de memoria física disponible. Los usuarios escriben programas contando con un espacio de direcciones virtuales extremadamente grande.


  • Debido a que cada programa puede necesitar para ejecutarse menos memoria que  la  que  ocupa  su  tamaño  total,  se  pueden  cargar  más  programas  en memoria para ejecutarlos al mismo tiempo, con la consiguiente mejora en el aprovechamiento de la CPU.


  • Ya que de cada programa solamente hay que cargar la parte necesaria en un momento  dado,  a  la  hora  de  cargar  un  proceso  o  expulsarlo  a  disco,  se necesitan menos operaciones de E/S debidas al intercambio, por lo que se consigue una ejecución global más rápida.

Sabemos  que  para  ejecutar  una  instrucción,  ésta  y  sus  operandos  deben encontrarse en memoria principal. 

¿Por qué no en memoria secundaria? Simplemente porque el acceso es mucho más rápido a memoria RAM que a los discos

El  ancho  del  bus  de  direcciones  establece  el  rango  de  direcciones  que  puede generar la CPU (direcciones virtuales). 

Por otra parte tenemos la memoria física, es decir, los transistores que forman bytes o palabras, tal que cada uno de los bytes tiene una dirección (dirección real). 

Para  implementar  los  sistemas  de  memoria  virtual,  normalmente  se  utiliza  la paginación. También  se  puede implementar mediante   segmentación, como lo hace el sistema OS/2 de IBM, pero los algoritmos son bastante más complejos que los de la paginación, pues a diferencia de las páginas, los segmentos son de tamaño variable.







PAGINACION


En la gestión de memoria con intercambio, cuando había que pasar un proceso a ejecución, era necesario traer el proceso entero de disco a memoria principal.

Con memoria virtual hemos dicho que no se trae todo el proceso, sino que cuando se hace referencia a una dirección de memoria virtual cuya correspondiente memoria física reside en disco, se trae el contenido de disco a RAM.

¿Quiere esto decir que la unidad de intercambio de memoria es el byte? Si lo fuera, daría lugar a que continuamente se estuviesen generando operaciones de E/S, lo cual sería poco eficaz. Claramente, parece más conveniente utilizar bloques más grandes, para aprovechar de manera más eficiente cada operación de E/S.



Tablas de páginas

Cada página tiene un número que se utiliza como índice en la tabla de páginas, lo que da por resultado el número del marco correspondiente a esa página virtual. Si el bit presente / ausente es 0, se provoca un señalamiento (trap) hacia el sistema operativo. Si el bit es 1, el número de marco que aparece en la tabla de páginas se copia en los bits de mayor orden del registro de salida, junto con el ajuste (offset) de 12 bits, el cual se copia sin modificaciones de la dirección virtual de entrada. 

Juntos forman una dirección física de 15 bits. El registro de salida se coloca entonces en el bus de la memoria como la dirección en la memoria física.


Estructura de la tabla de paginas

  • Protección: Expresa los permisos de acceso del proceso. En caso de tener permiso para la operación de lectura/escritura que se va a realizar, se consulta el resto de los campos.


  • Bit de Presencia: Indica si la página está presente en memoria principal o no. Si se encuentra en RAM, también tienen sentido los siguientes campos.


  • Marco Ocupado: Si la página se encuentra en memoria principal, este campo expresa el marco que la contiene.


  • Modificada (Bit de ensuciada): Este campo indica si el contenido de la página ha sido modificado desde que se trajo de la memoria secundaria.


  • Referenciada: Este campo booleano se pone a cierto cada vez que se hace referencia a cualquier dirección de la página. Lo utiliza el sistema operativo para ayudar a los algoritmos de sustitución de páginas.



Características de la paginación

  • El espacio de direcciones lógico de un proceso puede ser no contiguo.


  • Se divide la memoria física en bloques de tamaño fijo llamados marcos (frames).


  • Se divide la memoria en bloques de tamaño llamados páginas.


  • Se mantiene información en los marcos libres.


  • Para correr un programa de en páginas de tamaño, se necesitan encontrar n marcos y cargar el programa.


  • Se establece una tabla de páginas para trasladar las direcciones lógicas a físicas.


  • Se produce fragmentación interna.



Ventajas de la paginación

  • Es posible comenzar a ejecutar un programa, cargando solo una parte del mismo en memoria, y el resto se cargara bajo la solicitud.


  • No es necesario que las paginas estén contiguas en memoria, por lo que no se necesitan procesos de compactación cuando existen marcos de páginas libres dispersos en la memoria.


  • Es fácil controlar todas las páginas, ya que tienen el mismo tamaño.


  • El mecanismo de traducción de direcciones (DAT) permite separar los conceptos de espacio de direcciones y espacios de memoria. Todo el mecanismo es transparente al usuario.



Desventajas de la paginación

  • El costo de hardware y software se incrementa, por la nueva información que debe manejarse y el mecanismo de traducción de direcciones necesario. Se consumen muchos más recursos de memoria, tiempo en el CPU para su implantación.


  • Se deben reservar áreas de memoria para las PMT de los procesos. Al no ser fijo el tamaño de estas, se crea un problema semejante al de los programas (cómo asignar un tamaño óptimo sin desperdicio de memoria, u ovearhead del procesador).

SEGMENTACIÓN
Es un esquema de manejo de memoria mediante el cual la estructura del programa refleja su división lógica, llevándose a cabo una agrupación lógica de la información en bloques de tamaño variable denominados segmentos. Cada uno de ellos tienen información lógica del programa: subrutina, arreglo, etc. Luego, cada espacio de direcciones de programa consiste de una colección de segmentos, que generalmente reflejan la división lógica del programa. 

OBJETIVOS: 
  • Modularidad de programas: Cada rutina del programa puede ser un bloque sujeto a cambios y recopilaciones, sin afectar por ello al resto del programa. 
  • Estructuras de datos de largo variable: Ejm. Stack, donde cada estructura tiene su propio tamaño y este puede variar. 
  • Protección: Se pueden proteger los módulos del segmento contra accesos no autorizados. 
  • Compartición: Dos o más procesos pueden ser un mismo segmento, bajo reglas de protección; aunque no sean propietarios de los mismos. 
  • Enlace dinámico entre segmentos: Puede evitarse realizar todo el proceso de enlace antes de comenzar a ejecutar un programa. Los enlaces se establecerán sólo cuando sea necesario.


Ventajas de la segmentación

El esquema de segmentación ofrece las siguientes ventajas: 
  • El programador puede conocer las unidades lógicas de su programa, dándoles un tratamiento particular. 
  • Es posible compilar módulos separados como segmentos el enlace entre los segmentos puede suponer hasta tanto se haga una referencia entre segmentos. 
  • Debido a que es posible separar los módulos, se hace más fácil la modificación de los mismos. Cambios dentro de un módulo no afecta al resto de los módulos. 
  • Es fácil el compartir segmentos. 
  • Es posible que los segmentos crezcan dinámicamente según las necesidades del programa en ejecución. 
  • Existe la posibilidad de definir segmentos que aún no existan. Así, no se asignará memoria, sino a partir del momento que sea necesario hacer usos del segmento. Un ejemplo de esto, serían los arreglos cuya dimensión no se conoce hasta tanto no se comienza a ejecutar el programa. En algunos casos, incluso podría retardar la asignación de memoria hasta el momento en el cuál se referencia el arreglo u otra estructura de datos por primera vez.

SEGMENTACIÓN PAGINADA

Paginación y segmentación son técnicas diferentes, cada una de las cuales busca brindar las ventajas enunciadas anteriormente. 
Para la segmentación se necesita que estén cargadas en memoria áreas de tamaños variables. Si se requiere cargar un segmento en memoria que antes estuvo en ella y fue removido a memoria secundaria, se necesita encontrar una región de la memoria lo suficientemente grande para contenerlo, lo cual no es siempre factible. En cambio recargar una página implica sólo encontrar un marco de página disponible. 
A nivel de paginación, si quiere referenciar en forma cíclica n paginas, estas deberán ser cargadas una a una, generándose varias interrupciones por fallas de páginas. Bajo segmentación, esta página podría conformar un sólo segmento, ocurriendo una sola interrupción por falla de segmento. No obstante, si bajo segmentación se desea acceder un área muy pequeña dentro de un segmento muy grande, este deberá cargarse completamente en memoria, desperdiciándose memoria. Bajo paginación sólo se cargará la página que contiene los ítems referenciados. 
Puede hacerse una combinación de segmentación y paginación para obtener las ventajas de ambas. En lugar de tratar un segmento como una unidad contigua, éste puede dividirse en páginas. Cada segmento puede ser descrito por su propia tabla de páginas. 

Las direcciones tienen tres componentes: (s, p, d), donde la primera indica el número del segmento, la segunda el número de la página dentro del segmento y la tercera el desplazamiento dentro de la página. Se deberán usar varias tablas: 

- SMT (tabla de mapas de segmentos): Una para cada proceso. En cada entrada de la SMT se almacena la información descrita bajo segmentación pura, pero en el campo de dirección se indicara la dirección de la PMT (tabla de mapas de páginas) que describe a las diferentes páginas de cada segmento. 
- PMT (tabla de mapas de páginas): Una por segmento; cada entrada de la PMT describe una página de un segmento, en la forma que se presentó la pagina pura. 
- TBM (tabla de bloques de memoria): Para controlar asignación de páginas por parte del sistema operativo. 
- JT (tabla de Jobs): Que contiene las direcciones de comienzo de cada una de las SMT de los procesos que se ejecutan en memoria. 


Ventajas y Desventajas de la segmentación paginada

Ventajas de la segmentación paginada: 

  • El esquema de segmentación paginada tiene todas las ventajas de la segmentación y la paginación:  
  •  Debido a que los espacios de memorias son segmentados, se garantiza la facilidad de implantar la compartición y enlace. 
  • Como los espacios de memoria son paginados, se simplifican las estrategias de almacenamiento. 
  • Se elimina el problema de la fragmentación externa y la necesidad de compactación.
  
Desventajas de la segmentación paginada: 

  • Los tres componentes de la dirección y el proceso de formación de direcciones hace que se incremente el costo de su implantación. El costo es mayor que en el caso de de segmentación pura o paginación pura. 
  • Se hace necesario mantener un número mayor de tablas en memoria, lo que implica un mayor costo de almacenamiento. 
  • Sigue existiendo el problema de fragmentación interna de todas -o casi todas- las páginas finales de cada uno de los segmentos. Bajo paginación pura se desperdicia sólo la última página asignada, mientras que bajo segmentación paginada el desperdicio puede ocurrir en todos los segmentos asignados.

-->




Formas de Ejecutar Instrucciones en Microprocesador

Instrucciones en el Microprocesador:


  • Unidad Aritmética/Lógica (ALU) que desarrolla operaciones aritméticas (por ejemplo, suma, resta, multiplicación y división) y lógicas (por ejemplo, mayor que, menor que, igual que) requeridas para procesar las instrucciones.
  • La memoria caché, una memoria especial de alta-velocidad que almacena los datos usados más recientemente, para acelerar el proceso de ejecución de instrucciones. 
  • La tasa a la cual se procesan las instrucciones es controlada por un reloj interno, también conocido como el reloj del sistema.
  • Un ciclo de instrucción no necesariamente corresponde a la ejecución de un número fijo de instrucciones. En algunas ocasiones se necesitan dos ciclos o más para ejecutar una instrucción.
  • El número de instrucciones completadas es independiente del número de ciclos usados. 
  • Algunas veces las comparaciones entre computadoras se hacen basándose en el número de instrucciones por segundo (IPS) en lugar del tiempo de ciclo; ésta medida depende tanto del número de ciclos por segundo como de la mezcla de instrucciones.


Ciclo de Instrucción:

Se conoce como set de instrucciones al conjunto de instrucciones que es capaz de entender y ejecutar un microprocesador. Un ciclo de instrucción, también llamado fetch and execute (búsqueda y ejecución) es el período que tarda un microprocesador en ejecutar una instrucción. Se divide en dos etapas: Ciclo de búsqueda y Ciclo de ejecución

Las instrucciones se clasifican según su función en:

  • Instrucciones de transferencia de datos. Estas instrucciones mueven datos (que se consideran elementos de entrada/salida) desde la memoria hacia los registros internos del microprocesador, y viceversa. También se usan para pasar datos de un registro a otro del microprocesador. Existen algunas instrucciones que permiten mover no sólo un dato, sino un conjunto de hasta 64 KBytes con una sola instrucción.

  • Instrucciones de cálculo. Son instrucciones destinadas a ejecutar ciertas operaciones aritméticas, como por ejemplo sumar, restar, multiplicar o dividir, o ciertas operaciones lógicas, como por ejemplo AND, OR, así como desplazamiento y rotación de bits.

  • Instrucciones de transferencia del control del programa. Permiten romper la secuencia lineal del programa y saltar a otro punto del mismo. Pueden equivaler a la instrucción GOTO que traen muchos lenguajes de programación.

  • Instrucciones de control. Son instrucciones especiales o de control que actúan sobre el propio microprocesador. Permiten acceder a diversas funciones, como por ejemplo activar o desactivar las interrupciones, pasar órdenes al coprocesador matemático, detener la actividad del microprocesador hasta que se produzca una interrupción, etc.



Ciclo de búsqueda

  • Búsqueda de la instrucción:

Lo primero que realiza el microprocesador en un ciclo de instrucción, es buscar la instrucción en la
        memoria principal (RAM). El registro apuntador de instrucciones, tiene almacenada la dirección de
        la próxima instrucción a ejecutar.

Cuando la instrucción fue hallada, el microprocesador pasa la instrucción de la memoria principal a
        través del bus de datos al Registro de Datos de Memoria (MDR). A continuación, lo registrado
        allí es colocado en el Registro de Instrucción Actual (CIR), un circuito que guarda la instrucción
        temporalmente de manera que pueda ser decodificada y ejecutada.


  • Decodificación de la instrucción:

La segunda y última acción comprendida en el ciclo de búsqueda es decodificar la instrucción.
        El dato es enviado a una Unidad de Decodificación, que decodifica la instrucción que se va a ejecutar.
        Es decir, el decodificador traduce la instrucción para saber, justamente, qué instrucción es.


Ciclo de ejecución

Ejecución de la instrucción:      

Una vez que la unidad de decodificación sabe cuál es el significado de la instrucción leída de memoria,
se lo comunica a la Unidad de Ejecución. Esta unidad será la encargada de consumar la ejecución y para ello activará las señales necesarias y en un orden determinado. Es decir, es la encargada de dar las órdenes necesarias a las diversas partes del microprocesador para poder ejecutar cada una de las instrucciones.

--> b

Ciclo de ejecución de instrucciones:

La ejecución de una instrucción de la máquina solo puede dividirse en una secuencia de operaciones individuales llamado el ciclo de ejecución de la instrucción. Antes de ejecutar un programa se carga en memoria. El puntero de la instrucción contiene la dirección de la siguiente instrucción. La cola de la instrucción contiene un grupo de instrucciones a punto de ser ejecutado.

La ejecución de las instrucciones se puede realizar en varias fases: fetch, decodificar, y ejecutar.

Fetch: Recuperar la instrucción de la cola de la instrucción y los incrementos de la puntero de instrucción (IP). El puntero de instrucción es también conocido como el contador de programa.

Decode(decodificar):Su función es decodificar la instrucción para determinar lo que la instrucción hace. Operandos de entrada de la instrucción se pasan a la unidad aritmética lógica (ALU), y las señales son enviadas a la ALU que indica la operación a realizar.

Fetchoperandos: Si la instrucción utiliza un insumo que se encuentra operando en la memoria, la unidad de control utiliza un operación de lectura para recuperar el operando y copiarla en los registros internos. Registros internos no son visible para programas de usuario.

Ejecutar: La ALU ejecuta la instrucción con los registros con nombre y los registros internos como operandos y envía el resultado a los registros de nombre y / o la memoria. Los indicadores de estado ALU proporcionan información sobre el estado del procesador.

Operando de salida: Si el operando de salida está en la memoria, la unidad de control utiliza una operación de escritura para almacenar los datos.


Tipos según la instrucción que maneja

Si un microprocesador es capaz de ejecutar muchas instrucciones en código máquina no es garantía de ser mejor que otro que ejecuta menos instrucciones. En la actualidad sucede todo lo contrario.

Si atendemos al número de ciclos de reloj que se necesitan para ejecutar las instrucciones en código máquina podemos encontrar dos tipos de microprocesadores:

CISC.-Computación con una colección de instrucciones compleja. Las instrucciones son ejecutadas haciendo uso de varios ciclos de reloj. Las instrucciones son interpretadas por un microprograma a través de la unidad de control. Es decir, cada instrucción "código máquina" está asociada a una serie de microinstrucciones dentro del microprocesador.

RISC.- Computación con una colección de instrucciones reducida. Son más rápidos y eficientes aunque los programas ejecutables son más largos. Una tarea simple puede requerir la ejecución de varias instrucciones. Cada instrucción es ejecutada en un ciclo de reloj, excepto las de cargar y guardar. También poseen otras características que los definen como el formato simple de instrucción. Es decir, todas ocupan un número de bits.

Lectura y ejecución de instrucciones

El procesador lee una instrucción de la memoria, al comienzo de cada Ciclo de instrucción. Se cuenta con un contador de programas (PC programcounter), que lleva la cuenta de cual es la próxima instrucción a leer.

Luego de leer cada instrucción el procesador incrementara el PC, de manera tal que la siguiente instrucción a leer será; la que se encuentra en la dirección inmediatamente superior de la memoria. La instrucción leída es cargada en el registro de instrucción (IR instuctionregister), que es un registro del procesador. El procesador interpreta la instrucción, la cual está en forma de código binario, que especifica la acción que el procesador llevará a cabo, y realizará la acción requerida.

 Pasos en la ejecución de una instrucción dentro del procesador:

  1. La unidad de interface con el bus lee la siguiente instrucción del programa y los datos asociados, que le llegan a través del FSB. 
  2. La unidad de decodificación traduce la instrucción y se la pasa a la unidad de control para que decida qué hacer con ella.
  3. Si la instrucción necesita ejecutar alguna operación matemática, se la pasa a la ALU.
  4. La ALU realiza la operación y deja el resultado en un registro.
  5. La unidad de control le pasa el resultado de la operación a la unidad de interfaz con el bus y le da la orden de guardarla en la memoria.
  6. La unidad de interfaz con el bus escribe en la memoria RAM  el resultado de la ejecución de la instrucción a través del FSB.
Este comportamiento se ejecuta de forma continua en un bucle hasta que se alcanza el final del 
        programa.


Formas de ejecución de instrucciones en el microprocesador
Ejecución fuera de orden

En arquitectura de computadores, la ejecución fuera de orden u OoOE (Out-of-OrderExecution) es un paradigma utilizado en la mayoría de los microprocesadores de alto rendimiento como forma de aprovechar los ciclos de instrucción que de otro modo serían desperdiciados produciéndose cierta demora de trabajo. Gran parte de los diseños modernos de CPU soportan la ejecución fuera de orden.

Ejecución fuera de orden - Ideas básicas

Procesadores en orden 

1.- Captura de la instrucción.
2.- Si los operandos de entrada están disponibles (en los registros por ejemplo), la instrucción es enviada a la correspondiente unidad funcional. Si alguno de ellos no lo está durante el ciclo de reloj actual (generalmente porque está siendo capturado desde memoria), el procesador inserta burbuja hasta poder utilizar el dato.
3.- La instrucción es ejecutada por la unidad funcional adecuada.
4.- La unidad funcional escribe los resultados en el archivo de registros.

Procesadores fuera de orden

1.- Captura de la instrucción.
2.- Envío de la instrucción a una cola (también llamada buffer o estación de reserva).
3.- La instrucción espera en cola hasta que los operandos de entrada estén disponibles, de manera que una instrucción más reciente puede abandonar el buffer antes que otra anterior si ya tiene los datos disponibles.
4.- La instrucción es enviada a la correspondiente unidad funcional, que la ejecuta.
5.- Se envía el resultado a cola.
6.- La instrucción en curso solamente puede escribir en el archivo de registros una vez que todas las anteriores a ella hayan escrito sus correspondientes resultados.

Ejecución fuera de orden 

La idea clave del procesamiento OoO consiste en permitir al procesador evitar ciertos tipos de burbuja que suceden cuando la información necesaria para realizar una operación no está disponible. Siguiendo los pasos antes explicados, el procesador OoO evita las burbujas comentadas en el paso 2 de la ejecución en orden cuando la instrucción no se puede completar a causa de la falta de datos.

Los procesadores OoO rellenan esos "huecos" de tiempo con instrucciones que sí están listas para ejecutarse para después reordenar los resultados y aparentar que fueron procesadas de manera normal.

La forma en que las instrucciones son ordenadas en el código original a ejecutar se conoce como orden de programa, mientras que el orden en que el procesador las maneja es el orden de datos, siendo aquel en que los datos van quedando disponibles para su captura desde los registros del procesador. Se necesita una circuitería bastante compleja para convertir un orden en otro y poder además mantener el orden lógico de la salida; el propio procesador ejecuta las instrucciones de forma aperentemente aleatoria.





Ejecución fuera de orden - Beneficios

Los beneficios del procesamiento OoO crecen a medida que se profundiza en la segmentación, así como con el crecimiento de la diferencia de velocidades entre la memoria principal (o memoria cache) y el procesador. En las máquinas modernas, el procesador funciona a velocidades mucho mayores que la memoria, de modo que mientras un procesador en orden pierde tiempo esperando por los datos, uno OoO ya habría procesado un gran número de instrucciones.

Superescalar
En un procesador superescalar, el procesador maneja más de una instrucción en cada etapa. El número máximo de instrucciones en una etapa concreta se denomina grado, así un procesador superescalar de grado 4 en lectura (fetch) es capaz de leer como máximo cuatro instrucciones por ciclo. El grado de la etapa de ejecución depende del número y del tipo de las unidades funcionales.
Un procesador superescalar es capaz de ejecutar más de una instrucción simultáneamente únicamente si las instrucciones no presentan algún tipo de dependencia (hazard). 


Super-threading

Es una forma de multithreading simultáneo, similar y anterior al HyperThreading de Intel.
Los computadores con soporte para dicha tecnología pueden ejecutar instrucciones de un hilo de ejecución (thread) distinto cada ciclo de reloj, de tal forma que los ciclos vacíos de uno de ellos pueden usarse para otro hilo. Esto es debido a que un hilo dado seguramente no mantendrá ocupadas todas las unidades de ejecución a la vez.

Algunas implementaciones más avanzadas de esta idea permiten a múltiples hilos ejecutarse en un mismo ciclo de reloj, usando diferentes unidades de ejecución, como las incorporadas en los procesadores superescalares.


Ejecución especulativa

En ciencias de la computación, la ejecución especulativa es la ejecución de código por parte del procesador que no tiene por qué ser necesaria a priori. En la programación funcional, suele usarse el término "evaluación especulativa".

La ejecución especulativa no es más que una optimización. Obviamente, sólo es útil cuando la ejecución previa requiere menos tiempo y espacio que el que requeriría la ejecución posterior, siendo este ahorro lo suficientemente importante como para compensar el esfuerzo gastado en caso de que el resultado de la operación nunca llegue a usarse.


VLIW
Del inglés Very Long Instruction Word.Esta arquitectura de CPU implementa una forma de paralelismo a nivel de instrucción. Es similar a las arquitecturas superescalares, ambas usan varias unidades funcionales (por ejemplo varias ALUs, varios multiplicadores, etc) para lograr ese paralelismo.
Los procesadores con arquitecturas VLIW se caracterizan, como su nombre indica, por tener juegos de instrucciones muy simples en cuanto a número de instrucciones diferentes, pero muy grandes en cuanto al tamaño de cada instrucción. Esto es así porque en cada instrucción se especifica el estado de todas y cada una de las unidades funcionales del sistema, con el objetivo de simplificar el diseño del hardware al dejar todo el trabajo de planificar el código en manos del programador/compilador, en oposición a un procesador superescalar, en el que es el hardware en tiempo de ejecución el que planifica las instrucciones.
       
Un microprocesador típico VLIW es el IA-64.


Ventajas:
  • Simplificación de la arquitectura hardware al no tener que planificar el código.
  • Menor potencia y consumo.
Inconvenientes:

Requiere compiladores mucho más complejos.

Cualquier mejora en la arquitectura hardware implica un cambio en el juego de instrucciones (compatibilidad hacia atrás nula).Aunque los inconvenientes hacen las arquitecturas VLIW poco adecuadas para la computación de propósito general, dichos inconvenientes son irrelevantes en la computación empotrada. El menor consumo y bajo coste del hardware los hace muy adecuados para dichos sistemas. Podemos encontrar VLIW en TVs HD, discos duros multimedia, reproductores bluray, etc.

Procesamiento de varias instrucciones

Son varias las técnicas que pueden utilizarse para ejecutar varias instrucciones a la vez.

1.- Acoplando varios microprocesadores a la placa.- Trabajan de forma coordinada y en paralelo.
2.- Procesador matricial.- Una unidad de control y varias UAL con sus registros asociados.
3.- Procesador de varias unidades funcionales.- Cada una de ellas hace algo: sumar, restar...
4.- Procesamiento escalonado (pipeline).- Similar a la cadena de montaje de coches. Las instrucciones avanzan por distintas zonas que van descodificando la instrucción hasta su total ejecución.

-->





Tipos de Microprocesadores según su Estructura Física

Tipos de Microprocesadores según su Estructura Física

Existen 2 tipos de microprocesadores:
  • De slot 
  • De Pastilla

I.- Microprocesador de Slot

SLOT DEL PROCESADOR

En este slot se conecta el procesador, y sobre el procesador se conecta el disipador de calor y el ventilador. 

Hay que tener en cuenta que hay diferentes tipos de slots y la tarjeta madre esta diseñada para soportar ciertos tipos de procesadores, de modo que no cualquier procesador le queda a la tarjeta madre, el tipo de slot y los procesadores que soporta podemos averiguarlo en la manual de la tarjeta.




Existen básicamente 3 tipos de Slot:

1.- Slot A: 
      En este conector  iban instalados los antiguos procesadores Athlon de AMD.



2.- Slot 1:

 A este conector le corresponden los procesadores Intel Pentium II y también los procesadores más antiguos Pentium III.

3.- Slot 2: 

Este conector es más conocido a nivel de servidores de red, donde iba instalado el procesador Xeon.


Los 3 tipos de Slot son muy similares y pueden englobarse dentro de la siguiente imagen: donde se aprecian también los orificios donde se instalaba un soporte para el microprocesador.



II.- Microprocesador de Pastilla

Son de dos tipos:

  • Microprocesador de pines


  • Microprocesador de contacto

Socket

Con mecanismo ZIF (Zero Insertion Force).

En ellas el procesador se inserta y se retira sin necesidad de ejercer alguna presión sobre él, facilitando mucho las cosas y sobre todo minimizando los riesgos.  Al levantar la palanquita que hay al lado se libera el microprocesador, siendo extremadamente sencilla su extracción. Estos zócalos aseguran la actualización del microprocesador. Antiguamente existía la variedad LIF (Low Insertion Force), que carecía de dicha palanca. 


Sockets de 8ª generación




Nombre: Socket 775 o T
Pines: 775 bolas FC-LGA
Voltajes: VID VRM (0.8 - 1.55 V)
Bus: 133x4, 200x4, 266x4 MHz
Multiplicadores:  13.0x - 22.0x
Micros soportados:
Pentium 4 Extreme (Prescott, 3.73 GHz)
Core 2 Duro (Conroe, E6600/2'4 a E6700/2'666 GHz, FSB 1066)
Core 2 Extreme (Conroe XE, X6800EE/2'933 GHZ)
Notas: los núcleos Presler, Allendale y Conroe son dobles (doble core).







Nombre: Socket 939
Pines: 939 ZIF
Voltajes: VID VRM (1.3 - 1.5 V)
Bus: 200x5 MHz
Multiplicadores:  9.0x - 15.0x
Micros soportados:
Athlon 64 (Victoria, 2GHz+)
Athlon 64 (Newcastle, 2800+ a 3800+)
Sempron (Palermo, 3000+ a 3500+)
Notas: los núcleos X2 Manchester, Toledo y Denmark son dobles (doble core).


Sockets de 7ª generación




Socket 479
Pines: 478 ZIF
Voltajes: VID VRM
Bus: 100x4, 133x4 MHz
Multiplicadores:  12x - 28x
Micros soportados:
Celeron M (Yonah, 410/1'466 a 430/1'733 GHz)
Pentium M (Dothan 735/1'7 a 770/2'133 GHz)
Core Solo (Yonah, 1'833 GHz)
Core Duo (Yonah, T2300/1,667 a T2600/2'166 GHz)
Core 2 Duo (Merom, T550/1'667 a T7600/2'333 GHz)




Sockets de 4ª generación


Nombre: Socket 2
Pines: 238 LIF y 238 ZIF
Voltajes: 5 V
Bus: 25, 33, 40, 50 MHz
Multiplicadores:  1x - 3x
Micros soportados:
486SX (25~33 MHz)
486SX2 (50~66 MHz)
486SX OverDrive (P 25~33 MHz)
Adaptadores soportados:
ComputerNerd RA4
Evergreen 586 133
Gainbery 5x86 133
Kingston TurboChip 133
Madex 486

Arquitectura de un Microprocesador

Arquitectura de un Microprocesador


La arquitectura de un microprocesador o de cualquier procesador se define por el conjunto de instrucciones que puede obedecer, las maneras en que las instrucciones pueden especificar la localización de los datos por procesar.

Las instrucciones que obedece un microprocesador están codificadas como dígitos binarios en un sistema de memoria, cada instrucción se divide en uno o mas campos, todas las instrucciones tienen un campo de código de operación que define el propósito de instrucción como sumar o mover datos.


Componentes Internos
La estructura de un microprocesador se divide en dos partes:


  • Una para procesamiento.
  • Y otra para control

En las que se encuentran :



  1. La unidad aritmética y lógica ( ALU ).
  2. La unidad de tiempo y control.
  3. El controlador.
  4. El registro.
  5. El acumulador.
  6. El decodificador.
  7. Los buses internos.
1.- La ( ALU ) es la parte que ejecuta todos los cálculos numéricos y lógicos durante la operación del procesador.

2.- La unidad de control; su objetivo es mantener la secuencia adecuada y el control de todas las operaciones del ( CPU ), y responde a todas las señales externas.

3.- El controlador decodifica las instrucciones de maquina y genera señales que dirigen la parte procesada del microprocesador.

4.- El registro tiene por misión almacenar el codigo de operación de la instrucción leida desde la memoria, este codigo es decodificado y con esta información se logran todos los micro-pasos. 

5.- Los buses son interconexiones internas llevando información de un lado a otro.
   
            Componentes Exteriores de los Buses

          5.1.-Bus de direcciones.
          5.2.-Bus de datos.
          5.3.-Lineas Vcc y GND.
          5.4.-Bus de control; donde se encuentran :
                  5.4.1.- Lineas de inicialización ( RES ).
                  5.4.2.- Lineas de interrupción ( IQR e NMI ).
                  5.4.3.- Lineas de autorización ( R/W ).
                  5.4.4.- Lineas de solicitud ( SYNC, SO, RDY ).
                  5.4.5.- Lineas de reloj (f0,  f 1, y  f 2 )

5.1.- Los bus de direcciones estan formados por 16 líneas A0 hasta A15 y son líneas de salida.

5.2.- Los bus de datos estan formados por 8 lineas D0 hasta D7, estas líneas son de entrada y salida.

5.3.- Alimentación  requiere solamente de 2 líneas de alimentación 0 y 5 V, con un margen de 5%, y consume una corriente máxima de 200 mA. 

5.4.- Bus de control conjunto de líneas de entrada y otras de salida y se agrupan según su función en los siguientes bloques :

            5.4.1.- Lineas de inicialización recibe la orden de parada de todos sus registros internos 
                       recomenzando el arranque.

           5.4.2.- Líneas de interrupción son de líneas de entrada que le dan al microprocesador diferentes 
                      tipos de ordenes para que detenga de forma temporal la ejecución.

           5.4.3.- Líneas de autorización son lineas de salida y recibe ordenes de diferentes bloques internos.

           5.4.4.- Lineas de solicitud con estas lineas el microprocesador y el resto de los bloques establecen 
                      un dialogo de impulsos electrónicos.

           5.4.5.- Lineas de reloj sirven para entregar al microprocesador y a otros bloques del sistema una o 
                      varias ordenes cuadradas.






Historia de los Microprocesadores


Microprocesador

I.- ¿Que es un Microprocesador?

Es el circuito integrado central y más complejo de un sistema informático; a modo de ilustración, se le suele asociar por analogía como el «cerebro» de un computador.

Esta unidad central de procesamiento está constituida, esencialmente, por registros, una unidad de control, una unidad aritmético lógica (ALU) y una unidad de cálculo en coma flotante(conocida antiguamente como «co-procesador matemático»).

II.- Historia  de los Microprocesadores

  2.1.- Microprocesadores de 4 bits ( 1971)


           En 1971, una compañía que se dedicaba a la fabricación de memorias electrónicas lanzó al mercado  el    
           primer microprocesador del mundo. Este microprocesador fue el resultado de un trabajo encargado por 
          una empresa que se dedicaba a la fabricación de calculadoras electrónicas. El 4004 era un microprocesador de 4 bits capaz de direccionar 4096 localidades de memoria de 4 bits de ancho. Este microprocesador contaba con un conjunto de 45 instrucciones y fue ampliamente utilizado en los primeros videojuegos y sistemas de control.
2.2.- Microprocesadores de 8 bits

Con la aparición de aplicaciones más complejas para el microprocesador y el gran éxito comercial del 4004, Intel decidió lanzar al mercado un nuevo microprocesador, el 8008, éste fue el primer microprocesador de 8 bits. Las características de este microprocesador fueron:

  • Capacidad de direccionamiento de 16 Kb. 
  • Memoria de 8 bits 
  • Conjunto de 48 instrucciones
Las mejoras consistieron en un conjunto más grande de instrucciones, mayor capacidad de direccionamiento y una mayor velocidad de procesamiento.



2.3.- Microprocesadores de 8086 ( 1978)

Diseñado para trabajar con lenguajes de alto nivel, disponiendo de un soporte hardware con el que los programas escritos en dicho lenguajes ocupan un pequeño espacio de código y pueden ejecutarse a gran velocidad.

Características: 

  • El 8086 dispone de instrucciones especiales para el tratamiento de cadenas de caracteres.
  • Los registros de del 8086 tienen una misión específica, por lo que se podría decir que cada uno de ellos tiene su propia personalidad, aunque varios comparten tareas comunes.
  • El encapsulado del 8086 está formado por 40 pastillas, simplificando así el hardware, aunque por el contrario, es necesaria la multiplicación del bus de datos con el de direcciones.
  • El 8086 dispone de un conjunto de registros, denominados “COLA DE INSTRUCCIONES”.
  • Las 20 líneas del bus de direcciones solo permiten direcciones de memoria de 1 Megabyte.
  • El 8086 requiere una señal de reloj externo, siendo 5 y 8 MHz las frecuencias típicas de funcionamiento.
  • El 8086 dispone de una arquitectura “PIPE LINE”.


VELOCIDAD
La frecuencia del reloj se sitúa entre 4,77 MHz y 10 MHz.

COPROCESADOR NUMÉRICO
El 8086 no tenía ninguna instrucción de coma flotante y para realizar operaciones con números reales se requerían bibliotecas con rutinas de software con coma flotante.

MODOS DE DIRECCIONAMIENTO DEL 8086
Estos procesadores tienen 17 modos de direccionamiento (una cantidad bastante grande que los microprocesadores anteriores) o reglas para localizar un operando de instrucción. 

Tres de ellos son comunes a microprocesadores anteriores:
  •  Direccionamiento inmediato
  •  Direccionamiento de registro
  •  Direccionamiento inherente
Todo esto genera los 24 modos de direccionamiento a memoria que se ven a continuación:

2.4.- Microprocesadores de 8088 ( 1979)

Externamente, el chip 8088 solo usaba un formato de 8 bits para su bus de datos. Pero internamente, trabaja con 16 bits, como el procesador 8086.

 La CPU 8086/8088 fue equipada con un bus de direcciones de 20 bits, que permitía seleccionar 2 elevado a la 20 ubicaciones de memoria en forma directa, equivalente a 1 MB (1,048,576 bytes), lo que definía el límite físico de la memoria de este procesador. En sus inicios, en sus inicios funcionaba a una frecuencia de reloj impresionante de 4.77MHz. 




2.5.- Microprocesadores  80286 ( 1982)


El 1 de Febrero de 1982, Intel daba un nuevo vuelco a la industria con la aparición de los primeros 80286 (el famoso ordenador "286") con una velocidad entre 6 y 25 Mhz y un diseño mucho más cercano a los actuales microprocesadores. El 286 tiene el honor de ser el primer microprocesador usado para crear ordenadores clones en masa. Gracias al sistema de “licencias cruzadas”, aparece en el mercado el primer fabricante de clónicos “IBM compatible”.

Soporte de nuevas capacidades, como la multitarea (ejecución simultánea de varios programas), lo que requiere que los programas no "choquen" entre sí, alterando uno los datos o las instrucciones de otros programas.

El 80286 contiene 134.000 transistores dentro de su estructura (360% más que el 8086).

El microprocesador 80286 ha añadido un nuevo nivel de satisfacción a la arquitectura básica del 8086, incluyendo una gestión de memoria con la extensión natural de las capacidades de direccionamiento del procesador.

2.6.- Microprocesadores  80386 ( 1985)

El 16 de octubre de 1985 Intel lanza el i80386, con arquitectura de x86. Fue empleado como la unidad central de proceso de muchos computadores personales desde mediados de los años 80 hasta principios de los 90.

También conocido como 386, con una velocidad de reloj entre 16 y 40 Mhz. Este producto se destacó principalmente por ser un microprocesador con arquitectura de 32 bits.

La primera empresa en realizar una computadora compatible con IBM PC AT basada en el 80386. fue Compaq con su Compaq Deskpro 386 al año siguiente



2.7.- Microprocesadores  80386 SX( 1988)

Para facilitar la transición entre las computadoras de 16 bits basadas en el 80286, apareció en junio de 1988 el 80386 SX con bus de datos de 16 bits y 24 bits de direcciones (al igual que en el caso del 80286). Este microprocesador permitió el armado de computadoras en forma económica que pudieran correr programas de 32 bits. El 80386 original se le cambió de nombre: 80386 DX




2.8.- Microprocesadores  80486 ( 1989)

Este microprocesador es básicamente un 80386 con el agregado de una unidad de punto flotante compatible con el 80387 y un caché de memoria de 8 KBytes. 

Por lo tanto los bloques que componen el 80486 son los siguientes:

  • Unidad de ejecución: Incluye los registros de uso general de 32 bits, la unidad lógico-matemática y un barrelshifter de 64 bits. 
  • Unidad de segmentación: Incluye los registros de segmento, los cachés de información de descriptores y la lógica de protección. 
  • Unidad de paginación: Es la encargada de traducir las direcciones lineales (generadas por la unidad anterior) en direcciones físicas
  • Unidad de caché: La evolución de las memorias hizo que el tiempo de acceso de las mismas decrecieran lentamente, mientras que la velocidad de los microprocesadores aumentaba exponencialmente.
  • Interfaz con el bus: Incluye los manejadores del bus de direcciones (con salidas de A31-A2 y BE0# a BE3# (mediante esto último cada byte del bus de datos se habilita por separado)), bus de datos de 32 bits y bus de control.
  • Unidad de instrucciones: Incluye la unidad de pre-búsqueda que le pide los bytes de instrucciones al caché (ambos se comunican mediante un bus interno de 128 bits), una cola de instrucciones de 32 bytes, la unidad de decodificación, la unidad de control, y la ROM de control (que indica lo que deben hacer las instrucciones).
  • Unidad de punto flotante: Incluye ocho registros de punto flotante de 80 bits y la lógica necesaria para realizar operaciones básicas, raíz cuadrada y trascendentes de punto flotante. 

Unidad de caché
Estos procesadores tienen un caché interno que almacena 8KB de instrucciones y datos excepto el DX4 y el Write-back enhanced DX4 que tienen 16KB de caché interno. El caché aumenta el rendimiento del sistema ya que las lecturas se realizan más rápido desde el caché que desde la memoria externa. Esto también reduce el uso del bus externo por parte del procesador. 

Funcionamiento
En el caso del 80486, cada unidad de memoria son 16 bytes. Esta cantidad es una línea del caché. Las líneas pueden ser válidas (cuando contienen datos de la memoria principal) o inválidas (en este caso la línea no contiene información útil). Como el caché se llena por líneas completas (comenzando por direcciones múltiplos de 16), hay que tratar de no leer posiciones aleatorias de la memoria, ya que en este caso, si se leen bytes en posiciones alejadas unas de otras, el procesador usará cuatro ciclos de bus para leer 16 bytes (para llenar una línea) por cada byte que deseamos leer. Esto no es problema para el código o la pila (stack) ya que éstos se acceden generalmente de manera secuencial.

2.9.- Microprocesadores 80586 -PENTIUM ( 1992-1993)

El 22 de marzo del 1993 ve la luz por primera vez el “Pentium”, también conocido por nombre clave P54C. Estos procesadores partían de una velocidad inicial de 60 MHz, llegando a los 200 MHz, algo que nadie había sido capaz de augurar unos años antes.

Con velocidades iniciales de 60 y 66 MHz (112 millones de instrucciones por segundo en el último caso), 3.100.000 transistores (fabricado con el proceso BICMOS (Bipolar-CMOS) de 0,8 micrones), caché interno de 8 KB para datos y 8 KB para instrucciones, verificación interna de paridad para asegurar la ejecución correcta de las instrucciones, una unidad de punto flotante mejorada, bus de datos de 64 bit para una comunicación más rápida con la memoria externa y, lo más importante, permite la ejecución de dos instrucciones simultáneamente.

 El chip se empaqueta en formato PGA (Pin Grid Array) de 273 pines.

Vías de acceso múltiples
Lo que comenzó con la técnica del 386/486 de tener vías de acceso múltiples para la ejecución de instrucciones, se ve refinado en el Pentium ya que tiene un diseño con doble vía de acceso. 

Dependencias de procedimiento
Puede ocurrir un problema potencial con la ejecución debido a las muchas trayectorias que la secuencia de una instrucción puede tomar. La predicción de la trayectoria a tomar es el método que debe usarse aquí. 

Ejecución de punto flotante en el Pentium
Se ha reconstruido por completo la unidad de punto flotante (FPU), a partir de la de los 386 y 486 y ahora tiene algunas de las características de los RISC. Hay ocho etapas de vía y las cinco primeras se comparten con la unidad de enteros. 

Ahorro de energía
El Pentium usa un modo de administración de sistema (SMM) similar al que usa el 486 SL, que permite que los ingenieros diseñen un sistema con bajo consumo. La interrupción de administración del sistema activa el SMM por debajo del nivel del sistema operativo o de la aplicación.