Está en la página 1de 33

Sistemas Operativos

1. Threads

1. Definición y diferencia con el enfoque de proceso clásico.


2. En qué estructura de datos están representados los hilos. Indique la información que se almacena en ella.
3. Para los distintos tipos enumerados, indique de qué maneras el SO realiza la planificación de los mismos.
En caso de que el SO no pueda llevar a cabo la planificación, indique de qué manera se resuelve la
situación y qué inconvenientes podrían ocurrir.
4. Tipos de hilos. Características de c/u.
5. Describa los distintos modelos vistos en la teoría, explicando características y diferencias entre ellos.
Ejemplifique cada uno.
6. Modelos de Threading. Definición, ventajas y desventajas de c/u
7. En un esquema de ULT puro (modelo N:1) indique qué funcionalidades mínimas debería incluir la
biblioteca de hilos para operar.
8. Indique qué ventajas presenta el uso del modelo 1:1 sobre el modelo N:1
9. Si tuviera que implementar un Servidor de Archivos, ¿Cuál de los tipos de threads conviene utilizar, por
qué?
10. ULT y KLT. Definición, ventajas y desventajas de c/u.

2. Comunicación y Sincronización

a. Sección crítica: Definición. Cite ejemplos de secciones críticas que se pueden encontrar en un SO.
¿El kernel contiene SC ? en caso afirmativo cite ejemplos y en caso negativo justifique .
b. ¿Es correcto brindar a procesos de usuario la opción de utilizar interrupciones para implementar la
SC? Justifique.
c. Comparar Spinlocks y Elevar nivel del procesador(también conocido como elevar el nivel de
interrupciones) para implementar Sección Crítica. Tenga en cuenta: Funcionamiento,
implementación, ventajas y desventajas de cada una.
d. Dada las dos técnicas indicadas en el punto anterior, compare su utilización en ambientes
monoprocesador y multiprocesador.

e. Dos procesos intentan acceder a la misma estructura del kernel para modificarla. Por ej. La Ready
Queue. Si se cuenta con un único procesador ¿Qué herramienta utilizaría para garantizar la
exclusión mutua?¿Por qué?¿Cómo se implementaría si se contara con con multiprocesadores y
una organización SMP?

Para un sistema monoprocesador deshabilitaría las interrupciones, ya que no queremos que


ocurra una interrupción mientras el kernel está actualizando estructuras sensibles que podrían
quedar en un estado inconsistente y afectar todo el sistema. Pero debemos tener en cuenta que

1
esto funciona solo para sistemas monoprocesador ya que al deshabilitar las interrupciones sólo se
ve afectada la CPU que ejecutó la instrucción disable. Las demás continuarán ejecutándose y
pueden acceder a la memoria compartida.

Para el caso de sistemas multiprocesadores spin lock y deshabilitar las interrupciones

f. En el modelo Threading N:1 se necesita un semáforo para sincronizar los threads de un proceso
¿El semáforo se debe implementar en el SO(Kernel) o en la librería de hilos? Justifique.
g. Intercomunicación entre procesos (IPC) Definición, indique las operaciones existentes para el
intercambio de mensajes.
h. Pasaje de Mensajes: Comunicación Directa e Indirecta
i. Comunicación indirecta ¿Cómo funciona? Cite las diferentes posibilidades de configuración en la
capacidad de link.

3. Deadlocks

a. Deadlocks. Definición. Diferencias entre Evitar y Prevenir los Deadlocks


b. Modelo "detectar y recuperar “¿Cómo funciona?
c. Deadlock.Formas de PREVENIR que ocurran.
d. De un ejemplo de un sistema en estado de deadlock indicando componentes
e. ¿A qué hace referencia el concepto de prevenir el estado de deadlock? Cite 4 condiciones sobre
las que trabaja esta técnica.
f. Condiciones para considerar un sistema en deadlock

4. Multiprocesadores
a. A qué hace referencia el concepto de Sistemas Multiprocesadores. Compare con un sistema
monoprocesador. ¿Qué cuestiones se debe tener en cuenta en cuanto a la planificación?
b. En sistemas multiprocesadores ¿Qué técnicas pueden ser utilizadas para minimizar la contención
del bus para el acceso a la memoria?
c. ¿A qué hace referencia el concepto de Sistema Distribuido? ¿Qué es un Middleware en un
sistemas distribuido? Cite un ejemplo

5. Ejecutables

6. Protección y Seguridad
a. Indique y compare las diferentes formas de implementar una matriz de acceso, ¿Para qué se
utiliza el permiso “switch” en una celda de una matriz? Agrego Protección y Seguridad, Objetos y
Dominios
b. ¿Qué es la matriz de acceso y para qué se utiliza? De un ejemplo de uso de la misma
c. Indique y ejemplifique al menos 2 operaciones que pueden realizarse sobre los elementos de la
matriz
d. ¿Para qué se usa la matriz de acceso? De un ejemplo sencillo de asignación de permisos con 3
objetos y 3 dominios distintos. Explique el ejemplo.
e. Defina el concepto de protección y seguridad. ¿Qué define cada uno y qué diferencias existen?

7. Virtualización y Grid

2
a. Definición. Diferencias con Emulación
b. Diferencias entre el Hypervisor de Tipo I y de Tipo II. Paravirtualización
c. En la técnica de paravirtualización se requiere que la CPU tenga VT? Explique
d. ¿A qué hace referencia el concepto de Traducción Binaria ?
e. ¿Qué es un Hipervisor? ¿Qué tipo de hipervisores existen?

Indique si las siguientes afirmaciones son verdaderas o falsas y justifique brevemente.


a. En el modelo threading N:1 y una arquitectura de multiprocesadores SMP dos UTL del mismo proceso se
podrían ejecutar paralelamente
b. En un modelo threading N:M y una arquitectura de multiprocesadores Maestro-Esclavo los KLT se podrán
crear en cualquiera de los procesadores disponibles.
c. En el modelo threading 1:1 la creación de un UTL no requerirá un cambio a modo kernel.
d. En un modelo de threading N:1 la implementación de semáforos para que dos threads del mismo proceso
se sincronicen deberá realizarse en el kernel.
e. Para sincronizar threads en modo kernel la mejor herramienta es elevar el nivel del procesador.
f. En la arquitectura multiprocesador SMP la mejor herramienta para sincronizacion es elevar el nivel del
procesador.
g. En un sistema distribuido cada nodo podrá ejecutar un SO diferente

Threads

Proceso

Un proceso es un programa en ejecución, es la unidad básica de asignación de los recursos . Mientras que un
programa es considerado una entidad pasiva un proceso es una entidad activa que tiene asociado a él un
conjunto de recursos para llevar a cabo la ejecución de ese programa:

● Contador de programa (CP) : Especifica la siguiente instrucción que hay que ejecutar.
● Contenido de los registros del procesador
● Pila: Contiene datos temporales como los parámetros de las funciones,direcciones de retorno y variables
locales
● Sección de datos: Contiene variables globales.
● Cúmulo de memoria: Memoria que se le asigna dinámicamente al proceso en tiempo de ejecución

