• No se han encontrado resultados

Espacio de direcciones lógicas versus físicas

In document Conceptos de Sistemas Operativos (página 95-97)

Una dirección generada por la CPU se dice que es una dirección lógica, mientras que una dirección vista por la unidad de memoria (es decir, una cargada en el registro de dirección de memoria de la memoria) se dice que es una dirección física.

Los esquemas de address-binding en tiempo de compilación y en tiempo de carga resultan en un ambiente donde las direcciones lógicas y físicas son las mismas. Sin embargo, el esquema de address-binding en tiempo de ejecución producen un ambiente donde las direcciones lógicas y físicas son diferentes. En este caso, usualmente nos referimos a una dirección lógica como una dirección virtual. Al conjunto de todas las direcciones lógicas generadas por un programa es llamado el espacio de direcciones lógicas; el conjunto de direcciones físicas correspondientes a éstas direcciones lógicas es referenciado como el espacio de direcciones físicas.

El mapeo en tiempo de ejecución desde la direcciones lógicas a las direcciones físicas es hecho por la unidad de administración de memoria (memory-management unit: MMU), el cual es un dispositivo de hardware. Existen varios esquemas para lograr este mapeo que se verán más adelante.

En la figura 8.3 se ve un ejemplo. El registro base es llamado registro de reubicación. El valor del registro de reubicación es sumado a cada dirección generada por el proceso de usuario en el momento que ésta es enviada a memoria.

Note que el programa del usuario nunca ve las direcciones físicas reales. El programa puede crear un puntero a la ubicación 346, almacenarlo en memoria, manipularlo, compararlo con otras direcciones (todas estas operaciones como el número 346). Solo cuando éste (es decir, el 346) es usado como una dirección

Rutinas comunes Driver de overlay Tabla de símbolos 30K Paso1 Paso2 10K 80K 70K 20K

Figura 8.2 Overlays de un asembler de dos pasos.

Dirección lógica Memoria CPU + 14000 Registro de reubicacion MMU 346 Dirección física 14346

de memoria (quizás en una carga o almacenamiento indirecto), ésta es reubicada de acuerdo al registro base. El programa del usuario trata con direcciones lógicas. El hardware de mapeo de memoria convierte las direcciones lógicas a físicas. La ubicación final de una dirección de memoria referenciada no es determinada hasta que se hace la referencia.

Note también que tenemos dos tipos diferentes de direcciones: direcciones lógicas (en el rango 0 a max) y direcciones físicas (en el rango R + 0 a R + max para el valor base R). El usuario genera solo direcciones lógicas y piensa que el programa corre en las ubicaciones 0 a max.

Swapping

Un proceso debe estar en memoria para poder ser ejecutado. Sin embargo, un proceso puede ser sacado temporalmente de la memoria a un almacenamiento de seguridad, y luego traído nuevamente a la memoria para continuar su ejecución. Por ejemplo, supongamos un ambiente multiprogramado con un algoritmo de scheduling de CPU Round Robin. Cuando un quantum termina, el administrador de memoria comenzara a sacar de la memoria el proceso que finalizo, y traerá otro proceso al espacio de memoria que ha sido liberado (Figura 8.4). Mientras tanto, el scheduler de CPU asignara una porción de tiempo de CPU a otro proceso que este en la memoria. Cada vez que un proceso termina su quantum, será cambiado con otro proceso.

Una variante de esta política de quantum es usar algoritmos de scheduling basado en prioridades. Si un proceso de una alta prioridad llega y quiere servicio, el administrador de memoria puede sacar un proceso de más baja prioridad para cargar el de alta prioridad y ejecutarlo. Al terminar, el proceso de baja prioridad puede ser traído nuevamente y continuar. Esta variante es llamada roll in, roll out.

Normalmente, un proceso que es sacado de la memoria será retornado a la misma en el mismo espacio de direcciones que ocupaba antes de que sea desalojado. Esta restricción depende del método de address- binding que se haya implementado. Si el binding es hecho en tiempo de carga o de compilación, entonces el proceso debe mantener su espacio de direcciones. Si el binding fue realizado en tiempo de ejecución, entonces es posible cambiar un proceso en diferentes espacios de direcciones, ya que las direcciones físicas son calculadas en tiempo de ejecución.

Swapping requiere un almacenamiento de seguridad. Este es comúnmente un disco rápido. Debe ser bastante grande para mantener las copias de todas las imágenes de memoria para todos los usuarios, y debe proveer acceso directo a éstas imágenes de memoria. El sistema mantiene una cola de listos el cual son todos los procesos cuyas imágenes de memoria están almacenadas ya sea en la memoria o en disco y están listos para correr. Cuando el scheduler de la CPU decide ejecutar un proceso, éste llama al dispatcher. El dispatcher chequea para ver si el siguiente proceso esta en memoria. Si no esta, y no hay memoria libre, el dispatcher saca (swap out) un proceso que esta en memoria y pone (swap in) el proceso deseado. Luego recarga sus registros y transfiere el control al proceso seleccionado. Se debe tener claro que el tiempo de context switch en estos sistemas es bastante alto.

Almacenamiento de seguridad Sistema operativo Espacio del usuario 1: Swap out Proceso 1 Proceso 2 2: Swap in Memoria principal

Existen otras restricciones sobre swapping. Si queremos cambiar un proceso, debemos estar seguros que está completamente ocioso. Una preocupación particular es cualquier I/O pendiente. Si un proceso esta esperando por una operación de I/O, puede que queramos cambiar el proceso y así poder liberar su memoria. Sin embargo, si la I/O esta accediendo asincrónicamente a los buffer de I/O de la memoria del usuario (es decir, el dispositivo de I/O esta usando parte del espacio de memoria del proceso a sacar), entonces el proceso no puede ser cambiado. Asumamos que la operación de I/O esta en una cola de espera ya que el dispositivo esta ocupado. Entonces, si sacamos el proceso P1 y metemos el proceso P2, la operación de I/O podría entonces intentar usar la memoria que ahora pertenece al proceso P2. Las dos soluciones principales son:

nunca cambiar un proceso que tiene una I/O pendiente.

ejecutar las operaciones de I/O solo en buffers del sistema operativo (que trabajan en la parte de memoria del sistema operativo, el cual nunca es tocada por los procesos del usuario). La transferencia de memoria entre el sistema operativo y el proceso ocurrirá solo cuando el proceso este cargado.

In document Conceptos de Sistemas Operativos (página 95-97)