Corrección Flashcards
Qué es la corrección en un programa?
Corrección en este contexto se refiere a la garantía de que un programa funciona correctamente y que producirá resultados esperados.
Explicá las propiedades Safety y Liveness
La propiedad safety hace referencia a la ausencia de comportamiento incorrecto en un programa. Implica las propiedades de exclusión mutua y a la ausencia de deadlocks.
La propiedad liveness hace referencia a la garantía de que el sistema eventualmente progresará y alcanzará un resultado deseable. Implica las propiedades de fairness en el scheduler y a la ausencia de starvation.
Qué es una race condition?
Una race condition ocurre cuando dos entidades intentan leer y/o escribir el mismo recurso a la vez, sin hacerlo de manera atómica.
Debido a que estas operaciones no son atómicas, puede ocurrir que el scheduler justo encaje las ejecuciones de tal manera que uno de los hilos lee un valor inválido y pisa el valor de manera que lleva a resultados inválidos.
Qué es una sección crítica en un programa?
La sección crítica es una parte del código que accede a recursos compartidos y que debe ejecutarse de manera exclusiva para evitar problemas de concurrencia, como race conditions.
Cuáles son las especificaciones de corrección que se deben cumplir en la sección crítica? Por qué es importante cada una?
Los requisitos de corrección son:
- Exclusión mutua: para que solamente una tarea pueda ejecutar la sección crítica a la vez en un momento dado, y evitar race conditions.
- Ausencia de deadlocks: si dos procesos están tratando de entrar en la sección crítica, eventualmente alguno de ellos tenga éxito, y el programa no se quede trabado para siempre.
- Ausencia de starvation: todos los procesos que intentan pedir el recurso, eventualmente podrán acceder a él.
Qué es un lock? Para qué sirve? Qué funciones implementan?
Los locks son mecanismos de sincronización, utilizados en programación concurrente para garantizar la exclusión mutua entre procesos o hilos que acceden a recursos compartidos.
Implementan las funciones lock(), que bloquea al hilo actual hasta que se le dé el derecho a usar el recurso; y la función unlock, que se llama cuando se termina de usar el recurso.
Qué es un deadlock?
Un deadlock es una situación que puede darse en ambientes concurrentes, donde dos o más hilos comparten dos o más recursos, y debido a cómo el scheduler organizó los hilos, resulta que los hilos no llegaron a pedir todos los recursos que necesitan para avanzar, y los que les faltan los tienen lockeados otros procesos.
Por ejemplo, si los procesos 1 y 2 ambos necesitan los recursos A y B, pero debido a cómo los ejecutó el scheduler, el proceso 1 llegó a reservar el recurso A y el 2, el B, llegamos a un deadlock. Ninguno puede avanzar (les falta el otro recurso), pero tampoco sueltan los recursos actuales. El sistema queda congelado, bloqueado.
El problema clásico de deadlocks es el de los filósofos.
Qué métodos se pueden implementar para combatir deadlocks?
El más común es implementar un timer por cada recurso, y que salte cuando el recurso lleva “demasiado tiempo” lockeado, por lo que se presupone que se llegó a un deadlock.
Qué es el starvation? Qué tiene que ver con que el scheduler sea “fair”?
La inanición ocurre cuando un proceso no puede completar su ejecución porque los recursos, aunque disponibles, nunca le son alocados a él, generalmente porque otros procesos tienen prioridad o porque el scheduler no es justo y no distribuye los tiempos de cada proceso correctamente.
Por esto es importante que el scheduler sea “fair”, o justo. Para que el scheduler no deje que ningún proceso se quede sin acceso al recurso, y ningún proceso muera por inanición, sin poder completarse nunca.