Estos recursos se proporcionan al proceso en el momento de crearlo o se le asignan mientras se están


ejecutando.

3
La CPU ejecuta una instrucción del proceso después de otra hasta completarlo. Un proceso multihebra tiene
múltiples CP, c/u apuntando a la siguiente instrucción correspondiente de cada hebra.

Threads

El hilo es la unidad básica de utilización de la CPU. Lo que agregan los hilos al modelo de procesos es permitir
que se lleven a cabo varias ejecuciones en el mismo entorno del proceso, que son en gran parte independientes
unas de las otras.

Elementos por Thread

Id

Estado de ejecución

Contador de programa

Pila en modo usuario y otra en modo supervisor ]]]

Almacenamiento para variables locales

Comparte con otros threads pertenecientes al


mismo proceso : sección de código , sección de
datos y otros recursos del S.O como archivos y
señales

Diferencias con el concepto tradicional

Estructura

En un ambiente multihilo, un proceso es la unidad de protección y asignación de recursos.

Cada hilo dentro de un proceso contará con:


● Un estado de ejecución
● Un contexto de procesador
● Una pila en modo usuario y otra en modo supervisor
● Almacenamiento para variables locales
● Acceso a memoria y recursos del proceso (archivos abiertos, señales, además de la parte de código y
datos) que compartirá con el resto de los hilos

La estructura de un hilo está constituida por:


● program counter
● un conjunto de registros
● un espacio de stack

4
Un proceso tradicional (heavyweight process o monohilo) es una tarea formada por un solo hilo. Cuenta con un
PCB (process control block), espacio de direcciones de usuario y 2 pilas.

En un proceso multihilo, además de PCB, espacio de direcciones de usuario y 2 pilas, cada hilo tiene su propio
TCB (thread control block) y 2 pilas.

Los hilos de un proceso comparten estado y recursos del sistema, residiendo en el mismo espacio de direcciones
y accediendo a los mismos datos.

Context switch

Cuando un proceso tradicional gana CPU, el sistema operativo debe hacer un cambio de contexto (context
switch) para hacer el correspondiente salvado del ambiente relacionado con el proceso anterior y cargar el
ambiente del nuevo.
Esta actividad la realiza el sistema operativo, en modo supervisor, y es la consecuencia de algún system call
emitido por el proceso saliente o interrupción.
Entre los hilos que comparten una tarea, el cambio entre uno y otro es más simple pues el context switch es sólo
a nivel del conjunto de registros y carga no hay cambios con respecto a espacios de direcciones.

Podemos resumir que en el switching de los hilos no se exige la participación del sistema operativo e
interrupciones al kernel.

La creación de un hilo

La creación de un proceso involucra una operación tipo fork, creando un nuevo espacio de direcciones, PCB, PC,
etc. El nuevo proceso es creado y controlado a través de system calls que exigen el mismo tratamiento que una
interrupción.
La creación de un hilo involucra sólo la creación de la estructura detallada más arriba: un conjunto de registros,
un PC y un espacio para stack, requiriendo un gasto mínimo de procesamiento.

Operación

Los hilos pueden ser una manera eficiente de permitir que un servidor pueda atender varios requerimientos.

En un ambiente monoprocesador, un hilo comparte la CPU con los otros hilos, y sólo uno está activo en un
momento dado. Se ejecuta secuencialmente y tiene su propio PC y stack.

Puede tener hilos hijos y bloquearse a la espera de un system call. Si se bloquea un hilo, puede ejecutarse otro
hilo. Si se hace swapping del proceso, será acompañado por sus hilos. Al terminar un proceso, terminan todos
sus hilo

Ventajas de la programación multithreading

5
● La comunicación entre procesos independientes requiere la intervención del núcleo para ofrecer
protección y proporcionar los mecanismos necesarios para la comunicación. Pero como los hilos de un
mismo procesos comparten memoria y archivos, pueden comunicarse sin invocar al núcleo.
● Capacidad de respuesta: En una aplicación interactiva permite que el programa continúe ejecutándose
incluso aunque parte de él esté bloqueado o realizando una operación muy larga, lo que incrementa la
capacidad de respuesta al usuario.
● Compartición de recursos: Las hebras comparten memoria y los recursos del proceso al que pertenecen.
La ventaja de compartir código y datos es que permite que una aplicación tenga varias hebras de
actividad diferentes dentro del mismo espacio de direcciones.
● Economía: Dado de que las hebras comparten recursos del proceso al que pertenecen, se consume
mucho más tiempo en crear y gestionar procesos que hebras y desconocidas para el kernel
● Utilización sobre arquitecturas multiprocesador: Las hebras pueden ejecutarse en los distintos
procesadores. Las mecanismos multithreading en una máquinas con varias CPU incrementan el grado de
concurrencia.

Tipos de threads

Threads de usuario (UTL) : El soporte de estos threads se realiza a nivel de usuario, por lo que la
aplicación se encarga de la gestión.(Son visibles para el programador)

Ventajas:
● Intercambio entre hilos: No interviene el núcleo en el intercambio de hilos (las estructuras de datos
están todas dentro del espacio de direcciones del proceso)
● Planificación independiente: Se puede planificar la ejecución de los hilos dentro de cada proceso
como se prefiera (prioridades, RR). O sea: cada proceso administra sus hilos como le
convenga al programador, aunque use una planificación distinta de la que usa el kernel para los
procesos
● Portabilidad (no depende del SO multithreading) Un paquete de hilos de nivel usuario puede
implementarse en un sistema operativo que no acepte hilos
Desventajas
● Bloqueo del proceso durante una System Call
● No se puede multiplexar en distintos procesadores: En un ambiente multi procesador, cada
procesador ejecuta un proceso. Por lo tanto no voy a poder aprovechar la potencialidad de estos
ambientes y los hilos de un proceso usarán un único procesador (no se puede implementar una
concurrencia entre los hilos de un mismo proceso ejecutándose paralelamente entre los distintos
procesadores).
● No hay protección entre hilos: Los hilos no son independientes entre ellos, pues pueden acceder a
cualquier dirección dentro de la tarea, y un hilo puede leer o escribir en el stack de otro

Threads del kernel (KLT): El kernel se encarga de la gestión y planificación. La aplicación gestiona el hilo
a través de una API. Existen un conjunto de system calls similar a la de los procesos específicos para
hilos).

El kernel mantiene información del proceso en general y de cada hilo del proceso en particular. La
planificación la hace el kernel en base a los hilos.

6
Ventajas
● Se puede multiplexar el proceso en distintos procesadores
● Independencia de bloqueos entre Threads de un mismo proceso

Desventajas
● Cambios de modo de ejecución en el switch entre hilos del mismo proceso
● La creación y administración de los KLTs es más lenta que los ULTs porque el pase del control
entre hilos de un mismo proceso necesita un cambio de modo.

Modelos multihilos

Como algunos sistemas proveen tanto KLT como ULT, tenemos diferentes modelos multihilo:

Ventaja Desventaja

