Coordinación y sincronización de los procesos
Concurrencia: Es la existencia de varias actividades ejecutándose simultáneamente, y necesitan sincronizarse
para actuar conjuntamente. Se trata, en este caso, de un concepto lógico, ya que sólo hace referencia a las
actividades, sin importar el número de procesadores presentes.
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.
Los procesos son concurrentes si existen simultáneamente. Los procesos concurrentes pueden funcionar en
forma totalmente independiente unos de otros, o pueden ser asíncronos, lo cual significa que en ocasiones
requiere cierta sincronización y cooperación.
En un sistema monoprocesador, la existencia de multiprogramación es condición necesaria, pero no suficiente
para que exista concurrencia, ya que los procesos pueden ejecutarse independientemente. Por ejemplo, un
editor y un compilador pueden estar ejecutándose simultáneamente en una computadora sin que exista
concurrencia entre ellos. Por otro lado si un programa se está ejecutando y se encuentra grabando datos en
un archivo, y otro programa también en ejecución está leyendo datos de ese mismo archivo, sí existe
concurrencia entre ellos, pues el funcionamiento de uno interfiere en el funcionamiento de otro.
Si un sistema es multiprocesador, también pueden presentarse situaciones de concurrencia siempre y cuando
las actividades necesiten actuar entre sí, bien por utilizar información común, o por cualquier otra causa.
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 íssicos: Ya que los recursos del hardware de la computadora son limitados, nos
podemos ver obligados a compartirlos en un entorno multiusuario.
Compartir recursos lógicos: Puesto que varios usuarios pueden interesarse en el mismo elemento de
información (por ejemplo, un archivo compartido), debemos proporcionar un entorno que permita
el acceso concurrente a estos tipos de recursos.
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.
Modularidad: Podremos construir el sistema en forma modular, dividiendo las funciones del sistema
en procesos separados.
Comodidad: Un usuario puede tener que ejecutar varias tareas a la vez, por ejemplo puede editar,
imprimir y compilar en paralelo.
La ejecución concurrente que requiere la cooperación entre procesos necesita un mecanismo para la
sincronización
y
comunicación
de
procesos,
exclusión
mutua
y
sincronización.
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. Existen una multitud de recursos cuyo acceso debe de ser controlado para evitar los
problemas de la concurrencia.
El sistema operativo debe ofrecer mecanismos para sincronizar la ejecución de procesos: semáforos, envío de
mensajes, 'pipes', etc. Los semáforos son rutinas de software (que en su nivel más interno se auxilian del
hardware) para lograr exclusión mutua en el uso de recursos. Para entender este y otros mecanismos es
importante entender los problemas generales de concurrencia, los cuales se describen enseguida.
Condiciones de Carrera o Competencia: La condición de carrera (race condition) ocurre cuando dos o
más procesos acceden a un recurso compartido sin control, de manera que el resultado combinado
de este acceso depende del orden de llegada.
Postergación o Aplazamiento Indefinido(a): Esto se mencionó en el apartado anterior y consiste en el
hecho de que uno o varios procesos nunca reciban el suficiente tiempo de ejecución para terminar
su tarea. Por ejemplo, que un proceso ocupe un recurso y lo marque como 'ocupado' y que termine
sin marcarlo como 'desocupado'. Si algún otro proceso pide ese recurso, lo verá 'ocupado' y esperará
indefinidamente a que se 'desocupe'.
Condición de Espera Circular: Esto ocurre cuando dos o más procesos forman una cadena de espera
que los involucra a todos.
Condición de No Apropiación: Esta condición no resulta precisamente de la concurrencia, pero juega
un papel importante en este ambiente. Esta condición especifica que, si un proceso tiene asignado
un recurso, dicho recurso no puede arrebatársele por ningún motivo, y estará disponible hasta que el
proceso lo 'suelte' por su voluntad.
Condición de Espera Ocupada: Esta condición consiste en que un proceso pide un recurso que ya está
asignado a otro proceso y la condición de no apropiación se debe cumplir. Entonces el proceso estará
gastando el resto de su time slice checando si el recurso fue liberado. Es decir, desperdicia su tiempo
de ejecución en esperar. La solución más común a este problema consiste en que el sistema operativo
se dé cuenta de esta situación y mande a una cola de espera al proceso, otorgándole inmediatamente
el turno de ejecución a otro proceso.
Condición de Exclusión Mutua: Cuando un proceso usa un recurso del sistema realiza una serie de
operaciones sobre el recurso y después lo deja de usar. A la sección de código que usa ese recurso se
le llama 'región crítica'. La condición de exclusión mutua establece que solamente se permite a un
proceso estar dentro de la misma región crítica. Esto es, que en cualquier momento solamente un
proceso puede usar un recurso a la vez. Para lograr la exclusión mutua se ideo también el concepto
de 'región crítica'. Para logar la exclusión mutua generalmente se usan algunas técnicas para lograr
entrar a la región crítica: semáforos, monitores, el algoritmo de Dekker y Peterson, los 'candados'.
Para ver una descripción de estos algoritmos consulte.
Condición de Ocupar y Esperar un Recurso: Consiste en que un proceso pide un recurso y se le asigna.
Antes de soltarlo, pide otro recurso que otro proceso ya tiene asignado.
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.
Exclusión mutua de secciones criticas
La 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 pie a
condiciones de competencia. La parte del programa en que se accede a un recurso compartido se
denomina sección o región crítica (requisito necesario, pero no suficiente). Los requisitos para que procesos
paralelos cooperen de manera correcta usando datos compartidos son los siguientes:
Dos procesos nunca pueden estar simultáneamente dentro de sus regiones críticas.
No se puede suponer nada acerca de las velocidades de ejecución de los procesos o el número de las
CPU.
Ningún proceso que se ejecute fuera de su región crítica puede bloquear a otros procesos.
Ningún proceso deberá tener una espera indefinida para entrar en su región crítica.
La exclusión mutua debe ponerse en práctica sólo cuando los procesos obtienen acceso a datos compartidos
modificables; cuando los procesos realizan operaciones que no entran en conflicto con otras, deben permitirse
que procedan concurrentemente. Cuando un proceso obtiene acceso a datos compartidos modificables, se
dice que se encuentra en una sección crítica. 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.
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).
Si un proceso de una sección crítica termina, ya sea voluntaria o involuntariamente, el sistema 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:
Sin sincronización entre procesos: Puede darse el caso de que ESCRIBIR esté actualizando un registro
y se quede a medías, sorprendiéndole el cambio de proceso, por tanto, terminará de escribirlo cuando
vuelva a hacer uso del procesador. Con el cambio le tocará el turno al proceso LEER, que accederá a
dicho registro pudiendo leerlo completamente. Es evidente que los datos leídos serán inconsistentes.
Con sincronización entre procesos: Supongamos algún mecanismo que prohíba la lectura (bloqueo
de registros) a cualquier proceso, mientras el proceso ESCRIBIR esté realizando alguna operación. En
este caso, LEER, al hacer uso del procesador que se encuentra bloqueado, quedaría en espera de que
el registro quede totalmente escrito y se proceda a su desbloqueo, LEER pasaría a estado bloqueado,
ESCRIBIR terminaría su trabajo sobre el registro y en el siguiente cambio LEER procedería a hacer el
suyo.
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: Es el conjunto de actividades elementales cuya ejecución exige el monopolio de recursos.
Por ejemplo, para indicar que alguna acción se realizará con acceso exclusivo a ciertos datos compartidos.
¿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.
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.
El problema de la Sección Crítica
En procesos compitiendo para utilizar algún dato compartido.
Cada proceso tiene un segmento de código, llamado sección crítica, en el que se accede al dato
compartido.
Problema – asegurarse de que cuando un proceso está ejecutándose en su sección crítica, a ningún
otro proceso se le permite ejecutar la suya.
Estructura del proceso Pi
Repeat
entry section
sección crítica
exit section
sección restante
until false;
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 ejecutándose 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 está 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.
Los procesos pueden compartir algunas variables comunes para sincronizar sus acciones.
Sincronización de procesos en Sección Crítica
En procesos concurrentes, la ejecución de un proceso se desarrolla en forma asíncrona respecto a los otros.
Sin embargo, cuando dos, o más procesos necesitan entrar en región crítica, es necesario que exista una
sincronización entre ellos a fin de garantizar que al menos uno y solo un proceso entrará en región crítica. 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.
Algoritmo de Espera activa.
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í porque 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:
Espera con mutex: Algoritmo que utiliza un switch (MUTEX) a través del cual se produce la
sincronización.
Alternancia: Ligeramente mejor que el anterior, utiliza también una variable turno para realizar el
sincronismo entre los Procesos.
Algoritmo de DEKKER: Resuelve el problema mediante la solución propuesta por DEKKER, basando su
funcionamiento en una Tabla unidimensional de dos elementos lógicos (Switches).
Algoritmo de Espera no activa: Son los algoritmos que establecen la espera para entrar en la región
crítica bloqueando, el proceso, haciendo que deje de competir por el procesador hasta que se cumpla
la condición de desbloqueo
Entre estos algoritmos existen los siguientes:
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 procesos 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.
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.
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.
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.
Regiones criticas condicionales: Es una mejora del método anterior tratando de resolver algunos
problemas de sincronización que se presentan.
Monitores: Uno de los problemas en los mecanismos anteriores es que el programador tiene que
proporcionar de forma explícita el modo de sincronización. Para evitarlo B. Hansen y C.A.R. Hoare
desarrollaron un nuevo mecanismo denominado Monitor que debe ser soportado por el lenguaje
correspondiente.
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.
Contadores de eventos: es un mecanismo para sincronizar actividades sin que sea necesario forzar la
exclusión mutua, ya sea porque no deseamos limitar la concurrencia de las actividades, o
simplemente porque no lo necesitamos. Se basa en una variable entera que cuenta determinadas
operaciones.
Mensajes: Mecanismo que permite intercambiar información necesaria durante el desarrollo normal
de un proceso en ejecución. Es más, un mecanismo de cooperación que de sincronización.
Existen dos tipos de comunicación entre procesos:
Directa: Envió y recepción de mensajes entre si; de manera que se asocia un enlace vi direccional
único entre cada dos procesos.
Indirecta: Mensajes enviados y recibidos a través de mail boxees o buzones de correo. Con este
método cada proceso puede estar relacionado con tantos buzones como desee consiguiendo
comunicarse con tantos procesos como sea necesario.
Mecanismos de Hardware
Son instrucciones hardware que aseguran la exclusión mutua. Entre las más utilizadas son las siguientes:
Deshabilitar interrupciones: Se puede forzar la exclusión mutua deshabilitando las interrupciones
mientras haya alguna actividad en la región crítica. De este modo, dicha actividad no podrá ser
interrumpida y, por tanto, no se podrá producir ningún cambio de proceso. La habilitación y
deshabilitación se realiza con una instrucción máquina, es una operación rápida.
Instrucción TEST-AND-SET: Forza la exclusión mutua. La ventaja es que no puede ser interrumpida por
que no muchas computadoras la poseen.
Lock: Se basa en la instrucción anterior y permite el acceso a la región crítica a un proceso en caso de
no existir otra actividad dentro de su región crítica, no permitiendo en caso contrario.
PROBLEMAS CLASICOS DE SINCRONIZACIÓN
Este tipo de problemas constituyen ejemplos de una amplia clase de problemas de control de concurrencia.
Estos problemas se utilizan para probar casi todos los esquemas de sincronización propuestos. En las
soluciones se emplean semáforos para la solución.
El problema de buffer limitado.
El problema de los lectores y escritores.
El problema de los filósofos comensales.
Problema del productor consumidor.
Problema de sincronización
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 tipo de datos abstracto cumple la siguiente semántica:
El estado interno del semáforo cuenta cuantos procesos todavía pueden utilizar el recurso.
Exiten tres operaciones con un semáforo: init(), wait(), y signal() que realizan lo siguiente:
init(): Inicializa el semáforo antes de que cualquier proceso haya ejecutado ni una operación wait() ni una
operación signal() al límite de número de procesos que tengan derecho a acceder el recurso.
wait(): Si el estado indica cero, el proceso se queda atrapado en el semáforo hasta que sea despertado por
otro proceso.
signal(): Una vez se ha terminado el uso del recurso, el proceso lo señaliza al semáforo. Si queda algún proceso
bloqueado en el semáforo uno de ellos sea despertado, sino se incrementa el contador.
La operación signal() también tiene que estár implementada como instrucción atómica. En algunás
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.
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 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.
Una desventaja de los monitores es la exclusividad de su uso, es decir, la concurrencia está limitada si muchos
procesos hacen uso del mismo monitor. Un aspecto que se encuentra en muchas implementaciones de
monitores es la sincronización condicional, es decir, mientras un proceso está ejecutando un procedimiento
del monitor (con exclusión mutua) puede dar paso a otro proceso liberando el cerrojo. Estas operaciones se
suele llamar wait() o delay(). El proceso que ha liberado el cerrojo se queda bloqueado hasta que otro proceso
le
despierta
de
nuevo.
Interbloqueo (DeadLock)
Si un conjunto de procesos está 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: Solicitud: si el recurso esta disponible se le otorga, si no el proceso pasa a
estado de espera.
Uso: El proceso utiliza el recurso
Liberación: el proceso debe liberar el recurso.
Condiciones Necesarias para que se produzca DEADLOCK
Si se presentan simultáneamente las cuatro siguientes condiciones el sistema esta en DEADLOCK.
1.
EXCLUSION MUTUA: Por lo menos un proceso que tenga otorgado un recurso en forma exclusiva.
2.
USO Y ESPERA: Debe existir al menos un proceso que este haciendo uso de un recurso y que este
esperando por otros recursos asignados a otros procesos.
3.
NO INTERRUPCION: Los recursos no pueden ser retirados al proceso. Si un proceso hace uso de un
recurso no le podrá ser retirado hasta que voluntariamente el proceso lo libere.
4.
ESPERA CIRCULAR: Debe existir un conjunto de procesos {P1.....Pn} tal que P1 espera por un recurso
utilizado por P2,......,Pn espera por un recurso utilizado por P1.
Mecanismos para tratar con Deadlocks
Evasion de Deadlocks: Si se tiene cuidado al en la forma de asignar los recursos se pueden evitar situaciones
de Deadlock.
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 más 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.
Algoritmo del banquero de Dijkstra: 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 algoritmo evita situaciones de Deadlock asignando los recursos en forma correcta.
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 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.
Puede agregar este documento a su colección de estudio (s)
Iniciar sesión Disponible sólo para usuarios autorizadosPuede agregar este documento a su lista guardada
Iniciar sesión Disponible sólo para usuarios autorizados(Para quejas, use otra forma )