RESUMEN UNIDAD 2 Sistemas Operativos
RESUMEN UNIDAD 2 Sistemas Operativos
RESUMEN UNIDAD 2 Sistemas Operativos
UNIDAD 2
ADMINISTRADOR DE PROCESOS Y DEL PROCESADOR
CONCEPTOS BASICOS:
Un proceso no es más que un programa en ejecución, e incluye los valores actuales del contador de programa, los registros
y las variables. Conceptualmente cada uno de estos procesos tiene su propia CPU virtual. Desde luego, en la realidad la
verdadera CPU conmuta de un proceso a otro.
Un proceso es un concepto manejado por el sistema operativo que consiste en el conjunto formado por:
Esta definición varía ligeramente en el caso de sistemas operativos multihilo, donde un proceso consta de uno o más hilos,
la memoria de trabajo (compartida por todos los hilos) y la información de planificación. Cada hilo consta de instrucciones y
estado de ejecución.
Los procesos son creados y destruidos por el sistema operativo, así como también este se debe hacer cargo de la
comunicación entre procesos, pero lo hace a petición de otros procesos. El mecanismo por el cual un proceso crea otro
proceso se denomina bifurcación (fork). Los nuevos procesos pueden ser independientes y no compartir el espacio de
memoria con el proceso que los ha creado o ser creados en el mismo espacio de memoria.
En los sistemas operativos multihilo es posible crear tanto hilos como procesos. La diferencia estriba en que un proceso
solamente puede crear hilos para sí mismo y en que dichos hilos comparten toda la memoria reservada para el proceso.
En este modelo: todo software ejecutable de la computadora, lo que a menudo incluye al sistema operativo, está organizado
en una serie del proceso secuenciales, o simplemente procesos.
1
La idea clave aquí es que un proceso es una actividad de algún tipo: tiene programa, entrada, salida y un estado. Se puede
compartir un procesador entre varios procesos, usando algún algoritmo de planificación para determinar cuándo debe de
trabajar en un proceso para atender a uno distinto.
Los sistemas operativos que manejan el concepto de proceso deben contar con algún mecanismo para crear todos los
procesos necesarios. En los sistemas muy sencillos, o en los diseñados para ejecutar solo una aplicación.
En otros sistemas operativos existen llamadas al sistema para crear un proceso, cargar su memoria y ponerlo en ejecutar.
Sea cual sea la naturaleza exacta de la llamada al sistema. Los procesos necesitan poder crear otros procesos.
Los procesos en el estado listo son los que pueden pasar a estado de
ejecución si el planificador los selecciona. Los procesos en el estado
ejecución son los que se están ejecutando en el procesador en ese
momento dado. Los procesos que se encuentran en estado bloqueado
están esperando la respuesta de algún otro proceso para poder
continuar con su ejecución. Por ejemplo operación de E/S.
2
Los estados de los procesos se pueden dividir en dos tipos: activos e
inactivos.
2.- Estados inactivos
Creación de Procesos
4
Los sistemas operativos poseen una serie de funciones cuyo objetivo es el de la
manipulación de los procesos. En general las operaciones que se pueden hacer
sobre un proceso son las siguientes:
Además de los dos tipos anteriores se pueden realizar las operaciones siguientes:
5
En el caso de un proceso la información general que contiene es:
Interno: Sistemas.
Externo: Usuario.
TRANSICIONES
Estados:
6
1. Ejecución (que en realidad hace uso del CPU en ese
instante).
proceso).
3. Ocurre cuando todos los procesos han utilizado su parte del tiempo y
es hora de que el primer proceso vuelva a correr.
Transiciones de estado.
7
Despacho (nombre del proceso):
Listo en ejecución.
8
- tiempo excedido ( nombre del proceso): en
ejecución Listo
Suspensión y Reanudación.
Una suspensión puede ser iniciada por el propio proceso o por otro. En
un sistema con un solo procesador el proceso en ejecución puede
9
suspenderse a si mismo; ningún otro proceso podría estar en ejecución
al mismo tiempo para realizar la suspensión (aunque otro proceso sí
podría solicitar la suspensión cuando se ejecute). En un sistema de
múltiples procesadores, un proceso en ejecución puede suspender a otro
que se esté ejecutando en ese mismo momento en un procesador
diferente.
1) Suspender (nombre_del_proceso):
Listo Suspendido-Listo.
3) suspender ( nombre_del_proceso):
Bloqueado Suspendido-Bloqueado.
6) suspender (nombre_del_proceso):
Ejecución Suspendido-Listo.
10
En conclusión los sistemas que administran procesos deben ser capaces
de realizar ciertas operaciones sobre procesos y con ellos. Tales
operaciones incluyen:
Crear un proceso.
Destruir un proceso.
Suspender un proceso.
Reanudar un proceso.
Cambiar la prioridad de un proceso.
Bloquear un proceso.
Despertar un proceso.
Despachar un proceso.
Permitir que un proceso se comunique con otro (esto se
denomina comunicación entre procesos).
11
Un proceso es una entidad relativamente independiente que dispone de su
propio espacio de direcciones, su propia información de estado y que utiliza los
mecanismos de comunicación entre procesos que le proporciona el sistema
operativo para comunicarse con otros procesos.
Por otro lado, un hilo es una entidad más reducida capaz de convivir junto a
otros hilos bajo el contexto de un único proceso, permitiendo compartir la
información de estado, el área de memoria y/o los recursos asociados a ese
proceso.
Dentro de un proceso puede haber uno o más hilos de control cada uno
con:
Procesos ligeros
Una tarea (o proceso pesado) está formada ahora por una o más hebras
CARACTERISTICAS
13
Se comparten recursos. La compartición de la memoria permite a las
hebras pares comunicarse sin usar ningún mecanismo de comunicación
inter-proceso del SO.
La conmutación de contexto es más rápida gracias al extenso compartir de
recursos
No hay protección entre las hebras. Una hebra puede escribir en la pila de
otra hebra del mismo proceso
Paralelismo
14
Figura 4 Paralelismo
Para que dos actividades, sean concurrentes, es necesario que tengan relación entre sí,
como puede ser la cooperación en un trabajo determinado o el uso de información compartida.
16
Los procesos del sistema pueden ejecutarse concurrentemente, puede haber múltiples
tareas en el CPU con varios procesos. Existen varias razones para permitir la ejecución
concurrente:
Compartir recursos físicos: Ya que los recursos del hardware de la computadora son
limitados, nos podemos ver obligados a compartirlos en un entorno multiusuario.
Acelerar los cálculos: Si queremos que una tarea se ejecute con mayor rapidez,
debemos dividirla en subtareas, cada una de las cuales se ejecutara, en paralelo con las
demás.
Comodidad: Un usuario puede tener que ejecutar varias tareas a la vez, por ejemplo
puede editar, imprimir y compilar en paralelo.
PROBLEMAS DE CONCURRENCIA
En los sistemas de tiempo compartido (aquellos con varios usuarios, procesos, tareas, trabajos
que reparten el uso de CPU entre estos) se presentan muchos problemas debido a que los
procesos compiten por los recursos del sistema. Imagine que un proceso está escribiendo en la
unidad de cinta y se le termina su turno de ejecución e inmediatamente después el proceso
elegido para ejecutarse comienza a escribir sobre la misma cinta. El resultado es una cinta cuyo
contenido es un desastre de datos mezclados. Así como la cinta, existen una multitud de recursos
cuyo acceso debe der controlado para evitar los problemas de la concurrencia.
Condición de Espera Circular: Esto ocurre cuando dos o más procesos forman una
cadena de espera que los involucra a todos. Por ejemplo, suponga que el proceso A tiene
asignado el recurso 'cinta' y el proceso B tiene asignado el recurso 'disco'. En ese momento
al proceso A se le ocurre pedir el recurso 'disco' y al proceso B el recurso 'cinta'. Ahi se
forma una espera circular entre esos dos procesos que se puede evitar quitándole a la
fuerza un recurso a cualquiera de los dos procesos.
18
Los problemas descritos son todos importantes para el sistema operativo, ya que debe ser capaz
de prevenir o corregirlos. Tal vez el problema más serio que se puede presentar en un ambiente
de concurrencia es el 'abrazo mortal', también llamado 'trabazón' y en inglés deadlock. El
deadlock es una condición que ningún sistema o conjunto de procesos quisiera exhibir, ya que
consiste en que se presentan al mismo tiempo cuatro condiciones necesarias: La condición de no
apropiación, la condición de espera circular, la condición de exclusión mutua y la condición de
ocupar y esperar un recurso. Ante esto, si el deadlock involucra a todos los procesos del sistema,
el sistema ya no podrá hacer algo productivo. Si el deadlock involucra algunos procesos, éstos
quedarán congelados para siempre.
Forma de asegurar que si un proceso está usando una variable o archivo compartido, los otros
procesos quedarán excluidos de hacer lo mismo.
Los procesos pueden tener en su código secciones en que realizan cálculos internos y operaciones
que no dan lugar a condiciones de competencia. Sin embargo existen secciones de programa en
que el proceso está accediendo a recursos compartidos que pueden dar pié a condiciones de
competencia.
Mientras un proceso se encuentra en su sección crítica, otros procesos pueden, claro está, seguir
ejecutándose fuera de sus secciones críticas. Cuando un proceso abandona su región crítica, otro
proceso que espera entrar en su propia sección crítica (si existe algún proceso en espera). Lograr
que se cumpla la exclusión mutua es uno de los problemas fundamentales de la programación
concurrente. Se han propuesto muchas soluciones, algunas de software y otras de hardware,
algunas sencillas y otras complejas, y algunas que requieren la cooperación voluntaria de los
procesos y otras que exigen un escrito ajuste a rígidos protocolos.
Encontrarse dentro de una región crítica es un estado especial concedido a un proceso. El proceso
tiene acceso exclusivo a los datos compartidos y los demás procesos que requieran acceso a los
datos en ese momento deben esperar. Así pues, las secciones críticas deben ejecutarse tan rápido
como sea posible; un proceso no se debe bloquear dentro de su propia sección crítica y las
secciones críticas deben codificarse con mucho cuidado (para evitar, por ejemplo, la posibilidad de
ciclos infinitos).
19
operativo, al realizar su mantenimiento de terminaciones, debe liberar la exclusión mutua de
manera que otros procesos puedan entrar en sus regiones críticas.
En el momento de un cambio de proceso del uno al otro se pueden producir las siguientes
situaciones:
Esta sincronización por la cual una actividad impide que otras puedan tener acceso a un
dato mientras se encuentra realizando una operación sobre el mismo es lo que se conoce como
exclusión mutua.
La zona de código de un proceso que no puede ser interrumpida por otro, por los motivos
expuestos anteriormente se le llama Región Crítica.
Regiones críticas
Región datos - compartidos do acción
¿Como evitar la región critica?. La clave para prevenir el problema aquí y en muchas
otras situaciones en que interviene la memoria compartida, archivos compartidos y todo lo que se
comparte, consiste en determinar alguna manera de prohibir que un proceso lea y escriba los
datos compartidos al mismo tiempo.
20
De otra manera lo que se necesita es la sincronización. Una manera de asegurar de que si un
proceso ésta utilizando una variable o archivo compartido, es que los otros procesos no pueden
hacer lo mismo.
Para tener una solución adecuada a la región crítica se necesita que se cumplan cuatro
condiciones.
1. Nunca dos procesos pueden encontrarse simultáneamente dentro de sus regiones críticas.
2. No se hacen suposiciones acerca de las velocidades relativas de los procesos o
del Número de CPU.
3. Ningún proceso suspendido fuera de la región crítica debe bloquear a otros procesos.
4. Nunca un proceso debe querer entrar en forma arbitraria en su región crítica.
Cuando se diseña un proceso que debe contener una o varias regiones críticas se deben de
tomar en cuenta las siguientes consideraciones:
21
Solución al problema de la Sección Crítica
Una solución al problema de la sección crítica debe satisfacer los siguientes tres
requerimientos:
1. Exclusión Mútua. Si un proceso Pi esta ejecutandose en su sección crítica,
entonces ninguno de los otros procesos puede estar en su sección crítica
2. Progreso. Si ningún proceso esta ejecutándose en su sección crítica y existen
procesos que quieren entrar en su sección crítica, entonces la selección del próximo
proceso que entrará a la sección crítica no puede ser pospuesta indefinidamente.
3. Espera limitada. Debe existir un límite del número de veces que se les permite a
otros procesos entrar en sus secciones críticas en el intervalo entre que un proceso
ha hecho un requerimiento para entrar en su sección crítica y que se le concede el
permiso.
Se supone que cada proceso se ejecuta a velocidad distinta de cero.
Ninguna suposición respecto a la velocidad relativa de los n procesos.
Intentos iniciales para resolver el problema
Inhibir las interrupciones.
Solo dos procesos, P0 and P1
Estructura general del proceso Pi
repeat
entry section
sección crítica
exit section
sección restante
until false;
Los procesos pueden compartir algunas variables comunes para sincronizar sus acciones.
Algoritmo 1
Variables compartidas:
– var turn: (0..1);
inicialmente turn = 0
– turn = i ? Pi puede entrar en su sección crítica
Proceso Pi
repeat
while turn ? i do no-op;
sección crítica
turn := j;
sección restante
until false;
Satisface la condición de exclusión mútua, pero no la de progreso (si turn=0 y P1 esta listo para
entrar en su sección crítica, P1 no puede hacerlo, incluso aunque P0 este en la sección restante)
Algoritmo 2
Variables compartidas
– var flag: array [0..1] of boolean;
inicialmente flag [0] = flag [1] = false.
– flag [i] = true ? Pi listo para entrar en su sección crítica
Proceso Pi
repeat
flag[i] := true;
while flag[j] do no-op;
sección crítica
flag [i] := false;
22
sección restante
until false;
Satisface la exclusión mútua, pero no el requerimiento de progreso. (P0 pone flag[0 ] =true y P1
pone flag[1 ] =true; cada uno esperando al otro indefinidamente)
Algoritmo 3
Si una actividad desea impedir que otra acceda a ciertos datos compartidos, mientras no
se cumpla una determinada condición, debemos sincronizar las actividades con dicha condición.
Por tanto, la sincronización es un elemento necesario para asegurar la exclusión mutua.
Existen tres algoritmos diseñados para este fin, son los siguientes:
Espera Activa.
Espera no Activa
Mecanismos de Hardware.
23
Estos algoritmos establecen la espera de entrada a la región crítica con un bucle que será roto en
el momento en que se cumpla una determinada condición. Se, les llama así por que el proceso no
queda bloqueado en su ejecución, sino que constantemente compite por el procesador. Entre los
distintos algoritmos de este tipo existentes podemos citar:
Semáforos: Para eliminar los problemas que se producen con los algoritmos de espera
activa, fundamentalmente los referidos a la sobrecarga que producen en el sistema,
Dijkstra(1965) diseño un mecanismo basado en una variable entera utilizada como
contador de peticiones de entrada a una sección crítica. Esta variable es compartida por
todos los procesos del sistema. Este nuevo tipo de variable se denominó semáforo, por su
capacidad de gestionar el tráfico de los proceso que desean acceder a datos
compartidos. Con este sistema, cuando un proceso intente entrar en una región crítica
mientras otro está accediendo a los datos compartidos, se bloqueará de igual manera que
cuando un proceso accede a un recurso que está ocupado.
Un semáforo se define como una variable entera que puede inicializarse y su valor no debe
ser negativo y solo puede ser manipulada por las operaciones P y V.
24
Operaciones P y V: Estas operaciones son indivisibles, es decir que cuando un proceso
ejecuta una de ellas no puede ser interrumpida.
Operación V: Esta operación consiste en incrementar en uno el valor del semáforo sobre
el que actúa, también es conocida como signal. Es una operación de liberación.
Así, si se tiene un semáforo S, V de S V(S) o signal(S) causara S=S+1. V(MUTEX) -
libera
Operación P: Bloqueo, decrementa en uno el valor del semáforo sobre el que actúa
siempre y cuando el valor del semáforo es >=0 (positivo) también se le conoce en la literatura
inglesa como Wait. Por ejemplo si tenemos P(S), Wait(S) si S=S-1. P(MUTEX) - Espera el
proceso.
Por definición se tiene que el valor del semáforo debe ser mayor que cero, VAL(S)>0. En
el caso cuando el valor del semáforo es cero que relación nos queda:
Es importante señalar que la relación anterior será siempre valida independientemente
del número de operaciones P y V ejecutadas sobre el semáforo.
Regiones críticas: Son sistemas que permiten establecer protecciones contra una mala
utilización de los usuarios. Para ello sólo permiten que los datos compartidos se puedan
acceder desde determinadas regiones quedando transparentes desde el resto. Tiene
inconvenientes relacionados con la sincronización y no permite que varias actividades
puedan realizar operaciones de lectura simultánea.
25
Regiones criticas condicionales: Es una mejora del método anterior tratando de
resolver algunos problemas de sincronización que se presentan.
Un monitor permite compartir, segura y eficientemente, datos entre varias actividades,
garantizando la exclusión mutua, sin necesidad de que el programador tenga que suministrarla
explícitamente.
Se basa en dos premisas: la primera es la abstracción de datos consistente en una
técnica capaz de separar las operaciones a ejecutar sobre los datos, de los detalles de diseño
propio de los mismos (los lenguajes Modula y Ada soportan este tipo de estructuras). La segunda
es que realizan la exclusión mutua de forma implícita.
La finalidad más útil de los monitores es reunir todas las funciones que operan sobre un
conjunto de datos compartidos en un sólo módulo, de manera que todos los accesos a esos datos
estarán forzados a utilizar dichas funciones.
26
Mecanismos de Hardware
Son instrucciones hardware que aseguran la exclusión mutua. Entre las más utilizadas son las
siguientes:
Con lo anterior solo un proceso podrá entrar a la región crítica con lo que se esta asegurando la
exclusión mutua.
MUTEX = 1
29
Tanto productores como consumidores ejecutaran cíclicamente los siguientes algoritmos.
Productor consumidor.
El recurso que se va a compartir es el buffer por lo tanto la sección critica será el acceso
y manipulación de dicho buffer.
Para resolver el problema de exclusión mutua será necesario definir un semáforo para controlar el
acceso al buffer,
Definición de un semáforo para controlar el accedo a buffer.
Cuando el consumidor se apodera del buffer P ( ) !Sorpresa esta vacío ¡
Productor gana
se apodera del buffer
¡¡¡sorpresa el buffer esta lleno!!!
no va a poder depositar
y por lo tanto va a liberar el buffer
nunca hace V( ).
30
Productor Consumidor
produce msg. P (existe msg.)
X P (espacio disponible) P (acceso s buffer)
P (acceso a buffer) extrae msg.
* deposita msg V (acceso a buffer)
V (acceso a buffer) V (espacio disponible)
X V (existe msg) Consume msg.
Solución a la exclusión mutua X –
Solución de la sincronización
Buffer lleno Espacio disponible=N, existe msg=0.
Casos críticos
Buffer vacío
Mecanismo de semáforos
Un semáforo es un tipo de datos abstracto que permite el uso de un recurso de manera exclusiva
cuando varios procesos están compitiendo.
El acceso mutuo a regiones críticas se arregla con un semáforo que permita el acceso a un sólo
proceso
S.init(1)
31
P1 P2
a: loop loop
b: S.wait() S.wait()
c: critical region critical region
d: S.signal() S.signal()
e: non-critical region non-critical region
f: endloop endloop
Observamos los siguiente detalles:
Si algún proceso no libera el semáforo, se puede provocar un bloqueo.
No hace falta que un proceso libere su propio recurso, es decir, la operación signal() puede
sea ejecutada por otro proceso.
Con simples semáforos no se puede imponer un orden en los procesos accediendo a
diferentes recursos.
Si existen en un entorno solamente semáforos binarios, se puede simular un semáforo general
usando dos semáforos binarios y un contador, por ejemplo, con las
variables delay, mutex y count.
La operación init() inicializa el contador al número máximo permitido. El semáforo mutex asegura
acceso mutuamente exclusivo al contador. El semáforo delay atrapa a los procesos que superan el
número máximo permitido.
La operación wait() se implementa de la siguiente manera:
delay.wait()
mutex.wait()
decrement count
if count greater 0 then delay.signal()
mutex.signal()
y la operación signal() se implementa de la siguiente manera:
mutex.wait()
increment count
if count equal 1 then delay.signal()
mutex.signal()
Unas principales desventajas de semáforos son:
no se puede imponer el uso correcto de los wait()s y signal()s
no existe una asociación entre el semáforo y el recurso
entre wait() y signal() el usuario puede realizar cualquier operación con el recurso
Mecanismo de Monitores
Todas las estructuras que hemos visto hasta ahora siguen provocando problemas para el
programador:
El control sobre los recursos está distribuido por varios puntos de un programa
No hay protección de las variables de control que siempre fueron globales
Por eso se usa el concepto de monitores que implementan un nivel aún más alto de abstracción
facilitando el acceso a recursos compartidos.
Un monitor es un tipo de datos abstracto que contiene:
un conjunto de procedimientos de control de los cuales solamente un subconjunto es
visible desde fuera
un conjunto de datos privados, es decir, no visibles desde fuera
El acceso al monitor está permitido solamente a través de los procedimientos públicos y el
compilador garantiza exclusión mutua para todos los procedimientos. La implementación del
monitor controla la exclusión mutua con colas de entrada que contengan todos los procesos
32
bloqueados. Pueden existir varias colas y el controlador del monitor elige de cual cola se va a
escoger el siguiente proceso para actuar sobre los datos. Un monitor no tiene acceso a variables
exteriores con el resultado de que su comportamiento no puede depender de ellos.
La técnica permite la sincronización entre procesos porque actuando sobre el mismo recurso los
procesos pueden cambiar el estado del recurso y pasar así información de un proceso al otro.
Lenguajes de alto nivel que facilitan la programación concurrente suelen tener monitores
implementados dentro del lenguaje (por ejemplo refJavaMonitoresJava usa el concepto de
monitores para realizar el acceso mutuamente exclusivo a sus objetos).
El uso de monitores es bastante costoso, porque se pierde eficiencia por tanto bloqueo de los
prosesos. Por eso se intenta aprovechar de primitivas más potentes para aliviar este problema,
como vemos en la siguiente sección.
Interbloqueo (DeadLock)
Si un conjunto de procesos esta en estado de espera por recursos y nunca cambia de estado
porque los recursos por los que espera están siendo utilizados por otros procesos en estado de
espera tenemos un DEADLOCK. Los recursos son la memoria, dispositivos de E/S, semáforos,
archivos, etc. La forma en que un proceso hace uso de un recurso es:
Conjunto de Aristas
Una arista de un proceso Pi a un Recurso Rj significa que el proceso i esta haciendo una solicitud
por el recurso Rj.
33
Una arista del recurso Rj al proceso Pi, significa que el recurso esta asignado al proceso.
Si un RAG no tiene ciclos el sistema no esta en DEADLOCK, si los tiene no se puede afirmar nada.
Evasion de Deadlocks
Estado Seguro
Un estado es seguro si se pueden asignar recursos a cada proceso (hasta su máximo) en algún
orden sin que se genere Deadlock. El estado es seguro si existe un ordenamiento de un conjunto
de procesos {P1...Pn} tal que para cada Pi los recursos que Pi podrá utilizar pueden ser otorgados
por los recursos disponibles mas los recursos utilizados por los procesos Pj,j<i. Si los recursos
solicitados por Pi no pueden ser otorgados, Pi espera a que todos los procesos Pj hayan
terminado.
Asigna peticiones de recursos siempre que las mismas den como resultado estados seguros.
Solicitudes que den como resultado estados inseguros serán negadas hasta que puedan ser
satisfechas. Este algoritmos evita situaciones de Deadlock asignando los recursos en forma
correcta.
Las debilidades del algoritmo son: que requiere que la cantidad de recursos del sistema sea
constante, requiere una cantidad de procesos constante y requiere que los procesos garanticen
que los recursos van a ser devueltos en un intervalo finito de tiempo.
Las técnicas para prevenir el deadlock consisten en proveer mecanismos para evitar que se
presente una o varias de las cuatro condiciones necesarias del deadlock. Algunas de ellas son:
Asignar recursos en orden lineal: Esto significa que todos los recursos están
etiquetados con un valor diferente y los procesos solo pueden hacer peticiones de recursos
'hacia adelante'. Esto es, que si un proceso tiene el recurso con etiqueta '5' no puede pedir
recursos cuya etiqueta sea menor que '5'. Con esto se evita la condición de ocupar y
esperar un recurso.
Asignar todo o nada: Este mecanismo consiste en que el proceso pida todos los recursos
que va a necesitar de una vez y el sistema se los da solamente si puede dárselos todos, si
no, no le da nada y lo bloquea.
Algoritmo del banquero: Este algoritmo usa una tabla de recursos para saber cuántos
recursos tiene de todo tipo. También requiere que los procesos informen del máximo de
recursos que va a usar de cada tipo. Cuando un proceso pide un recurso, el algoritmo
34
verifica si asignándole ese recurso todavía le quedan otros del mismo tipo para que alguno
de los procesos en el sistema todavía se le pueda dar hasta su máximo. Si la respuesta es
afirmativa, el sistema se dice que está en 'estado seguro' y se otorga el recurso. Si la
respuesta es negativa, se dice que el sistema está en estado inseguro y se hace esperar a
ese proceso.
Para detectar un deadlock, se puede usar el mismo algoritmo del banquero, que aunque no dice
que hay un deadlock, sí dice cuándo se está en estado inseguro que es la antesala del deadlock.
Sin embargo, para detectar el deadlock se pueden usar las 'gráficas de recursos'. En ellas se
pueden usar cuadrados para indicar procesos y círculos para los recursos, y flechas para indicar si
un recurso ya está asignado a un proceso o si un proceso está esperando un recurso. El deadlock
es detectado cuando se puede hacer un viaje de ida y vuelta desde un proceso o recurso. Por
ejemplo, suponga los siguientes eventos:
En la figura 5.1 se observa como el 'resource graph' fue evolucionando hasta que se presentó el
deadlock, el cual significa que se puede viajar por las flechas desde un proceso o recurso hasta
regresar al punto de partida. En el deadlock están involucrados los procesos A,B y C.
Una vez que un deadlock se detecta, es obvio que el sistema está en problemas y lo único que
resta por hacer es una de dos cosas: tener algún mecanismo de suspensión o reanudación que
permita copiar todo el contexto de un proceso incluyendo valores de memoria y aspecto de los
periféricos que esté usando para reanudarlo otro día, o simplemente eliminar un proceso o
arrebatarle el recurso, causando para ese proceso la pérdida de datos y tiempo.
Los sistemas de spool suelen ser los más propensos al dead lock. Varios trabajos
parcialmente complejos que generan líneas de impresión a un archivo de spool pueden
interbloquearse si el espacio disponible para trabajar se llena antes de completarse alguno de
esos trabajos. La solución más común es limitar los spoolers de entrada de modo que no se lean
más archivos cuando se llega al límite de su capacidad.
Postergación indefinida.
En los sistemas que mantienen procesos en espera mientras realizan la asignación de
recursos y/o procesan la planificación de decisiones, es posible que un proceso sea postergado de
manera indefinida mientras otro reciben la atención del sistema. A esta situación se le conoce
como postergación indefinida, es diferente del dead lock pero sus consecuencias son igual de
negativas.
35
En algunos sistemas la postergación indefinida se evita aumentando la prioridad de un
proceso mientras espera por un recurso, a esto se le llama envejecimiento.
Los datos y los programas son recursos que tienen características especiales. En un
sistema multiusuario donde se pueden compartir editores, compiladores y programas en general,
es ineficiente cargar una copia de ellos para cada usuario que lo solicite. En lugar de ello se carga
una sola vez a la memoria y se hacen varias copias de los datos, una por cada usuario.
El código que no cambia mientras está en uso se llama código reéntrate. El código que
puede ser cambiado pero que se inicializa cada vez que se usa se llama reutilizable en serie. El
código reéntrate puede ser compartido simultáneamente por varios procesos mientras que el
reutilizable en serie sólo puede ser usado por un proceso a la vez.
- Prevención
- No permitirlos
- Evitarlos
36
Figura # 24. Prevención de Dead Lock.
En principio existen cuatro áreas importantes en la investigación del dead lock, a saber:
1) Prevención:
En las técnicas de prevención el interés se centra en condicionar un sistema para que
elimine toda probabilidad de que ocurra un dead lock (normalmente a costa de recursos).
2) Evitación:
En las técnicas para evitar, la idea es poner condiciones menos estrictas que la
prevención, para lograr una mejor utilización de los recursos, pero procurando no caer en un dead
lock.
3) Detección:
Los métodos de detección se usan en sistemas que permiten la ocurrencia de un dead
lock de forma voluntaria o involuntaria.
4) Recuperación:
Los métodos de recuperación se usan para romper los dead lock en un sistema, para
poder liberarlo de ellos y los procesos estancados pueden continuar y llegar a su fin
Un proceso debe solicitar un recurso antes de usarlo, y liberarlo al terminar su uso. Un
proceso puede solicitar cuantos recursos quiera para llevar a cabo su tarea. Obviamente, el
número no puede exceder del total de recursos disponibles del sistema. En otras palabras, un
proceso no puede solicitar tres impresoras si el sistema solo dispone de dos.
37
1. Solicitud. Si la solicitud no puede atenderse de inmediato (por ejemplo, otro proceso está
utilizando ese recurso), entonces el proceso solicitante debe esperar hasta que pueda adquirir el
recurso.
2. Utilización. El proceso puede trabajar con el recurso (por ejemplo, si el recurso es una
impresora, el proceso puede imprimir en ella).
3. Liberación. El proceso libera el recurso.
La solicitud y liberación de recursos son llamadas al sistema. Algunos ejemplos son las
llamadas Solicitar y Liberar dispositivos, Abrir y Cerrar archivos, y Asignar y Liberar memoria. La
solicitud y liberación de otros recursos puede lograrse atreves de las operaciones espera (P) y
señal (V) sobre semáforos. Además la utilización de recursos solo puede conseguirse mediante
llamadas al sistema (por ejemplo, para leer o escribir en un archivo o dispositivo de E/S), de
modo que para cada utilización, el sistema operativo verifica que el proceso que dispone del
recurso ya lo había solicitado y ya se le había asignado. Una tabla del sistema registra si cada uno
de los recursos está libre o asignado y, de estar asignado, a qué proceso. Si un proceso solicita un
recurso que se encuentra asignado a otro, puede añadirse a la cola de procesos que esperan tal
recurso.
Un conjunto de procesos se encuentra en estado de bloqueo mutuo cuando cada uno de
ellos espera un suceso que sólo puede originar otro proceso del mismo conjunto.
Caracterización.
Debe ser obvio que los bloqueos mutuos son indeseables, pues cuando se dan, los
procesos nunca terminan su ejecución y los recursos del sistema se paralizan, impidiendo que se
inicien otros procesos. Antes de analizar los distintos métodos para tratar el problema del bloqueo
mutuo se describirán las circunstancias que los caracterizan.
Condiciones necesarias para que ocurra un Dead Lock.
1.- Los procesos reclaman control exclusivo de los recursos que solicitan (exclusión mutua).
2.- Los procesos mantienen los recursos que se les han asignado mientras esperan por recursos
adicionales (condición de espera).
38
3.- No se pueden tomar los recursos que los procesos tienen hasta su completa utilización
(condición de no apropiatividad).
4.- Existe una cadena circular de procesos en la cual cada uno de ellos mantiene uno o más
recursos que son requeridos por el siguiente proceso de la cadena (condición de espera
circular).
Se deben presentar las cuatro condiciones para que puede aparecer un Dead Lock. La
condición de espera circular implica la condición de retención y espera, por lo que las cuatro
condiciones no son completamente independientes.
Prevención
En las estrategias de prevención de dead Locks, los recursos son otorgados a los procesos
solicitados, de tal manera que la solicitud de un recurso nunca llega a un Dead Lock. Esta
estrategia se cerciora de que cuando menos una de cuatro condiciones de Dead Lock nunca llegue
a ocurrir.
* Exclusión mutua.
La condición de exclusión mutua debe conservarse para recursos no compartibles. Los
recursos compartibles, no requieren acceso mutuamente excluyente y, por tanto, no pueden
participar en un dead lock. Los archivos de sólo lectura son un buen ejemplo de recursos
compartibles. Si varios procesos tratan de abrir al mismo tiempo un archivo de sólo lectura, se
les puede otorgar accesos simultáneos al archivo, por lo general no es posible evitar dead
lock`s negando la condición de exclusión mutua. Por su naturaleza algunos recursos no pueden
compartirse.
La primera estrategia de Havender requiere que todos los recursos que va a necesitar un
proceso sean pedidos de una sola vez. El sistema deberá asignarlos según el principio "todo
o nada". Si el conjunto de recursos que necesita un proceso está disponible se le asigna (todo) y
se le permite entrar en ejecución. Si no es así, el proceso deberá esperar hasta que su conjunto
de recursos esté disponible. Mientras un proceso espera. No podrá tener ningún recurso.
39
Puede llevar a la postergación indefinida, ya que quizá todos los recursos requeridos
estén disponibles al mismo tiempo (costos de operación altos).
Puede llevar un serio desperdicio de recursos, se requiere tener una gran cantidad
de recursos para poder responder a cumplir petición.
Una variante consiste en dividir el programa en bloques que puedan ser ejecutados con
relativa independencia uno del otro. Esto reduce el desperdicio, pero implica un trabajo extra en el
diseño de las aplicaciones.
Al retirar los recursos a un proceso que no puede avanzar se niega la condición
de "no apropiatividad". Un problema de esta política es la postergación indefinida.
Si se da a los recursos una manera exclusiva y se obliga a los procesos a pedirlos en
forma ascendente es imposible que ocurra una espera circular. Esta propuesta considera:
Los recursos deben ser numerados reflejando el orden en el cual la mayoría de los trabajos
los usan.
Los procesos deben pedir los recursos en forma ascendente.
Para los procesos que requieren de los recursos en un orden diferente, los recursos
deberán ser tomados y retenidos mucho antes de su utilización. (Implica el desperdicio de
los recursos mantenidos pero no usados).
40
La forma más simple de prevenir un Dead Lock es obteniendo todos los recursos necesarios
antes que el proceso continué y así se elimine la "condición de espera".
En otro método de prevención de dead lock, un proceso bloqueado devuelve los recursos
solicitados por un proceso activo, al igual que elimina la condición de "no apropiatividad"
Rosenkrantz et al Ha propuesto la siguiente optimización de este método. Todos los procesos
son asignados a prioridades únicas que pueden ser totalmente ordenadas. Un proceso de
retención cede el derecho de prioridad a otro proceso que sostiene el recurso necesario solo si el
proceso de retención tiene el recurso necesario solo si el proceso de retención tiene mayor
prioridad.
Este método reduce los derechos de prioridad al 50% al igual que previene los dead
locks. En el ordenamiento de Havender's todos los recursos son ordenados de manera única y
todos los procesos solicitan los recursos de manera ascendente.
Únicamente eliminando la condición de "espera circular". Si un proceso ya sostiene
algunos recursos, entonces puede pedir solo aquellos acomodos en un rango superior en el orden.
Obteniendo recursos, de ésta forma, previene la formación de un ciclo o de un "knot".
Prevenir
Se puede prevenir el bloqueo siempre y cuando se consiga que alguna de las condiciones
necesarias para la existencia de un bloqueo no se produzca.
1. los procesos tienen que compartir recursos con exclusión mutua:
o No se de a un proceso directamente acceso exclusivo al recurso, si no se usa otro
proceso que realiza el trabajo de todos los demás manejando una cola de tareas
(por ejemplo, un demonio para imprimir con su cola de documentos por imprimir).
2. los procesos quieren acceder a un recurso más mientras ya tienen acceso exclusivo a otro:
o Se exige que un proceso pida todos los recursos que va a utilizar al comienzo de su
trabajo
3. los recursos no permiten ser usados por más de un proceso al mismo tiempo:
o Se permite que un proceso aborte a otro proceso con el fin de obtener acceso
exclusivo al recurso. Hay que tener cuidado de no caer en livelock
4. Existe una cadena circular entre peticiones de procesos y locación de recursos:
o Se ordenan los recursos linealmente y se fuerza a los procesos que accedan a los
recursos en el orden impuesto. Así es imposible que se produzca un ciclo.
En las prácticas aplicamos dicho método para prevenir bloqueos en la lista concurrente.
Prevención de Deadlocks
La estrategia consiste en anular alguna de las cuatro condiciones necesarias para que se produzca
un Deadlock.
1. No puede ser anulada porque existen recursos que deben ser usados en modalidad
exclusiva.
41
2. La alternativa sería hacer que todos los procesos solicitaran todos los recursos que habrán
de utilizar antes de utilizarlos al momento de su ejecución lo cual sería muy ineficiente.
3. Para anular esta condición cuando un proceso solicita un recurso y este es negado el
proceso deberá liberar sus recursos y solicitarlos nuevamente con los recursos adicionales.
El problema es que hay recursos que no pueden ser interrumpidos.
4. Espera Circular: esta estrategia consiste en que el sistema operativo numere en forma
exclusiva los recursos y obligue a los procesos a solicitar recursos en forma ascendente. El
problema de esto es que quita posibilidades a la aplicación.
Deadlock no puede ocurrir a menos que tenemos todas las cuatro condiciones. Si aseguramos
que no puede ocurrir por lo menos una de las condiciones, no podemos tener deadlock.
Exclusión mutua. En general, no podemos eliminar esta condición. Hay recursos como
impresoras que no son compatibles.
Retención y espera. Para no ocurrir esta condición, cuando un proceso solicita recursos,
no puede retener otros. Protocolos:
o Un proceso puede solicitar recursos solamente si no tiene ningunos.
o Un proceso tiene que solicitar todos los recursos antes de la ejecución.
Problemas:
o La utilización de recursos puede ser baja.
o Starvation (bloqueo indefinido) si se necesitan algunos recursos populares.
No apropiación. Si un proceso retiene varios recursos y solicita otro que no está
disponible, se le expropian todos los recursos que retiene. El proceso tiene que recuperar
todos los recursos antes de ejecutar otra vez.
Pero en general no podemos expropiar recursos como impresoras y grabadores.
Espera circular. Hacemos una ordenación de los tipos de recursos en el sistema (R1,
R2, ...). Un proceso tiene que solicitar sus recursos en orden (y todos los ejemplares de un
tipo al mismo tiempo). Si necesita un tipo de recurso más baja en la ordenación, tiene que
liberar los otros que retiene.
Problemas con la prevención de deadlock: Utilización baja de recursos y reducción de la
productividad del sistema.
Evitar
Evitación
La prioridad
El tiempo que el proceso ha corrido
El número y tipo de los recursos adquiridos
La clase de proceso (batch o interactiva)
La starvation es un problema.
Detección y Recuperación
Es el hecho de determinar si existe o no un Dead Lock, e identificar cuales son los
procesos y recursos implicados en él. El uso de algoritmos de detección de interbloqueo implica
una sobrecarga en el tiempo de ejecución. Para ser correcto, un algoritmo de detección de
interbloqueo debe de cumplir dos criterios:
El estado de un sistema es dinámico; esto es, los procesos del sistema toman y liberan
recursos continuamente. La representación del dead lock requiere la representación del
estado de la interacción procesos - recursos, la representación se hace mediante un grafo
dirigido que se conoce como gráfica de asignación de recursos .
En los sistemas de bases de datos distribuidos (DDBS) está representación se conoce como
gráfica de espera de transacción (Transaction Wait-For TWF).
46
Los dead lock`s pueden describirse con mayor precisión en función de un grafo dirigido llamado
grafo de asignación de recursos.
La simbologia es la siguiente . a, b, c y d.
GRÁFICA DE PETICIÓN Y ASIGNACIÓN DE RECURSOS
Petición = Proceso - Recurso
Pi
Para determinar si existe un ciclo en un grafo se puede usar la representación matricial del grafo
dirigido. Dado que se tienen parejas ordenadas {Rx, Ry}, la matriz se construye colocando un 1
en la diagonal en (x,x) y (y,y) y un 1 en la posición (x,y) de la matriz. .
Reducción de la matriz del grafo.
Reducción de la matriz de un grafo correspondiente. No existen vértices terminales; los vértices 1
y 2 son iniciales y pueden ser eliminados; existe un Inter bloqueo.
47
Representación vectorial
Un vértice terminal sólo aparece en la columna requiere y un vértice inicial sólo aparece en la
columna Tiene. Para reducir esta representación se recorren de arriba a abajo los vectores y se
buscan los vértices terminales e iniciales y se elimina su renglón.
El proceso se repite hasta:
1) No existen renglones o
2) No se pueden eliminar renglones.
Si no se pueden eliminar renglones las transiciones producen un Dead Lock.
Para el grafo de la en el primer paso se eliminan los procesos P1 (vértice inicial), P2 y P3
(vértice terminal). En el segundo paso se elimina el proceso P4 (vértice terminal), inicial.
Recuperación
Recuperación ante Deadlocks
1. Cancelación de procesos
1. Cancelación de todos los procesos involucrados. Esto resuelve
la situación de Deadlock pero tiene un costo muy alto de
reprocesamiento.
2. Cancelacion de un proceso por vez hasta resolver la situación
de Deadlock. La ventaja de esto es que el costo de
reprosesamiento de la información es menor pero cada vez
que se cancela un proceso debe ejecutarse el algoritmo de
detección de deadlock. Los criterios para elegir el candidato a
ser cancelado son: por prioridad, por tiempo de uso de CPU,
por cantidad de recursos utilizados y por cuantos recursos
adicionales habrá de utilizar.
2. Obtención de recursos (resourse Preemption). El sistema operativo
selecciona un proceso y le quita los recursos otorgados. Los
criterios para seleccionar el candidato son los mismos que para la
cancelación. El proceso seleccionado se le quitan los recursos y se
le lleva a un estado consistente (Rollback).
Recuperación de un Dead Lock.
48
La única forma en que el sistema operativo puede recuperarse
de un interbloqueo es retirando uno o más procesos y reclamar sus
recursos para que otros procesos puedan terminar. Normalmente varios
procesos perderán una parte o la totalidad del trabajo realizado hasta
ese momento. Este puede parecer un precio pequeño comparado con
dejar que el interbloqueo se complique por varios factores.
50
Requerimiento procesos - recursos.
51
(a) Seguro. (b) Seguro. (c) Inseguro.
Un estado es seguro si existe una secuencia de estados que lleva a
todos los clientes que obtienen préstamos hasta sus límites de
crédito. es seguro por que con las dos restantes, el banquero puede
demorar cualquier solicitud salvo la de Carlos, con lo que permite que
termine y devuelva sus cuatro recursos. Con cuatro unidades, el
banquero puede permitir que David o Bárbara tengan las unidades que
necesitan para terminar y así sucesivamente.
52
Sea n un número de proceso y m un número de recurso y sea
disponible un vector de longitud m que indica el número de recursos
disponibles y sea máxima una matriz de ( n x m) que define la máxima
demanda de cada proceso así por ejemplo si tuviéramos máxima ( i,j ) =
k define los recursos asignados a cada proceso, por ejemplo la
asignación ( i , j ) = k quiere decir que el proceso i tiene asignado K
instancias del recurso j necesidades ( n * m ), que indica los recursos
que requieren los procesos. Necesidades ( i , j ) = Máxima ( i , j ) -
Asignación ( i , j ).
Se puede considera cada renglón de las matrices asignación y
necesidades como vectores y referirnos como asignación de i y
necesidades de i.
Algoritmo:
53
Sea trabajo (m) y final (n) vectores de
longitud m y n respectivamente, hacer Trabajo
= Disponible y final ( i ) = falso para i = 1,...n
Secuenciabilidad
Los archivos secuenciales son un tipo de archivo en los que la información puede leerse y
escribirse empezando desde el principio del archivo.
Debemos tomar en consideración algunas características que deben tener los archivos
secuenciales:
2. Para leer una zona concreta del archivo hay que avanzar siempre, si la zona está antes de
la zona actual de lectura, será necesario "rebobinar" el archivo.
3. Los ficheros sólo se pueden abrir para lectura o para escritura, nunca de los dos modos a
la vez.
Archivos Secuenciales
Se refiere al procesamiento de los registros, no importa el orden en que se haga,
para eso los registros están organizados en forma de una lista y recuperarlos y
procesarlos uno por uno de principio a fin.
54
Al finalizar un archivo secuencial se denota con una marca de fin de archivo. (End
end-of-file)
TEORÍA DE SERIABILIDAD
Una forma de evitar los problemas de interferencia es no permitir que las transacciones se
intercalen. Una ejecución en la cual ninguna de dos transacciones se intercala se conoce
como serial. Para ser más precisos, una ejecución se dice que es serial si, para todo par de
transacciones, todas las operaciones de una transacción se ejecutan antes de cualquier
operación de la otra transacción. Desde el punto de vista del usuario, en una ejecución serial
se ve como si las transacciones fueran operaciones que el DBS procesa atómicamente. Las
transacciones seriales son correctas dado que cada transacción es correcta individualmente,
y las transacciones que se ejecutan serialmente no pueden interferir con otra.
Una solución puede ser ampliar el rango de ejecuciones permisibles para incluir aquellas que
tienen los mismos efectos que las seriales. Dichas ejecuciones se conocen
como serializables. Entonces, una ejecución es serializable si produce el mismo resultado y
tiene el mismo efecto sobre la base de datos que alguna ejecución serial de las mismas
transacciones. Puesto que las transacciones seriales son correctas, y dado que cada
ejecución serializable tiene el mismo efecto que una ejecución serial, las ejecuciones
serializables también son correctas.
Aunque éstas dos ejecuciones intercaladas no son serializables, muchas otras sí lo son. Por
ejemplo, consideremos la siguiente ejecución intercalada de Transferir e Imprimir Suma. Esta
ejecución tiene el mismo efecto que la ejecución serial de Transferir seguida de Imprimir
Suma por lo tanto es serializable.
55
Leer4 (Cuentas [8]) devuelve el valor de US$200
Escribir4 (Cuentas [8], US$100)
Leer3 (Cuentas [8]) devuelve el valor de US$100
Leer4 (Cuentas [9]) devuelve el valor de US$200$
Escribir4 (Cuentas [9], US$300)
Commit4
Leer3 (Cuentas [9]) devuelve el valor de US$300
Commit3
Procedure P
begin
Start;
temp := Leer(x);
temp := temp + 1;
Escribir(x, temp);
Commit;
end
Puede ser presentado como r1[x] -› w1[x] -› c1. Los subíndices identifican esta transacción
particular y la distinguen de cualquier otra transacción que acceda al mismo dato. En general,
usaremos r1[x] (o w1[x] para denotar la ejecución de Leer (o Escribir) ejecutado por la
transacción T1 sobre el dato x.
56
Se dice que dos operaciones están en conflicto si ambas operan sobre el mismo dato y al
menos una de ellas es una operación de escritura (Escribir). Por lo tanto, Leer(x) está en
conflicto con Escribir(x), mientras que Escribir(x) está en conflicto tanto con Leer(x) como
con Escribir(x). Si dos operaciones están en conflicto, es muy importante su orden de
ejecución. Consideremos las siguientes transacciones
H1 = r4[y] r1[x] w1[x] c1 w4[x] r3[x] w4[y] w3[y] w4[z] w3[x] c4 c3
Niveles de Planificación
La planificación es el proceso por el cual el sistema operativo selecciona que
proceso ejecutar. La selección del proceso se basa en alguno de los algoritmos de
planificación.
La planificación de la CPU, en el sentido de conmutarla entre los distintos
procesos, es una de las funciones del sistema operativo. Este despacho es llevado
a cabo por un pequeño programa llamado planificador a corto plazo o dispatcher
(despachador). La misión del dispatcher consiste en asignar la CPU a uno de los
procesos ejecutables del sistema, para ello sigue un determinado algoritmo.
57
tanto, se dedica más tiempo a los procesos del usuario (un cambio de
proceso lleva bastante tiempo).
58
Se
puede definir el scheduling -algunas veces traducido como -
planificación- como el conjunto de políticas y mecanismos construidos
dentro del sistema operativo que gobiernan la forma de conseguir que
los procesos a ejecutar lleguen a ejecutarse.
59
Planificador a medio plazo.
Planificador a largo plazo
60
procesos bloqueados, o transfiriendo a memoria principal procesos bloqueados
únicamente por no tener memoria.
Ser equitativa: debe intentar hacer una planificación justa, esto es, se debe
tratar a todos los procesos de la misma forma y no aplazar indefinidamente
ningún proceso. La mejor forma de evitarlo es emplear alguna técnica de
envejecimiento; es decir, mientras un proceso espera un recurso, su
prioridad debe crecer.
Ser eficiente: debe maximizar el uso de los recursos tales como intentar
que la ocupación de la CPU sea máxima. Al mismo tiempo se debe intentar
reducir el gasto extra por considerar que es trabajo no productivo.
Normalmente el idear algoritmos eficientes supone invertir recursos en
gestión del propio sistema.
62
Lograr un tiempo de proceso global predecible. Esto quiere decir que un
proceso debe ejecutarse aproximadamente en el mismo tiempo y casi al
mismo costo con independencia de la carga del sistema.
63
en memoria principal procesos que no están en ejecución implica gasto
extra.
En los sistema no apropiativos, los trabajos largos retrasan a los cortos,
pero el tratamiento para todos los procesos es más justo. Los tiempos
de respuesta son más predecibles porque los trabajos nuevos de alta
prioridad no pueden desplazar a los trabajos en espera.
El Reloj de Interrupciones
64
No se debe confundir en ningún caso al reloj de interrupciones con el reloj de la
máquina o reloj hardware. Veamos con un pequeño ejemplo como esto es
imposible.
Como sabemos, todas las tareas de una computadora están sincronizadas por un
reloj hardware. La velocidad de un procesador determina la rapidez con la que
ejecuta un paso elemental o cambio en el sistema. Por ejemplo, si decimos de
una máquina que tienen un microprocesador que va a una frecuencia de 100 MHz
eso quiere decir que produce alrededor de 100 millones de pasos elementales o
cambios en el sistema en un segundo. Pero una instrucción consume algunos de
estos pasos mínimos.
Uso de Prioridades
65
En los siguientes subapartados vamos a estudiar ciertos algoritmos utilizados
para planificar la CPU, la elección de uno (o de una mezcla de varios) depende de
decisiones de diseño. Antes de exponer los algoritmos vamos a explicar ciertas
medidas que se utilizan para evaluarlos.
En general, hay que maximizar los dos primeros parámetros y minimizar los tres
últimos. Sin embargo, estos objetivos son contradictorios, el dedicar más tiempo
de CPU a los usuarios se hace a costa de llamar menos al algoritmo de
planificación (menos cambios de proceso), y de simplificarlo. Esto provoca que la
CPU se reparta menos equitativamente entre los procesos, en detrimento de los
últimos tres parámetros.
66
Planificación a plazo fijo.
Una vez que el proceso obtiene la cpu, se ejecuta hasta terminar, ya que es una
disciplina “no apropiativa”.
Puede ocasionar que procesos largos hagan esperar a procesos cortos y que
procesos no importantes hagan esperar a procesos importantes.
Es más predecible que otros esquemas.
67
No puede garantizar buenos tiempos de respuesta interactivos.
Suele utilizarse integrado a otros esquemas, por ejemplo, de la siguiente
manera:
Los procesos se despachan con algún esquema de prioridad.
Los procesos con igual prioridad se despachan “FIFO”.
ENLACE A SIMULACIÓN FIFO
SJF favorece a los procesos cortos a costa de los procesos largos. Además,
selecciona los trabajos que serán atendidos y que dejarán el sistema lo antes
posible. Esto último traduce en listas de espera cortas. El SJF es NO apropiativo
por lo que resulta de poca utilidad en ambientes de tiempo compartido.
68
En la figura 6.5 tenemos un ejemplo de funcionamiento del algoritmo en el que se
observa cómo se penalizan las ráfagas largas (como en SJF). Un punto débil de
este algoritmo se evidencia cuando una ráfaga muy corta suspende a otra un
poco más larga, siendo más largo la ejecución en este orden al ser preciso un
cambio adicional de proceso y la ejecución del código del planificador.
Los trabajos largos tienen un promedio y una varianza de los tiempos de espera
aún mayor que en SJF.
La apropiación de un proceso a punto de terminar por otro de menor duración
recién llegado podría significar un mayor tiempo de cambio de contexto
(administración del procesador) que el tiempo de finalización del primero.
Al diseñarse los Sistemas Operativos se debe considerar cuidadosamente la
69
sobrecarga de los mecanismos de administración de recursos comparándola con
los beneficios esperados.
Corrige algunas de las debilidades del SJF, tales como el exceso de perjuicio hacia
los procesos (trabajos) largos y el exceso de favoritismo hacia los nuevos
trabajos cortos.
Es una disciplina no apropiativa.
La prioridad de cada proceso está en función no sólo del tiempo de servicio del
trabajo, sino que también influye la cantidad de tiempo que el trabajo ha estado
esperando ser servido.
Cuando un proceso ha obtenido la cpu, corre hasta terminar.
Las prioridades, que son dinámicas, se calculan según la siguiente fórmula,
donde pr es la “prioridad”, te es el “tiempo de espera” y ts es el “tiempo de
servicio”:
La SRT tiene una sobrecarga mayor que la SJF. Debe mantener un
registro del tiempo de servicio transcurrido del trabajo en ejecución y debe
controlar las apropiaciones ocasionales.
Los procesos son despachados en FIFO, pero, se les otorga una cantidad
limitada de tiempo de CPU llamada división de tiempo (time - slice) o cuanto
(quantum). Si un proceso no termina antes de que se termine su tiempo de CPU,
el CPU es apropiado y asignado al siguiente proceso en espera. El proceso
apropiado se coloca al final de la lista de listos.
71
¿Cuál es el cuanto óptimo ? Es claro que cambia de un sistema a otro y
que varia de acuerdo a la carga del sistema.
El cuanto debe ser lo suficientemente grande como para permitir que la gran
mayoría de las peticiones interactivas requieran de menos tiempo que la duración
del cuanto, es decir que el tiempo transcurrido desde el otorgamiento de la cpu a
un proceso hasta que genera una petición de Entrada / Salida debe ser menor
que el cuanto establecido, de esta forma, ocurrida la petición la cpu pasa a otro
proceso y como el cuanto es mayor que el tiempo transcurrido hasta la petición
de Entrada / Salida, los procesos trabajan al máximo de velocidad, se minimiza la
sobrecarga de apropiación y se maximiza la utilización de la
Entrada / Salida.
El cuanto óptimo varía de un sistema a otro y con la carga, siendo un valor de
referencia 100 mseg (cien milisegundos)
Queves multi-level
72
Habrá procesos ejecutables que se mantengan en disco.
Habrá importantes implicaciones para la planificación, tales como las
siguientes:
o El tiempo de alternancia entre procesos para traer y procesar un
proceso del disco es considerablemente mayor que el tiempo para un
proceso que ya está en la memoria principal.
o Es más eficiente el intercambio de los procesos con un planificador de
dos niveles.
73
Un mecanismo de planificación debe:
74
desplazándose al final de la siguiente cola inferior. Por lo general, existe una cola
en el nivel más bajo en la cual el proceso circula por turno rotatorio hasta que
termina.
Ahora considérese una tarea limitada por la CPU que necesita mucho tiempo de
procesador. Esa tarea entra en la cola más alta de la red con prioridad alta.
Recibe rápidamente su primera asignación de la CPU, pero su cuanto expira y el
proceso se coloca en la cola del siguiente nivel inferior. En ese momento, el
proceso tiene una prioridad menor que la de los procesos que llegan al sistema,
en particular los trabajos limitados por la E/S, que obtienen primero la CPU. El
proceso limitado por la CPU acaba recibiendo ésta, obtiene un cuanto mayor que
en la cola más alta y vuelve a utilizar la totalidad de su cuanto. Luego es situado
al final de la siguiente cola inferior. El proceso sigue desplazándose a colas
inferiores, espera más entre divisiones de tiempo y utiliza todo su cuanto cada
vez que obtiene la CPU ( a menos que sea arrebatada por un proceso entrante).
En algún momento, el proceso limitado por la CPU llega a la cola de nivel inferior,
en donde entrará en una planificación por turno hasta terminar.
76
prioridad = (tiempo de espera + tiempo de servicio) / tiempo de servicio
77