Muchos a uno (N:1) Eficiencia.La gestión de threads se El proceso completo se bloquea si


hace mediante a bibliotecas de una hebra realiza una llamada
threads en el espacio de usuario. bloqueante al sistema.
Asigna múltiples threads del nivel
de usuario a un thread de nivel de Dado que sólo un thread puede
acceder al kernel cada vez, no
kernel
podrán ejecutarse varios threads
sobre varios procesadores.

Modelo uno a uno (1:1) Proporciona mayor concurrencia Crear un UTL corresponde crear un
que (N:1) permitiendo que se KLT. La carga de trabajo en la
Asigna cada thread de usuario a un ejecute otro thread cuando uno creación de hebras puede
thread del kernel hace una llamada bloqueante al repercutir en el rendimiento de la
sistema; también permite que se aplicación . Muchas
ejecuten múltiples threads en implementaciones restringen el
paralelos sobre distintos número de threads soportados por
procesadores el sistema.

Modelo muchos a muchos (N:N) Los desarrolladores pueden crear


tantos UTL como sean necesarios
Multiplexa muchos UTL sobre un y los correspondientes KLT pueden
número menor o igual de KLT ejecutarse en paralelo en un
multiprocesador.
Cuando un thread realiza una
llamada bloqueante al sistema, el
kernel puede planificar otra hebra
para su ejecución

Combinación entre N:N y 1:1

7
En un esquema de ULT puro (modelo N:1) indique qué funcionalidades mínimas debería incluir la
biblioteca de hilos para operar.

1. Llamadas al sistema fork() y exec()


2. Cancelación
Terminar una hebra antes de que se haya completado. Puede ser:
Sincrónica: Una determinada hebra hace que termine inmediatamente la hebra objetivo. Puede
hacer que no se libere un recurso del sistema que sea necesario para otras.
Diferida: La hebra objetivo comprueba periódicamente si debe terminar, lo que proporciona una
oportunidad de terminar por sí misma de una forma ordenada.
3. Tratamientos de señales.
Señal: se utilizan para notificar a un proceso que se ha producido un determinado suceso. Una señal
puede recibirse de manera:
Síncrona: La señal se proporciona al mismo proceso que realizó la operación. Ej: División por cero
Asíncrona: La señal se genera por un suceso externo al proceso en ejecución que recibe la señal. Ej:
<CRL> + <C>

Comunicación y Sincronización

La comunicación entre procesos se produce compartiendo información entre sí.

Condiciones de carrera: Se da cuando dos o más procesos intentan leer y escribir sobre recursos compartidos
y el resultado final depende de quién y cuándo se ejecuta.

Ejemplo:

Sección crítica

Conocemos como sección crítica a la sección del código en donde los procesos acceden a los recursos
compartidos.

La clave para evitar las condiciones de carrera entre procesos que comparten recursos es evitar que ejecuten su
sección crítica al mismo tiempo.

Ejemplos de secciones críticas que se pueden encontrar en un SO:

Condiciones para la exclusión entre procesos:

1. Exclusión Mutua: No puede haber más de un proceso dentro de su SC.


2. No pueden hacerse suposiciones acerca de las velocidades o el número de CPUs.
3. Ningún proceso que se ejecute fuera de su SC puede bloquear a otro.

8
4. Ningún proceso tiene que esperar para siempre para entrar a su SC.

La solución al problema de la SC debe satisfacer:

1. Exclusión mútua
2. Continuidad
3. Espera limitada

Exclusión Mutua:A lo sumo un proceso está en su SC


Ausencia de Deadlock(Livelock):si 2 o más procesos tratan de entrar a sus SC (y está libre),al menos uno
tendrá éxito.
Ausencia de Demora Innecesaria: si un proceso trata de entrar a su SC y los otros están en sus SNC o
terminaron, el primero no está impedido de entrar a su SC.
Eventual Entrada: un proceso que intenta entrar a su SC tiene posibilidades de hacerlo(eventualmente lo hará)

Soluciones por software

1) Variables lock

● Considere tener una sola variable compartida (de candado) que al principio es 0.
● Un 0 significa que ningún proceso está en su región crítica y un 1 significa que algún proceso está en su
región crítica.
● Cuando un proceso desea entrar a su región crítica primero evalúa el candado. Si este candado es 0, el
proceso lo fija en 1 y entra a la región crítica. Si el candado ya es 1 sólo espera hasta que el candado se
haga 0

Problema: Suponga que un proceso lee el candado y ve que es 0. Antes de que pueda fijar el candado a
1, otro proceso se planifica para ejecutarse y fija el candado a 1. Cuando el primer proceso
se ejecuta de nuevo, también fija el candado a 1 y por lo tanto dos procesos se encontrarán en sus
regiones críticas al mismo tiempo

2) Alternancia estricta

9
La variable entera turno (que al principio es 0) lleva la cuenta acerca de a qué proceso le toca entrar a su
región crítica y examinar o actualizar la memoria compartida. Al principio, el proceso 0 inspecciona turno,
descubre que es 0 y entra a su región crítica. El proceso 1 también descubre que es 0 y por lo tanto se
queda en un ciclo estrecho, evaluando turno en forma continua para ver cuándo se convierte en 1.

Espera ocupada: Acción de evaluar en forma continua una variable hasta que aparezca cierto valor.Por
lo general se debe evitar, ya que desperdicia tiempo de la CPU.

Problema
Dependencia de la velocidad de los procesadores: Los problemas comienzan cuando los dos procesos
corren en distintos procesadores uno más rápido que otro. Un proceso puede estar siendo bloqueado por
el otro cuando ese proceso no está en su región crítica. Ya que puede darse el caso que el P0 ya esté
listo para ejecutar su SC pero que no pueda hacerlo debido a que P1, al estar ejecutándose en un
procesador más lento, todavía no ejecutó su SC por lo tanto no habilitó el turno para que P0 se ejecute.

3) Solución de Peterson

Antes de utilizar las variables compartidas (es decir, antes de entrar a su región crítica), cada
proceso llama a entrar_region con su propio número de proceso (0 o 1) como parámetro. Esta llamada
hará que espere, si es necesario, hasta que sea seguro entrar. Una vez que haya terminado con las

10
variables compartidas, el proceso llama a salir_region para indicar que ha terminado y permitir que los
demás procesos entren, si así lo desea.
Veamos cómo funciona esta solución. Al principio ningún proceso se encuentra en su región crítica. Ahora
el proceso 0 llama a entrar_region. Indica su interés estableciendo su elemento del arreglo y fija turno a 0.
Como el proceso 1 no está interesado, entrar_region regresa de inmediato.
Si ahora el proceso 1 hace una llamada a entrar_region, se quedará ahí hasta que interesado[0] sea
FALSE, un evento que sólo ocurre cuando el proceso 0 llama a salir_region para salir de la región
crítica.
Ahora considere el caso en el que ambos procesos llaman a entrar_region casi en forma simultánea.
Ambos almacenarán su número de proceso en turno. Cualquier almacenamiento que se haya realizado al
último es el que cuenta; el primero se sobrescribe y se pierde. Suponga que el proceso 1 almacena al
último, por lo que turno es 1. Cuando ambos procesos llegan a la instrucción while, el proceso 0 la ejecuta
0 veces y entra a su región crítica. El proceso 1 itera y no entra a su región crítica sino hasta que el
proceso 0 sale de su región crítica.

