
- Herramientas de sincronización que permiten exclusión mutua y la posibilidad de esperar porque una condición se vuelva falsa. Solo un proceso puede ejecutar el monitor a la vez.
Tiene 3 métodos:
- waitC → bloquea al proceso y libera al monitor.
- signalC → despierta al proceso bloqueado.
- empty → indica si hay procesos esperando.
- Ambas herramientas permiten sincronizar el acceso a recursos entre procesos y garantizar la exclusión mutua entre ellos.
En cuanto a las diferencias tenemos que:
- En los semáforos con el método wait se bloquea el proceso solo si K vale 0 mientras que waitC en los monitores bloquea siempre.
- En los semaforos con el método signal se desbloquea a un proceso aleatorio e incrementa K mientras que signalC no hace nada en caso de que la cola se encuentre vacía (en caso contrario se desbloquea al primer proceso en la cola).
- En los semaforos un proceso desbloqueado con signal puede continuar la ejecución inmediatemente mientras que en los monitores el proceso desbloqueado debe esperar que el proceso señalizador deje el monitor.
- TODO

- En programación asíncrona contamos con código sobre el cual especificamos puntos donde cedemos el uso del procesador para que se avancen otros cómputos, de esta forma avanzamos de forma concurrente en la ejecución de las distintas tareas que necesitamos realizar sin tener que ejecutarlas de forma secuencial y aprovechando operaciones I/O para continuar la ejecución de otras tareas.
- En la programación asíncrona las tareas ocupan menos memoria, se crean más rápido y tienen un costo menor en el cambio de contexto en comparación con los hilos del SO. Crear un número de tareas creciente tiene como beneficio el uso de menos memoria y un cambio de contexto más rápido que haciendo uso de hilos, donde si creamos uno por cada procesamiento a realizar vamos a estar ocupando cada vez más memoria y teniendo un cambio de contexto menos eficiente. Haciendo uso de programación asíncrona podemos continuar la ejecución de otros procesos mientras esperamos por operaciones de tipo I/O mientras que los hilos se bloquean en ellas sin aprovechar el uso del procesador, sin embargo los hilos son más efecivos al momento de realizar cómputos intensos.
- En cuanto al modelo asincrónico es más conveniente su uso por ejemplo en un sistema donde debamos atender en un servidor a un número creciente de clientes justamente por las razones mencionadas en el ítem anterior. En cuanto al modelo de hilos, podemos hacer uso del mismo junto con fork-join en un problema del estilo word-count donde cada sub-problema corresponde a una tarea aislada de las demás, de esta forma tendremos un número fijo máximo de hilos en ejecución que harán uso de work stealing para balancear la carga de trabajo de cada hilo y completar la tarea inicial (o problema) en un tiempo óptimo.

- Un deadlock se da cuando distintos procesos necesitan acceder a un recurso que tiene bloqueado (o está usando) otro proceso, en consecuencia ninguno puede continuar avanzando en el procesamiento que se encuentra realizando ya dado que ninguno “suelta el recurso que el otro necesita”. En un ambiente distribuido deben definirse distintas políticas en torno a la interrupción de los procesos que cuentan con un recurso de forma tal que los demás se enteren y puedan acceder al mismo cuando lo necesiten, lo cual implica sincronización y comunicación entre los procesos.
- En el algoritmo de detección de deadlocks centralizado existe un proceso que cumple el rol de coordinador/líder el cual gestiona un grafo del uso de recursos. Los procesos envían mensajes al coordinador cuando obtienen o liberan un recurso para que este actualize el grafo. Los nodos son los procesos y las aristas representan cuando un proceso necesita un recurso que está usando otro (por ejemplo si el proceso A necesita acceder al recurso que posee el proceso B, entonces existirá la arista A → B) y por lo tanto al detectarse ciclos en dicho grafo estaremos en presencia de deadlocks.
En el algoritmo de detección de deadlocks distribuído los procesos envían mensajes al proceso que cuenta con el recurso requerido, estos mensajes contienen:
- id del proceso que se bloquea esperando el recurso.
- id del proceso que envía el mensaje.
- id del proceso que recibe el mensaje.
Cuando un proceso recibe un mensaje de este tipo, modifica el id del proceso que envía el mensaje (se pone a sí mismo) y el id del proceso que recibe el mensaje (id del proceso que posee el recurso que este necesita), por lo tanto en caso de que un mensaje llegue a un proceso cuyo destinatario corresponde con el proceso bloqueado entonces representa un deadlock.
- En el algoritmo centralizado contamos con un único punto de falla y los mensajes en caso de llegar desordenados podrían generar falsos deadlocks.
En el algoritmo distribuído mientras que el distribuído carece de ello. Sin embargo en el algoritmo centralizado se deberán definir políticas en torno a situaciones como cuando muere el líder o muere un proceso que tiene un recurso, mientras que en el distribuído existen otras complejidades como la sincronización y comunicación entre los procesos.

- El proceso que detecta que el líder ya no se encuentra operativo construye un mensaje de tipo ELECTION y agrega su ID a una lista vacía, posteriormente envía al proceso sucesor este mensaje (entedemos como proceso sucesor a aquel que se encuentre operativo y de ID mayor al proceso que construye este mensaje). Cada proceso que obtiene este mensaje agrega su ID a la lista, una vez que el mensaje vuelve al proceso que inició la ronda (esto se detecta dado que cada proceso verifica si su ID se encuentra en la lista) entonces elije al proceso de ID mayor en dicha lista y modifica el tipo de mensaje a COORDINATOR de forma tal que se vuelva a pasar el mensaje por todo el anillo informando a cada proceso quién es el nuevo líder (una vez el mensaje COORDINATOR llega al proceso que inició la ronda, ya no lo vuelve a enviar).
- TODO
- Los tipos de evento son la llegada de un mensaje (que viene de otra entidad y provoca un procesamiento en la entidad que lo recibe), la activación de un reloj (que haya configurado la misma entidad) y un impulso espontáneo (aquel que inicia el procesamiento y comunicación entre procesos dado que no se genera dentro de los límites de un sistema, por ejemplo cuando alguien hace una transferencia).
- Una acción es una secuencia finita e indivisible de operaciones que se ejecuta cuando se aplica un estímulo/evento a una entidad en función de su estado actual (esta relación entre el evento y el estado de la entidad se conoce como regla) , finalmente el comportamiento se define como el conjunto de reglas que obedece una entidad (una entidad siempre sabe qué hacer ante un estímulo/evento).


El modelo garantiza que el mantenimiento se realiza cuando no hay vehículos cargando dado que el lugar “cargando energía” tiene un arco inhibidor hacia la transición “iniciar mantenimiento”. El lugar “cargando energía” debe estar vacío (sin tokens), el técnico debe estar listo para realizar el mantenimiento y el mantenimiento debe ser necesario para poder realizarlo.