Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. Threads
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?
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.
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
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?
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
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.
Id
Estado de ejecución
Contador de programa
Estructura
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
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
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.
7
En un esquema de ULT puro (modelo N:1) indique qué funcionalidades mínimas debería incluir la
biblioteca de hilos para operar.
Comunicación y Sincronización
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.
8
4. Ningún proceso tiene que esperar para siempre para entrar a su SC.
1. Exclusión mútua
2. Continuidad
3. Espera limitada
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
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
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.
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.
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:
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)
● Pasaje de mensajes
● Memoria compartida
● Semáforos
Pasaje de mensajes
Comunicación directa: Cada proceso que quiere comunicarse con otro explícitamente nombra a quien envía o
de quien recibe el mensaje.
Un mailbox puede verse como un objeto donde se ponen y se sacan mensajes. Cada mailbox tiene una
identificación única.
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
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).
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:
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:
Retención y espera:
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:
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:
b. Evitar
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:
18
Con recursos con una sola instancia: Análisis del grafo de asignación
Con recursos de varias instancias: Algoritmo del Banquero
Ideal: Elegir un proceso que se pueda volver a ejecutar sin problemas (una compilación,
por ejemplo)
19
Multiprocesadores
Velocidad de Acceso
Soluciones:
Memorias privadas.
Otras arquitecturas:
20
● Interruptores de barras cruzadas
● Redes de conmutación multi-etapa
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
- Cuando una CPU está inactiva, pide al sistema operativo en la CPU maestro un
proceso para ejecutarlo, y se le asigna uno
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
Sincronización:
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:
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 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
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.
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.
25
3. Sistemas Distribuidos: Débilmente acoplado
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.
Políticas y Mecanismos
Objetos y Dominios
Los objetos tienen un identificador único. Los procesos pueden realizar un conjunto finito de operaciones
sobre los objetos.
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
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:
3. Owner
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
Opciones:
Alternativas:
- Tabla Global: la más simple. Consiste en conjunto de tuplas <dominio,objeto,
derechos-acceso>.
- 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.
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.
Ejemplos
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.
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)
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:
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
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:
33