Problema: Para dos procesos es simple , se convierte a inmanejable cuando el número de procesos
aumenta

Soluciones por hardware

1) Deshabilitar interrupciones (aka elevar el nivel de procesador)

Cada proceso deshabilita todas las interrupciones justo después de entrar a su región crítica y las
rehabilita justo después de salir.

Con las interrupciones deshabilitadas, no pueden ocurrir interrupciones de reloj. Después de todo, la CPU
sólo se conmuta de un proceso a otro como resultado de una interrupción del reloj o de otro tipo, y con las
interrupciones desactivadas la CPU no se conmutará a otro proceso. Por ende, una vez que un proceso
ha deshabilitado las interrupciones, puede examinar y actualizar la memoria compartida sin temor de que
algún otro proceso intervenga.

Problemas:
● Peligroso: Darle a un proceso el poder de deshabilitar las interrupciones corriendo el riesgo de que
este nunca las vuelva a activar.
● Solo para sistemas monoprocesador: Al deshabilitar las interrupciones sólo se ve afectada la CPU
que ejecutó la instrucción disable. Las demás continuarán ejecutándose y pueden acceder a la
memoria compartida.

En ocasiones es conveniente para kernel deshabilitar las interrupciones por unas cuantas instrucciones
mientras actualiza variables o listas. Por ejemplo, si ocurriera una interrupción mientras la lista de
procesos se encuentra en un estado inconsistente, podrían producirse condiciones de carrera.

Conclusión
A menudo deshabilitar interrupciones es una técnica útil dentro del mismo sistema operativo, pero no es
apropiada como mecanismo de exclusión mutua general para los procesos de usuario.

11
2) Instrucción TSL/Test and set lock
Se Utiliza junto con spinlock para asegurar la atomicidad cuando modificó la variable candado
A diferencia de elevar el nivel del procesador, esta solución se puede utilizar junto con spinlock en
sistemas multiprocesadores ya que se bloquea el bus.

La instrucción TSL es una instrucción especial implementada por hardware la cual asegura que su
ejecución es atómica . La CPU que ejecuta la instrucción TSL bloquea el bus de memoria para impedir
que otras CPUs accedan a la memoria hasta que termine. Es importante observar que bloquear el bus de
memoria es una acción muy distinta de la de deshabilitar las interrupciones. Al deshabilitar las
interrupciones y después realizar una operación de lectura en una palabra de memoria, seguida de una
operación de escritura, no se evita que un segundo procesador en el bus acceda a la palabra entre la
lectura y la escritura. De hecho, si se deshabilitan las interrupciones en el procesador 1 no se produce
efecto alguno en el procesador 2. La única forma de mantener el procesador 2 fuera de la memoria hasta
que el procesador 1 termine es bloquear el bus, para lo cual se requiere una herramienta de hardware
especial (básicamente, una línea de bus que afirme que el bus está bloqueado y no disponible para los
demás procesadores aparte del que lo bloqueó).

Funcionamiento

Para usar la instrucción TSL necesitamos una variable compartida (candado) que coordine el acceso a la
memoria compartida. Cuando candado es false, cualquier proceso lo puede fijar en true mediante el uso
de la instrucción TSL y después una lectura o escritura en la memoria compartida. Cuando termina, el
proceso establece candado de vuelta a false.

La primera instrucción copia el antiguo valor de candado en el registro y después fija el candado a true.
Después, el valor anterior se compara, si es true sigue esperando hasta que este se libere. Si es true, el
candado ya estaba cerrado, por lo que el programa sólo regresa al principio y lo vuelve a evaluar. Tarde o
temprano se volverá false (cuando el proceso que esté actualmente en su región crítica se salga de ella) y
la subrutina regresará, con el bloqueo establecido. Es muy simple quitar el bloqueo. El programa sólo
almacena un false en candado. No se necesitan instrucciones especiales de sincronización.

12
Problema

● Contención del bus: Los procesos que están a la espera que se desbloquee la variable lock están
constantemente ejecutando la instrucción TSL/ SWAP por lo tanto constantemente están
bloqueando el bus ,además el proceso que ganó el acceso a la sección crítica también compite
por el bus pero para poder ejecutar las instrucciones de su SC

● Consistencia de la caché: Como la variable lock se escribe constantemente escribiendo , se tiene


que sincronizar la memoria con todas las caches de los procesadores

Solución: (TEST AND TEST AND SET) se agrega un while adicional preguntando si lo puede
tomar, si lo puede tomar intenta, aunque varios intenten tomarlo al mismo tiempo solo uno lo va a
lograr los que no logren tomar vuelven al while anterior.

CUIDADO porque el problema de las interrupciones sigue presente:

Supongamos que el disco tiene una cola de procesos esperando para acceder a ese dispositivo y
hay un proceso P1 en ejecución que hace una llamada al sistema read() y mientras el disco le
devuelve los datos, P1 es encolado en la cola de espera del disco. Si tenemos más de un
procesador puede darse el caso que varios procesos que se estén ejecutando también quieran
leer del disco, por lo tanto se debe proteger la cola de espera del disco con un spinlock. Mientras
se toma el spinlock para encolar a un proceso en la cola puede llegar una interrupción del disco
avisando que los datos que pidió P1 ya están listos, el problema es que esa interrupción también
accede a la misma estructura de datos para desencolar a P1 por lo que no se estaría
solucionando el problema de la SC porque no hay exclusión mutua.

Si en el SO existe una estructura que proteger y por la que se puede acceder por dos orígenes
(llamada al sistema e interrupción) el spinlock solo no sirve.

Debemos tener en cuenta que el SO utiliza spinlock cuando se estima que la espera activa que
hacen los procesos hasta que ganan acceso a la SC es menor al cambio de contexto que se da
cuando por ejemplo utilizamos un semáforo.

3) Instrucción xchg/swap

Es una instrucción que intercambia dos registros sin necesidad de usar una variable temporal,
convirtiendo la acción en atómica y evitando así el problema de la sección crítica. Al igual que Test and
set, evalúa y asigna la variable lock evitando problemas de interferencia.

Problema de inversión de prioridades:

13
Tanto la solución de Peterson como las soluciones mediante TSL o XCHG son correctas, pero todas tienen el
defecto de requerir la espera ocupada. En esencia, estas soluciones comprueban si se permite la entrada cuando
un proceso desea entrar a su región crítica. Si no se permite, el proceso sólo espera en un ciclo estrecho hasta
que se permita la entrada.

Este método no sólo desperdicia tiempo de la CPU, sino que también puede tener efectos inesperados.
Considere una computadora con dos procesos:

● H con prioridad alta y L con prioridad baja.


