Académique Documents
Professionnel Documents
Culture Documents
Poderlos ejecutar.
Referenciarlos directamente.
Llevar un registro de las partes de memoria que se están utilizando y de aquellas que no.
Asignar espacio en memoria a los procesos cuando estos la necesitan.
Liberar espacio de memoria asignada a procesos que han terminado.
Los programas y datos tienen que estar en la memoria principal para poder ejecutarse o ser
referenciados Los programas y datos que no son necesarios de inmediato pueden mantenerse
en el almacenamiento secundario.
El almacenamiento principal es más costoso y menor que el secundario pero de acceso más
rápido. Y a su vez el cache que es más rápido que el primario también es más costoso, Los
sistemas con varios niveles de almacenamiento requieren destinar recursos para administrar el
movimiento de programas y datos entre niveles.
Las Estrategias de Administración de Memoria están dirigidas a la obtención del mejor uso
posible del recurso del almacenamiento principal. Se dividen en las siguientes categorías:
Estrategias de búsqueda:
o Estrategias de búsqueda por demanda.
o Estrategias de búsqueda anticipada.
Estrategias de colocación.
Estrategias de reposición.
Es decir en este método solo hay un proceso trabajando en memoria a la vez. Por lo tanto es
un método Mono tarea y mono usuario.
Una vez efectuada la partición, hay dos maneras de asignar los procesos a ella. La primera es
mediante el uso de una cola única que asigna los procesos a los espacios disponibles de la
memoria conforme se vayan desocupando. El tamaño del hueco de memoria disponible es
usado para localizar en la cola el primer proceso que quepa en él. Otra forma de asignación es
buscar en la cola el proceso de tamaño mayor que se ajuste al hueco, sin embargo hay que
tomar en cuenta que tal método discrimina a los procesos más pequeños. Dicho problema
podría tener solución si se asigna una partición pequeña en la memoria al momento de hacer la
partición inicial, el cual sería exclusivo para procesos pequeños.
Esta idea nos lleva a la implementación de otro método para particiones fijas, que es el uso de
diferentes colas independientes exclusivas para cierto rango en el tamaño de los procesos. De
esta manera al llegar un proceso, éste sería asignado a la cola de tamaño más pequeño que la
pueda aceptar. La desventaja en esta organización es que si una de las colas tiene una larga lista
de procesos en espera, mientras otra cola esta vacía, el sector de memoria asignado para ese
tamaño de procesos estaría siendo desperdiciado.
Grado de Multiprogramación
El Grado de Multiprogramación no es más que el número de procesos que actualmente están
cargados en memoria principal (en cualquier estado) y eventualmente podrán correr.
El objetivo del análisis de desempeño, es poder ver cual es el aprovechamiento del CPU en
función del numero de procesos en memoria, y a su vez apreciar cual es el porcentaje de
desperdicio de CPU.
Reubicación y protección
La multiprogramación introduce dos problemas fundamentales que deben resolverse:
reubicación y protección. Diferentes trabajos deben ejecutarse en direcciones diferentes como
se puede ver en la figura superior. Cuando se enlaza un programa (es decir, cuando se
combinan el programa principal, los procedimientos escritos por el usuario y los
procedimientos de biblioteca en un único espacio de direcciones), el enlazador (linker) necesita
saber en qué dirección de la memoria comenzará el programa.
Por ejemplo, supongamos que la primera instrucción es una llamada a un procedimiento que
está en la dirección absoluta 100 dentro del archivo binario producido por el enlazador. Si este
programa se carga en la partición 1 (en la dirección 100K), esa instrucción saltará a la dirección
absoluta 100, que está dentro del sistema operativo. Lo que se necesita es una llamada a 100K
+ 100. Si el programa se carga en la partición 2, la llamada deberá llevarse a cabo como una
llamada a 200K + 100, y así sucesivamente. Este problema se conoce como el problema de la
reubicación.
Una posible solución consiste en modificar las instrucciones a medida que el programa se carga
en la memoria. Los programas cargados en la partición 1 tendrán cada dirección incrementada
en 100K, los programas cargados en la partición 2 tendrán sus direcciones incrementadas en
200K, y así sucesivamente. Para realizar la reubicación durante la carga de esa manera, el
enlazador deberá incluir en el programa binario una lista o mapa de bits que indique qué
palabras del programa son direcciones a reubicar y cuáles son códigos de operación, constantes
u otras cosas que no deben reubicarse. OS/MFT trabajaba de esta manera.
La solución que IBM escogió para proteger el 360 fue dividir la memoria en bloques de 2 KB y
asignar un código de protección de 4 bits a cada bloque. El registro de estado, denominado en
el 360 PSW (Program Status Word), contenía una clave de 4 bits. El hardware del 360
provocaba una excepción tras cualquier intento por parte del proceso en ejecución de acceder
a un bloque de memoria cuyo código de protección difiriera de la clave contenida en la PSW.
Puesto que sólo el sistema operativo puede modificar los códigos de protección y la clave, se
impedía así que los procesos de usuario interfiriesen unos con otros y con el sistema operativo
mismo.
Una desventaja de este esquema es la necesidad de efectuar una suma y una comparación
cada vez que se hace referencia a la memoria. Las comparaciones pueden hacerse
rápidamente, pero las sumas son lentas debido al tiempo de propagación del acarreo a menos
que se utilicen circuitos especiales de suma.
El CDC 6600 – el primer supercomputador del mundo – utilizaba este esquema. La CPU Intel
8088 incorporada en el PC original de IBM, utilizaba una versión más débil de este esquema:
registros de base, pero sin registros de límite. En la actualidad son pocos los ordenadores (si es
que hay alguno) que utilicen este esquema.
Con el procesador 8086 se amplía este concepto y permite que un programa pueda generar una
interrupción en cualquier momento. A este tipo de interrupciones se las conoce como
interrupciones software para diferenciarlas de las interrupciones hardware, generadas por
dispositivos externos al procesador. Existen, no obstante, de 8 a 15 interrupciones que no se
llaman de la misma forma que las interrupciones de software, sino mediante el controlador de
interrupciones, como interrupciones hardware.
Las Interrupciones de Hardware sirven para que el procesador pueda identificar cuando es
posible que este pueda usar estos dispositivos de hardware y a su vez identificar quien tiene
mayor prioridad según la declaración inicial.
El propósito de las interrupciones es generar brincos entre rutinas para crear la ilusión del
multitasking y también para permitir la adquisición de datos de los periféricos de entrada de un
ordenador aun cuando se este ejecutando un programa particular.
Vector de Interrupciones
En informática el vector de interrupciones es un vector que contiene el valor que apunta a la
dirección en memoria del gestor de una interrupción. En muchas arquitecturas de computación
típicas, los vectores de interrupción se almacenan en una tabla en una zona de memoria, la
llamada tabla de vectores de interrupción, de modo que cuando se atiende una petición de
interrupción de número n, el sistema, tras realizar eventualmente algunas tareas previas (tales
como salvar el valor de ciertos registros) transfiere el control a la dirección indicada por el
elemento n-ésimo de dicha tabla.
También son conocidas como “falsas interrupciones” ya que se producen como consecuencia
de la ejecución de otra instrucción al no ser el hardware las que las produce. Otra forma de
entender estas interrupciones, es verlas desde el punto de vista de llamadas a subrutinas,
lógicamente, la gracia está en que esas subrutinas no son nuestras, sino que son las propias de
cada sistema operativo, driver o similar tiene. Quedaros pues, con que somos nosotros los que
hacemos invocamos a la interrupción. Este tipo de interrupción es el más habitual en la
programación.
Las interrupciones de software son invocadas a través de la instrucción INT del 8086. La
mayoría de las interrupciones de software son vectoreadas a (DSRs) localizado en el BIOS, o en
programas de aplicación.
Después el CPU guarda el valor actual del registro CS colocándolo en la pila. Entonces se carga
el CS que corresponde al manejador de interrupciones que se encontraba almacenado en la
tabla del vector de interrupciones. La tabla del vector de interrupciones se encuentra al fondo
de la memoria RAM. La tabla se indexa multiplicando el número de la interrupción por 4 y
después sumándole 2. Esto es:
El valor actual del IP se guarda colocándolo en la pila. El nuevo IP se carga con el valor del offset
del manejador de instrucciones almacenado en el vector de interrupciones. La tabla del vector
de interrupciones se indexa multiplicando el valor de la interrupción por 4. Esto es:
Este procedimiento le pasa el control al procedimiento apuntado por el nuevo CS:IP. Cualquier
registro que utilice el manejador debe almacenarse en la pila, y cuando termine su tarea se
deben restablecer los valores que se almacenaron en la pila a sus respectivos registros. Si el
manejador es una interrupción por hardware, entonces le informa al PIC (Programable
Interrupt Controller) que a finalizado enviandolo un EOI (End Of Interrupt).
La técnica del vector de interrupciones proporciona una forma muy pura para hacer
modificaciones a las interrupciones de los programas sin cambiar las formas de las funciones
del CPU. Todo lo que se debe hacer es cambiar las direcciones de puntos de entrada en la tabla.
Los cambios más comunes en los programas de manejo de interrupciones (o programas de
servicio) se hacen cuando se carga un sistema operativo.
INT 0: Error de división, generada automáticamente cuando el cociente no cabe en el registro o
el divisor es cero. Sólo puede ser generada mediante DIV o IDIV. El 8088/8086 guardan en la
pila la sentencia siguiente a la que causó la excepción, mientras que el 286 y superiores
guardan la sentencia que la generó.
BOUND reg16, mem32. Verifica que el valor contenido en el registro se encuentre entre los dos
valores indicados en la memoria (un valor está dado por los dos primeros bytes, y el otro por los
dos últimos). Si está fuera de rango se ejecuta una interrupción interna de tipo 5. De esta
manera se puede observar que BOUND es una instrucción de interrupción condicional,
como INTO.
Interrupciones de Hardware.
Este tipo de interrupción es invocado directamente por los dispositivos hardware de nuestro
ordenador, por lo que “son bastante más auténticas” que las anteriores. Al producir algún
dispositivo hardware la interrupción el controlador de interrupciones o PIC se encarga de
gestionarla determinando, en el caso de producirse más de una interrupción a la vez, cual de
ellas tiene más prioridad y debe de ser gestionada por la CPU. El funcionamiento de este tipo de
interrupciones es bastante similar y se suele utilizar mucho para la programación de sistemas
de comunicaciones.
INTR (Interrupt Request): Por esta entrada se introduce una interrupción que es aceptada o no
según haya sido previamente indicado por las instrucciones EI (Permitir interrupciones) o DI (No
permitir interrupciones). Cuando una interrupción es permitida y ésta se ha producido, la CPU
busca una instrucción RST (de un sólo byte), que es presentada por el bus de datos por el
periférico que interrumpe. Este byte tiene el formato binario 11 XXX 111. La subrutina se
ubicará en la dirección 00 XXX 000.
NMI
Una interrupción no enmascarable (o NMI) es un tipo especial de interrupción usada en la
mayoría de los microordenadores como el IBM PC y el Apple II.
Una interrupción no enmascarable causa que la CPU deje lo que está haciendo, cambie el
puntero de instrucción para que apunte a una dirección particular y continúe ejecutando el
código de esa dirección. Se diferencia de los otros tipos de interrupción en que los
programadores no pueden hacer que la CPU las ignore, aunque algunos ordenadores pueden
por medios externos bloquear esa señal, dando un efecto similar al resto de las interrupciones.
Usos
Al no poderse desactivar son empleadas por dispositivos para los que el tiempo de respuesta es
crítico, como por ejemplo el coprocesador matemático Intel 8087 en el IBM PC, el indicador de
batería baja, o un error de paridad que ocurra en la memoria.
También se podían lanzar NMI por el usuario, permitiendo interrumpir el programa actual para
permitir la depuración. En este caso al lanzarse una NMI se suspendía la ejecución del programa
actual y el control se transfería a un depurador para que el programador pudiera inspeccionar
el estado de la memoria, los registros, etc. Estas NMI eran lanzadas de diferentes maneras,
como pulsando un botón, por medio de una combinación de teclas o por medio de un
programa.
En juegos, se producía una NMI y se interrumpía el juego, de esta manera se podían conseguir
vidas extras por ejemplo modificando el área de memoria donde se guardaban las vidas
restantes.
INTA
Cuanto el procesador está dispuesto a aceptar la petición de interrupción activa una señal de
un bit, llamada INTA. Entonces, el hardware externo envía el identificador de interrupción que
usará el procesador para indexar el vector de interrupciones.