Tema 08. Control de Recursos
Tema 08. Control de Recursos
Tema 08. Control de Recursos
Mecanismos de Sincronización
La sincronización entre procesos es necesaria para tareas cooperativas, con el objetivo de
cumplir restricciones lógicas en el orden de ejecución.
▪ Tipo de Operación
Algunos recursos admiten distintos tipos de acceso (acceso compartido o acceso
exclusivo). Esta información puede utilizarse para dar prioridad a un tipo de acceso
frente a otro.
▪ Temporización
El orden de llegada de las solicitudes de acceso se utiliza habitualmente para gestionar
el reparto de los recursos.
Considerando únicamente este factor, un proceso que solicite un recurso antes que
otro, conseguirá el acceso en primer lugar.
▪ Parámetros
Puede ser conveniente utilizar la información contenida en los parámetros asociados a
la petición. Con frecuencia, esta información se refiere al tamaño o número de
elementos solicitados (si son recursos cuantificables), o bien a la identidad del recurso.
➢ Estado local
Contiene información sobre el recurso que es necesaria, independientemente
de si el recurso se accede de forma concurrente o secuencial (buffer de
memoria).
Un proceso de mayor prioridad puede ser atendido antes que otro de menor prioridad,
a pesar de que este último haya realizado su solicitud con anterioridad al primero.
Interbloqueos: en qué consisten y cuáles son las condiciones que hacen que ocurran
Los interbloqueos es una situación que se produce en el control de recursos (conocido también
como condiciones de carrera).
Cuando dos o más tareas acceden, o intentan acceder, a más de un recurso compartido, se da
la posibilidad de que se genere la situación en que los procesos involucrados queden
incapacitados para continuar su ejecución normal, bloqueándose mutuamente.
▪ Punto Muerto (deadlock): los procesos quedan muertos esperando que los recursos
bloqueados a los que quieren acceder, queden disponibles.
▪ Bloqueo Activo (livelock): los procesos continúan su ejecución, pero no pueden
evolucionar (bucle de espera activa).
▪ Inanición (starvation): es cuando algunas tareas no obtienen recursos ya que siempre
hay otra de mayor prioridad que los están usando.
Para que se produzca un interbloqueo, deben darse, de forma simultánea, las siguientes
condiciones:
▪ Prevención
Considera la eliminación de alguna de las cuatro condiciones que provocan un
interbloqueo.
▪ Evitación
Se concede acceso a los recursos únicamente si el sistema se mantiene en un estado
seguro (un estado inseguro es aquel que puede llevar a un interbloqueo).
▪ Detección y Recuperación
Consiste en actuar después de que aparezca un estado de interbloqueo. Para ello, es
necesario detectar la ocurrencia del problema e identificar los procesos y recursos
implicados, y, a continuación, tomar las medidas necesarias para restablecer un estado
consistente.
El algoritmo de detección, que se ejecuta de periódicamente, se basa generalmente en
técnicas de entrada en la búsqueda de esperas circulares. Una vez se ha detectado el
interbloqueo, para eliminarlo se lleva a cabo:
Un reencolado puede hacerse a la misma barrera, a otra barrera en la misma unidad, o en otra
unidad diferente.
En cuanto al flujo de control, a diferencia de lo que ocurre en una llamada a otro procedimiento,
el invocador no retoma el control.
Cuando un punto de entrada se reencola en otro, el flujo de control del primero termina. Cuando
el segundo finaliza, el control se devuelve al objeto que realizó la llamada inicial. Como
consecuencia, cuando se ejecuta un reencolado de un objeto protegido a otro, la exclusión
mutua se libera.
Si las tareas de mayor prioridad siempre toman recursos de las tareas de menor
prioridad, este esquema de intercambio no es justo, pudiendo hacer que se evite el que
se completen las tareas de menor prioridad. Esta condición se llama inanición.
En este caso, no se debe permitir que una tarea escriba en una región de memoria
compartida antes de que la otra tarea complete su operación de lectura o escritura.
▪ Solicitud de recursos OR
Una tarea puede solicitar un conjunto de recursos, pero la tarea puede reanudar la
ejecución tan pronto como esté disponible cualquiera de los recursos del conjunto de
solicitudes.
La inversión de prioridad ocurre cuando existe interdependencia de tareas entre tareas con
diferentes prioridades. Para poder solucionar o tratar este problema, se emplea el uso de varios
protocolos de acceso.
Protocolos de Control de acceso que existen para tratar con la Inversión de Prioridad:
Protocolos de Herencia de Prioridad, de Prioridad Límite y de Límite de Prioridad.
Cuando una tarea T solicita un recurso R, este protocolo sigue las reglas:
Una tarea de mayor prioridad, que no esté relacionada aún, puede expropiar a la tarea,
lo cuál es el esquema de planificación expropiativo basado en prioridades.
Para un recurso dado, el límite de prioridad es la máxima prioridad de todas las tareas
posibles que pueden requerir el recurso.
El protocolo sigue las siguientes reglas cuando una tarea T solicita un recurso R:
Esta regla implica que todas las secciones críticas de cada tarea compartida tienen el
mismo nivel de criticidad. La idea es terminar la sección crítica lo antes posible para
evitar posibles conflictos.
Protocolo de Límite de Prioridad
En este protocolo se conoce la prioridad de cada tarea y los recursos de los que
requieren cada tarea. El límite de prioridad actual para un sistema en ejecución, en
cualquier momento, es el límite de máxima prioridad de todos los recursos en uso
en ese momento.
El protocolo sigue las siguientes reglas cuando una tarea T solicita un recurso R:
▪ Herencia de la Prioridad
Para limitar la duración del bloqueo que se produce en un objeto programable
esperando un recurso, que es cuando ocurre la Inversión de Prioridad, Java en
Tiempo Real (RTSJ) requiere:
➢ Todas las colas, mantenidas por la máquina virtual en tiempo real, deben
ordenarse por prioridad. Cuando hay más de un objeto planificable en la cola
con la misma prioridad, el orden entre ellos no está definido. Del mismo
modo, las colas resultantes de las llamadas a los métodos wait en la clase
Object deben ordenarse por prioridad.
➢ Debe haber facilidades para que el programador especifique el uso de
algoritmos de control de inversión de prioridad diferentes. Por defecto, RTSJ
requiere que se produzca una herencia prioritaria cada vez que se bloquea
un objeto planificable en espera de un recurso.
El programador puede cambiar el algoritmo de control de inversión de prioridad
predeterminado para objetos individuales (o para todos los objetos) a través de la
jerarquía de clases MonitorControl.
Del mismo modo, todas las colas se ordenan según la prioridad activa. Sin embargo,
debe tenerse en cuenta que un objeto planificable que hereda una prioridad,
mientras está dentro de un monitor, perderá esa prioridad cuando llame al método
Object.wait, y se colocará en cola según la prioridad que tenía antes de llamar al
monitor.