● Las reglas de planificación son tales que H se ejecuta cada vez que se encuentra en el estado listo.
● En cierto momento, con L en su región crítica, H cambia al estado listo para ejecutarse (por ejemplo,
cuando se completa una operación de E/S). Entonces H empieza la espera ocupada, pero como L nunca
se planifica mientras H está en ejecución, L nunca tiene la oportunidad de salir de su
región crítica, por lo que H itera en forma indefinida.

Sección crítica en el kernel

interrupciones (no funcionan para multiprocesadores /peligroso)


-> Spin lock - espera ocupada . Se utiliza instrucciones como TSL/swap para modificar la variable
lock de manera atómica (se puede utilizar en el caso el tiempo de retención de la Sc sea breve
comparado con el cambio de contexto EJ implementación de los métodos P y V de semáforos )

Útiles para el uso del kernel.

14
es común combinar spin locks con la inhabilitación de interrupciones para garantizar que el
proceso que tome el spinlock no sea interrumpido mientras está en su SC (ej por un proceso con mayor
prioridad)

Intercomunicación entre procesos (IPC)

Mecanismo para sincronizar y comunicar procesos

Consta con las siguientes herramientas para los procesos de usuario:

● Pasaje de mensajes
● Memoria compartida
● Semáforos

Pasaje de mensajes

- Provee dos operaciones: send y receive.


- Se establece un link de comunicación entre los procesos que se quieren comunicar
- Ese link puede ser unidireccional o bidireccional, simétrico o asimétrico.
- La operación send puede ser por copia o por referencia; los mensajes de medida fija o variable.

Comunicación directa: Cada proceso que quiere comunicarse con otro explícitamente nombra a quien envía o
de quien recibe el mensaje.

Send (P, mensaje) Envía un mensaje al proceso P

Receive (Q, mensaje) Recibe un mensaje desde el proceso Q

Comunicación indirecta: Se usa un mailbox o port

Un mailbox puede verse como un objeto donde se ponen y se sacan mensajes. Cada mailbox tiene una
identificación única.

Send (A, mensaje) Envía un mensaje al mailbox A

Receive (A, mensaje) Recibe un mensaje desde el mailbox A

En este método de comunicación el sistema operativo debe proveer un mecanismo para que un proceso
pueda manejar los mailboxes (creación, destrucción , compartir y enviar/recibir mensajes)

15
Capacidad del Link: ¿Cuántos mensajes puede mantener el link?

Cero: no puede haber mensajes esperando. Es lo que se llama Rendezvous: el emisor debe esperar que el
receptor reciba el mensaje para poder mandar otro. Hay sincronismo.
Capacidad limitada: la cola tiene una longitud finita
Capacidad ilimitada: tiene una longitud “infinita”. El emisor nunca espera.

Naming indirecto

El mailbox puede ser propiedad del proceso o del sistema.

Propiedad del proceso:


● Está definido como parte de él o asignado directamente a él.
● Dueño del mailbox es el que recibe mensajes a través de él
● Usuario es quien envía los mensajes a ese mailbox.

Propiedad del SO:


● Es independiente: No es propiedad de ningún proceso en particular.
● El sistema operativo provee mecanismos para: Enviar y recibir mensajes a través del mailbox y
Crear y destruir mailbox

Interbloqueos

Definición: Un conjunto de procesos están en deadlock cuando cada uno de ellos está esperando por un
recurso que está siendo usado por otro proceso del mismo conjunto.

Ejemplos:

Un proceso A pide un scanner. Un proceso B pide una grabadora de CD. El proceso A pide ahora la grabadora y
el B quiere el scanner.

En una BD: un proceso A bloquea el registro R1, y el B el registro R2. Luego cada proceso trata de bloquear el
registro que está usando el otro

Recursos apropiativos: se le puede quitar al proceso sin efectos dañinos (ej: memoria).
Recursos no apropiativos: si se le saca al proceso, éste falla (interrumpir una escritura a CD).

Condiciones para que se cumpla deadlock:

1. Exclusión mutua: El acceso al recurso compartido debe hacerse de a un proceso por vez.
2. Retención y espera: Los procesos pueden solicitar el acceso a un nuevo recurso sin liberar el que tiene en
su poder.
3. No apropiación: No se le puede quitar un recurso a un proceso, este debe liberarlo voluntariamente.
16
4. Espera circular: Debe haber una cadena circular entre dos o más procesos, donde cada uno espera por
un acceso de un recurso que tiene el siguiente proceso.

Tratamiento de deadlock:

1. Usar un protocolo que asegure que nunca se entrará en un estado de deadlock

a. Prevenir

Que por lo menos una de las condiciones no pueda mantenerse. Imponiendo restricciones en la
forma en que los procesos REQUIEREN los recursos.

Exclusión Mutua:

- Si ningún recurso se asignara de manera exclusiva, no habría interbloqueo


- El problema es que hay recursos que solo pueden ser accedidos de manera
exclusiva (no son compatibles). Ej: impresora. Por lo que se podría hacer es
abstraer el recurso con otro proceso para tratar de evitar la exclusión mutua ya que
un. Este proceso “simula” que recibe pedidos y que puede mandar a imprimir
simultáneamente pero internamente maneja una cola de espera. Al haber solo un
proceso intentando acceder a la impresora nunca se va a generar deadlock
- Se debe tener en cuenta que esto no siempre es posible por lo que se debe
mantener la exclusión mútua para los recursos no compartibles.

Retención y espera:

- Si un proceso requiere un recurso, debe liberar otros.


- Otra alternativa sería: un proceso debe requerir y reservar todos los recursos antes
de arrancar la ejecución. Y solo puede requerir recursos cuando no tiene ninguno.

Desventajas:
● Baja utilización de los recursos: Una vez que obtiene todos los recursos que
necesita, no significa que los vaya a utilizar inmediatamente a todos.
● Posibilidad de iniciación de procesos
No apropiación:

- No siempre es posible apropiar un recurso. Ej CDs


- Si un proceso solicita un recurso y este no puede obtenerlo, el proceso queda en wait y se
liberan todos los otros recursos que tiene en su poder. Y el proceso ahora esperará por
todos sus recursos
Alternativa para recursos apropiativos:
- Si un proceso requiere un recurso que no está disponible, todos los recursos que tiene
asignado ese proceso son apropiados y se bloquea el proceso. Se desbloquea cuando el
recurso pedido y los que tenía están nuevamente disponibles.
- Si un proceso requiere un recurso que no está disponible, el sistema chequea si ese
recurso lo tiene asignado un proceso que esté bloqueado a la espera de otro recurso. Si es

17
así, el recurso es apropiado del proceso bloqueado y asignado al solicitante. Si no es así,
el proceso solicitante es bloqueado hasta que el recurso esté disponible.

Espera circular:

- Se define un ordenamiento de los recursos. Luego, un proceso puede requerir recursos en


un orden numérico ascendente
- Existe una función F() donde dado un recurso devuelve un número único. Los números
más chicos son para recursos más utilizados
- Un recurso solo puede pedir recursos cuyo valor devuelto por F() sea mayor

b. Evitar

Asignar cuidadosamente los recursos, manteniendo información actualizada sobre requerimiento y


uso de recursos.

Trata de ir controlando los pedidos de los recursos para decidir si un pedido se puede satisfacer o
no, se fija si se puede llegar a dar deadlock o no.

El SO tiene que tener información en todo momento de qué es lo que va a requerir un proceso.

Desventaja: Es degradante para la CPU, para cada pedido tiene que controlar y analizar si es safe
hacerlo.

Estado seguro:
Un sistema está en un estado seguro (con respecto a la ausencia de deadlock) si se pueden
asignar recursos a cada proceso de un conjunto de alguna manera, evitando el deadlock.

- Debe haber una secuencia de procesos <P0, P1 , , Pn >, que puedan ejecutarse con los
recursos disponibles sin que haya deadlock.
- <P0, P1 , , Pn > se le llama cadena segura
- Si no se puede construir esta secuencia, el estado del sistema es inseguro

Importante:

- Un estado seguro garantiza que no hay deadlock.


- Un estado de deadlock, es un estado inseguro.
- Pero... no todos los estados inseguros son deadlock.

2. Permitir el estado de deadlock y luego recuperar.

Para esta técnica se necesita dos tipos de algoritmos:

● Algoritmo que examine si ocurrió un deadlock

18
Con recursos con una sola instancia: Análisis del grafo de asignación
Con recursos de varias instancias: Algoritmo del Banquero

● Algoritmo para recuperación del deadlock

Recuperación por medio de apropiación

- En algunos caso se puede requerir intervención “manual” (por operador)


- Automáticamente:
- Abortando todos o algunos procesos o hasta que el ciclo desaparezca.
- Sacándole recursos a procesos.

La elección de procesos víctimas depende en gran parte de la naturaleza del


recurso.
Rollback:

- Los procesos hacen puntos de comprobación de forma periódica: su estado (memoria y


recursos asignados) se escribe en un archivo para poder reiniciarlo más tarde.
- Cuando se detecta un interbloqueo, es fácil ver cuáles recursos se necesitan. El proceso se
restablece a un momento anterior en el que no tenía el recurso, que ahora se asigna a
uno de los procesos en interbloqueo.
- Para poder retroceder un proceso consistentemente el SO debe saber qué hizo el proceso
durante el tiempo que estuvo ejecutando, esto se logra mediante los puntos de chequeo.
- No siempre es posible llevarse a cabo.

Pasos en recuperación con rollback


1. Detectar el interbloqueo
2. Detectar recursos que se solicitan
3. Detectar qué procesos tienen esos recursos
4. Volver atrás antes de la adquisición del recurso (check points anteriores)
5. Asignación del recurso a otro proceso

Criterios para elegir proceso “víctima”

- Menor cantidad de tiempo de CPU consumido hasta el momento.


- Mayor tiempo restante estimado.
- Menor cantidad de recursos asignados hasta ahora.
- Prioridad más baja.

Ideal: Elegir un proceso que se pueda volver a ejecutar sin problemas (una compilación,
por ejemplo)

3. Ignorar el problema y esperar que nunca ocurra un deadlock

19
Multiprocesadores

1. Multiprocesadores con Memoria Compartida

- Dos o más CPU comparten el acceso a la RAM


- Los programas se ejecutan en cualquier CPU
- Cada proceso “ve” un espacio normal de direcciones virtuales

Cada procesador puede direccionar toda la memoria

Velocidad de Acceso

- UMA (Uniform Memory Access)

- CPUs y memoria utilizan el mismo bus para comunicarse


- Cada CPU espera que el bus NO esté ocupado para leer o escribir de la memoria.
- Problema con la contención del bus
Manejable con pocas CPUs
Con muchas CPUs la mayoría estará inactiva mucho tiempo

Soluciones:

Caches, Solución al problema de la contención del bus

Pros: Menor tráfico en el bus, lecturas desde la caché local


Contra: Necesidad de sincronización de las caché al escribir una palabra Copias
“limpias” vs. Copias “sucias”

Memorias privadas.

Memoria compartida se usaría solo para comunicación y sincronización


Contra: Necesidad de trabajo del compilador. Necesitaría que el compilador le deje
marcas para saber qué poner en la memoria privada y que en la compartida

Otras arquitecturas:

20
● Interruptores de barras cruzadas
● Redes de conmutación multi-etapa

Ambas arquitecturas están pensadas para solucionar el problema de la contención


del bus.
En vez de tener un sólo bus para acceder a la memória tienen N conecciones entre
la CPU y la memoria

- NUMA (Non-uniform memory Access)

● La memoria compartida es físicamente distribuida a todos los procesadores, llamada


memorias locales.
● La colección de todas las memorias locales forma un espacio de la direcciones global
accesible por todos los procesadores.
● Es más lento acceder a la memoria remota atada a otros procesadores debido al retraso
agregado por la red de interconexión
● Se mantienen “directorios de cache” para saber en qué nodo se encuentra la línea de
caché

Tipos de sistemas operativos multiprocesador

1. Cada CPU tiene su propio sistema operativo

21
- Las n CPUs operan entonces como n computadoras independientes
- Todas las CPUs comparten el código del sistema operativo.
- Cada CPU tiene copias privadas sólo de las estructuras de datos del sistema
operativo.
- Cada CPU atrapa las SysCalls de sus procesos
- Cada CPU cuenta con su propio conjunto de procesos (Desbalance en la carga de
trabajo)
- No se pueden compartir páginas
- Caché de disco, cada CPU tiene su propia copia (Inconsistencia de la información)

2. Maestro/ Esclavo

- Hay una CPU que cumple el rol de “maestro” , el cual:


- Es el único que tiene la copia del SO y de sus estructuras de datos.
- Procesa todas las System calls
- Puede ejecutar procesos de usuarios si le sobra tiempo

- Cuando una CPU está inactiva, pide al sistema operativo en la CPU maestro un
proceso para ejecutarlo, y se le asigna uno

Pros: Resuelve el problema de desbalance de carga del modelo anterior


Contra: El procesador maestro se puede volver un cuello de botella al haber
muchas CPUs
3. Multiprocesadores simétricos (SMP)

22
- Única copia del SO en memoria. Cada CPU puede ejecutarlo.
- Cuando se hace una llamada al sistema, la CPU en la que se hizo la llamada al
sistema atrapa para el kernel y procesa la llamada al sistema
- Pros:
- Hay un equilibrio entre los procesos y la memoria en forma dinámica, ya que
sólo hay un conjunto de tablas del sistema operativo.
- Elimina el cuello de botella de la CPU
- Contra:
- Dos o más CPUs ejecutando código del SO en un mismo instante de tiempo.
- Dos CPUs podrían estar seleccionando el mismo proceso para ejecutar

Solución
- Utilizar “locks” para las estructuras del SO
- Todo el SO como una gran sección crítica
- Se comportaría como el modelo maestro-esclavo
- Lock por estructura(s) (varias secciones críticas)
- Mejora el rendimiento
- Dificultad para determinar cada sección crítica
- Acceso a más de una SC, problemas de Deadlocks

Características particulares en SO multiprocesadores con memoria compartida:

Sincronización:

- Necesidad de contar con operaciones atómicas – TSL.


- En multiprocesadores TSL tiene que bloquear el bus
- Problema con el Spin-lock
- Sobrecarga en el bloqueo del bus y la memoria evaluando el “lock”
- El uso de caché (para evitar el bus) también genera problemas
- TSL siempre modifica la palabra
- Se invalidan las caches (trashing)

23
- Solución evaluar el valor (solo lectura) del lock antes de TSL (test and test and set)

Otras soluciones
- Agregar “delays” entre cada intento de TSL
- La CPU que no puede obtener el bloqueo se agrega a una lista y espera en
su propio lock

Planificación:

Sistemas monoprocesador vs multiprocesador

En un uniprocesador, la planificación es de una dimensión. La única pregunta que hay que


responder (repetidas veces) es: “¿Cuál hilo se debe ejecutar a continuación?”

En un multiprocesador, la planificación tiene dos dimensiones: el planificador tiene que


decidir qué hilo ejecutar y en cuál CPU lo va a ejecutar.

Otro factor que complica las cosas es que, en ciertos sistemas, ninguno de los hilos está
relacionado, mientras que en otros se dividen en grupos donde todos pertenecen a la
misma aplicación y trabajan en conjunto

Planificación de hilos independientes:

- Planificación más simple: una sola estructura de datos compartida por todas las
CPUs

Pros:
- Proporciona un balance automático de la carga, ya que no puede haber una CPU
inactiva mientras otras están sobrecargadas.
Contra:
- Potencial contención por la estructura de datos a medida que la cantidad de CPUs
aumenta
24
- Sobrecarga al realizar un cambio de contexto, cuando un hilo se bloquea.
- Problemas con la espera activa:
Si un hilo contiene un bloqueo de espera activa al momento en que expira su
quantum. Las otras CPUs que esperan a que se libere el bloqueo de espera activa
sólo desperdician su tiempo en una espera activa hasta que se vuelve a programar
ese hilo y se libera el bloqueo

Para solucionar estos problemas:

Planificación inteligente: No expulsar procesos que marcan el uso de una espera activa
(mediante el uso de un flag o nivel de interrupción)

Planificación por afinidad: Hacer que un hilo se ejecute en la misma CPU en que se ejecutó
la última vez ya que hay mayor posibilidad de que sus datos aún sigan en la caché de
dicha CPU.

¿Cómo se puede implementar esto? Mediante el uso de un algoritmo de planificación de


dos niveles:

- Cuando se crea un hilo, éste se asigna a una CPU.


- Cada CPU planifica por separado, mediante el uso de prioridades o de algún otro
medio.
- Si una CPU no tiene hilos que ejecutar, obtiene uno de otra CPU en vez de quedar
inactiva

Pros:
- Distribución de carga entre las CPUs.
- Aprovecha la afinidad del caché.
- Al dar a cada CPU su propia lista de hilos listos se minimiza la contención
por estas listas, ya que es muy poco frecuente que una CPU intente utilizar
la lista de hilos listos de otra CPU.

Planificación de hilos que trabajan en conjunto:

- Para hilos que están relacionados la planificación se hace en grupo. Cuando se


compite por CPUs lo hacen todos juntos y se ejecutan todos al mismo tiempo en
distintas CPUs.
- Mejora en trabajos en paralelo.
- El grupo se planifica si hay CPUs libres para cada hilo del grupo.

2. Multicomputadora con paso de mensajes: Fuertemente acoplados (clusters)

Multicomputadoras: CPUs con acoplamiento fuerte que no comparten memoria.


Aka: Clúster de computadoras y COWS (Clusters of Workstations, Clusters de estaciones de trabajo)

25
3. Sistemas Distribuidos: Débilmente acoplado

- Cada nodo tiene su propia memoria privada


- Menor acoplamiento: Se pueden encontrar esparcidos por todo el mundo
- Cada nodo es una PC completa (Incluyendo dispositivos)
- Cada nodo puede ejecutar un SO diferente (Incluyendo su propio sistemas de archivos)

El SO no tiene mucha participación en los sistemas distribuidos porque aparece el middleware.

Middleware: Capa de software por encima del SO que permite una uniformidad entre los distintos SOs.
Provee estructuras de datos y operaciones que permiten a los procesos y usuarios inter-operar, de
manera consistente, entre máquinas remotas.

Ejemplo: La máquina de DIos, universidades ofrecen su capacidad de cómputo para los cálculos.

Protección y Seguridad

Protección: Son mecanismos específicos del SO para cuidar la información dentro de la computadora,
para controlar el acceso a los recursos existentes.

Seguridad: Es un término más general, se refiere a la ausencia de riesgo.

● Pérdida Accidental de Datos


● Intrusos

Políticas y Mecanismos

Las políticas definen lo que quiero hacer, en base a mis objetivos.


Los mecanismos definen cómo lo hago.

Objetos y Dominios

Los objetos tienen un identificador único. Los procesos pueden realizar un conjunto finito de operaciones
sobre los objetos.

Un dominio es un conjunto de (objetos,derechos). Cada par especifica un objeto y un subconjunto de


operaciones que se pueden realizar con él.

Un derecho es la autorización para realizar las operaciones.

Ejemplo:

26
Dominio D = (Archivo A, {read,write})

Un proceso que se ejecuta dentro del dominio D puede leer y grabar el archivo A.

El dominio puede pertenecer a un usuario: qué puede hacer y que no, ese usuario.

Matriz de acceso

- Controla la pertenencia de objetos a dominios y sus derechos


- Cada elemento access(i,j) representa el conjunto de operaciones (derechos) que un proceso puede
invocar en un objeto Oj dentro del dominio Di.
- Implementa las políticas de protección/seguridad de un sistema

Operaciones:

1. Switch
a. Indica que un proceso ejecutándose en ese dominio puede cambiarse a otro dominio.
b. La matriz en sí es un objeto que puede ser modificado.
c. Dominio y matriz son, a su vez, objetos.

2. Copy
a. Es un derecho que se asocia a un elemento access(dominio,objeto) de la matriz.
b. Indica que un proceso ejecutándose en ese dominio puede copiar los derechos de acceso
dentro de toda la columna (puede copiar los derechos de un objeto en un dominio a otro
dominio)
c. Se denota con *
27
Variantes de copy:

Transferencia: si un derecho se copia desde matriz(i,j) a matriz(k,j), el derecho desaparece para


matriz(i,j), o sea, el derecho fue transferido.
Propagación o copia limitada: Se copia el derecho pero no el derecho a copia en el nuevo (R* es
copiado como R, no como R*)

3. Owner

Si un elemento matriz(dominio,objeto) incluye en derecho owner entonces un proceso


ejecutándose en ese dominio puede cambiar cualquier derecho de acceso de ese objeto en
cualquier dominio

4. Control
a. Indica que pueden modificarse y borrarse derechos dentro de una fila.

28
b. La operación control es aplicable sólo a dominios.
c. Si el elemento de la matriz(dominio[i],objeto[j]) incluye el derecho de control, entonces un
proceso ejecutándose en el dominio[i] puede remover cualquier derecho de acceso dentro
de la fila j.(dominio[j])

RESUMEN:

Copy, owner y control son operaciones que se utilizan para controlar cambios al contenido de la
matriz de acceso.
Switch y Control: son aplicables sólo a dominios.
Copy y owner: puede modificar derechos dentro de una columna.
Control: puede modificar derechos dentro de una fila

Implementación de la matriz de acceso

Puede tener muchos elementos vacíos


Se debe optimizar el acceso para que sea rápido.

Opciones:

Almacenar por filas


Almacenar por columnas

Alternativas:
- Tabla Global: la más simple. Consiste en conjunto de tuplas <dominio,objeto,
derechos-acceso>.

- Lista de Acceso por objetos

- Cada columna de la matriz se puede ver como una lista de acceso a un objeto
- Para cada objeto, hay una lista de pares ordenados <dominio, derechos>

29
- Se pueden definir listas + conjunto de derechos x defecto.

Objeto -> {<dominio,{derechos}>}

- Lista de Capacidades por Dominio

- Capacidad: Nombre del objeto


- Es una lista de objetos del dominio con sus derechos (división x filas)
- Esta lista es un objeto protegido, a la que sólo accede el sistema operativo.

Proceso -> {<objeto, {derechos}>}

Virtualización:

- Es una abstracción de los recursos de la computadora (HW) para obtener una mejor utilización de
los recursos y flexibilidad
30
- Oculta los detalles técnicos a través de la encapsulación.
- Cada MV tiene su propio conjunto de hardware virtual (RAM, CPU, NIC, etc.) sobre el cual se
carga el SO “guest”
- Esta tecnología permite que una sola computadora tenga varias máquinas virtuales, cada una de
las cuales puede ejecutar un SO distinto.

Ventajas:
- Aislamiento
- Ahorro de hardware y electricidad

Virtualización Emulación

Se trata de particionar un procesador físico en Provee todas la funcionalidad del procesador deseado
distintos contextos, donde cada uno de ellos corre a través de software.
sobre el mismo procesador.

Más rápida que la emulación

Ejemplos

- La máquina virtual de Java (virtualización a - Se emula una arquitectura de 64 bits en una


nivel de aplicación) máquina de 32 bits
- Puedo correr viejos programas DOS en un
Pentium

Situaciones
- Necesito simular redes de computadoras
independientes
- Tengo que correr aplicaciones heredadas
(legacy) que no pueden ejecutarse en nuevo
hw o SO

Hypervisor

Un hipervisor, conocido también como monitor de máquina virtual (VMM), es un software que crea y ejecuta
máquinas virtuales (VM) y que, además, aísla el sistema operativo y los recursos del hipervisor de las máquinas
virtuales, y permite crearlas y gestionarlas.
El hipervisor proporciona a cada máquina virtual los recursos que se le habían asignado, y gestiona la
programación de ellos en función de los recursos físicos.

Instrucciones sensibles: Instrucciones que se ejecutan en modo kernel.


Instrucciones Privilegiadas: Se ejecutan en modo usuario pero generan una excepción.

Hypervisor tipo 1

31
- El hipervisor de tipo 1, también conocido como hipervisor nativo o sin sistema operativo.
- Se ejecuta directamente en el hardware del host, en modo kernel.
- Gestiona los sistemas operativos guest. Ocupa el lugar de un sistema operativo host.
- Programa los recursos de las máquinas virtuales directamente en el hardware.
- Los SO guest se ejecutan en un modo kernel “virtual”, en realidad es modo usuario.

¿Qué ocurre cuando el sistema operativo (el cual cree que se encuentra en modo de kernel) ejecuta una
instrucción sensible (una que sólo se permite en modo de kernel)? En las CPUs sin VT, la instrucción falla y por lo
general también lo hace el sistema operativo.

En las CPUs con VT, cuando el sistema operativo invitado ejecuta una instrucción sensible se produce una
interrupción en el kernel. Así, el hipervisor puede inspeccionar la instrucción para ver si:
- El sistema operativo anfitrión la emitió en la máquina virtual: hace las preparaciones para que se ejecute
la instrucción.
- Fue un programa de usuario en la máquina virtual: Emula lo que haría el hardware real al confrontarlo
con una instrucción sensible que se ejecuta en modo de usuario. Si la máquina virtual no tiene VT, por lo
general la instrucción se ignora; si tiene VT, se atrapa en el sistema operativo invitado que se ejecuta en
la máquina virtual.

Si el hypervisor determina que la instrucción sensible la tienen que resolver el SO guest , porque él no
puede (llamado a una system call)

Una arquitectura es virtualizable si todas las instrucciones sensibles son privilegiadas

Hypervisor de tipo 2

32
- Se ejecuta en un sistema operativo convencional como una capa de software o una aplicación.
- Se ejecuta en modo usuario
- Arriba de él están los SO guests
- El SO host es quien se ejecuta sobre el HW
- Funcionan en CPUs no virtualizables:

¿Cómo hace para que funcione en CPUs no virtualizables?

1. Hace un análisis de las instrucciones previo a su ejecución y define lo que se llama bloques básicos de
instrucciones. Un bloque básico es una secuencia de instrucciones hasta que aparece una que altera el
flujo (que altera el PC ).
2. Analiza el código del bloque en busca de instrucciones sensibles ( instrucciones que en una CPU no
virtualizables se ignoran )
3. Reemplaza la instrucción sensible por un llamado a un procedimiento que hace un llamado al hypervisor
el cual emula las instrucciones.
4. Cachea ese bloque básico para que en la próxima ejecución no lo tenga que volver a analizar.

El verdadero HW NUNCA ejecuta las sensibles que emite el guest: las ejecuta como llamadas el
hypervisor

Traducción binaria: El hypervisor analiza el flujo de ejecución (bloques de código) y “traduce” las instrucciones
sensibles por llamadas al host

Hypervisor Tipo 1 Hypervisor Tipo 2

Todas las instrucciones sensibles generan una trap Todo el flujo de instrucciones debe ser traducido
que debe atender el hipervisor, debe haber un cambio (costo inicial alto) pero luego quedan en caché y no se
de contexto (arruina “localidad”, caché de CPU, TLBs, produce cambio de contexto al ejecutar una
predicción de bifurcación, etc) instrucción sensible

Paravirtualización:

- Se trata de tener SO guests modificados, para mejorar el rendimiento


- Cuando se quiere ejecutar una instrucción sensible, el SO guest la transforma en una llamada al
hypervisor.
- El SO guest es como un proceso de usuario que hace llamadas al SO (el hypervisor)
- El hypervisor cuenta con una API, que son un conjunto de llamadas a procedimientos.
- Los guests invocan estas llamadas.
- Habrá distintas bibliotecas para distintos hypervisores.
- El hypervisor se transforma en un microkernel

33

También podría gustarte