Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Preguntas de autoevaluación
Estados
1. Nuevo (new): Cuando el proceso es creado.
2. Ejecutando (running): El proceso tiene asignado un procesador y está
ejecutando sus instrucciones.
3. Bloqueado (waiting): El proceso está esperando por un evento (que se complete
un pedido de E/S o una señal).
4. Listo (ready): El proceso está listo para ejecutar, solo necesita del recurso
procesador.
5. Finalizado (terminated): El proceso finalizó su ejecución.
Transiciones
Nuevo –> Listo – Al crearse un proceso pasa inmediatamente al estado listo.
Listo –> Ejecutando – En el estado de listo, el proceso solo espera para que se le
asigne un procesador para ejecutar (tener en cuenta que puede existir más de un
procesador en el sistema.
Ejecutando –> Listo – Ante una interrupción que se generé, el proceso puede perder
el recurso procesador y pasar al estado de listo.
Ejecutando –> Bloqueado – A medida que el proceso ejecuta instrucciones realiza
pedidos en distintos componentes (ej.: genera un pedido de E/S). Teniendo en cuenta
que el pedido puede demorar el proceso es puesto en una cola de espera hasta que
se complete su pedido.
Bloqueado –> Listo– Una vez que ocurre el evento que el proceso estaba esperando
en la cola de espera, el proceso es puesto nuevamente en la cola de procesos listos.
Ejecutando -> Terminado – Cuando el proceso ejecuta sus última instrucción pasa al
estado terminado. El sistema libera las estructuras que representan al proceso.
3. Presente un ejemplo de cada uno de los tres patrones de trabajo para la
paralelización de la ejecución en varios hilos.
Jefe/Trabajador
Un thread oficia de “jefe” asignando tareas a threads trabajadoras
Cada thread trabajadora realiza tareas hasta finalizar, interrumpiendo al jefe para
indicar que se encuentra disponible nuevamente. Alternativamente, el jefe consulta
periódicamente a los threads para ver si se encuentran ociosas
Equipo de Trabajo
Múltiples threads trabajan conjuntamente para realizar una tareas única. La tarea es
dividida en piezas que se ejecutan en paralelo, cada thread ejecuta una pieza
Ejemplo: thread=personas tarea=limpiar una casa
línea de ensamblado
Una tarea es dividida en pasos. Los pasos deben ser realizados en secuencia para
producir un único resultado. El trabajo realizado en cada paso basado en el resultado
generado por el paso anterior y es necesario para el siguiente
Un ejemplo es cualquier proceso de ensamblado, como ser la línea de producción de
automóviles.
4. Defina los siguientes conceptos, e ilustre las relaciones entre ellos:
Concurrencia:
Concurrencia: es la capacidad de diferentes partes o unidades de un programa,
algoritmo o problema para ejecutarse fuera de orden o en orden parcial, sin afectar el
resultado final.
Un ejemplo de un problema de concurrencia sería el siguiente: dados dos
procesos A (productor) y B (consumidor) que se ejecutan indefinidamente en el
tiempo, el proceso A debe recibir tiempo de ejecución antes que B. Tras esto, el
proceso B debe recibir su oportunidad de ejecución, dando paso de nuevo al
proceso A y así sucesivamente, siguiendo un esquema de alternancia estricta.
Operación atómica
Una operación atómica es una
operación que se ejecuta "todo a la
vez", sin ninguna posibilidad de que
otros hilos observen o modifiquen el
estado durante la ejecución de la
operación atómica.
Condición de carrera
La condición de carrera ocurre cuando dos o más procesos acceden un recurso
compartido sin control, de manera que el resultado combinado de este acceso
depende del orden de llegada.
Por ejemplo, que dos clientes de un banco realizan cada uno una operación en
cajeros diferentes al mismo tiempo.
Sección crítica
se define como a la porción de código de un programa de computador el cual accede
a un recurso compartido que no debe de ser accedido por más de un hilo en ejecución
(thread).
Un ejemplo de sección crítica es la sección de código en la que se accede a un
recurso compartido. Para evitar el acceso simultaneo a la sección crítica se
emplean mecanismos que garantizan la exclusión mutua.
Espera activa
“La espera activa es una técnica en la cual un proceso comprueba continuamente si
una condición se cumple o si se produce un evento”
SystemD va en contra de la
filosofía Unix: "haz una cosa
y hazla bien",
representando una colección
compleja de docenas de
binarios fuertemente
acoplados
El proceso de inicio de servicios es estrictamente síncrono. Se espera a que un
daemon esté corriendo antes de iniciar el próximo). Esto impacta en el tiempo de
inicio.
Necesidad de chequear dependencias antes de iniciar un servicio. Por ejemplo, que el
servicio de red esté disponible antes de iniciar un web server.
Cualquier evento posterior al inicio del equipo (identificación y montaje de dispositivos
extraíbles, por ejemplo) necesitan intervención manual del usuario.
SystemD – Ventajas
A su favor tengo que decir que SystemD es eficiente y hace uso de cgroups para
evitar procesos zombies.
SystemD es que se compone de unidades (*. servicies, *. sockets, *.targets…). Son
elementos básicos que podrás encontrar en /lib/SystemD/system o
/usr/lib/SystemD/system/. También te recomiendo que eches un vistazo a
/etc/SystemD/system.
Desventajas
Este sustituto del tradicional init no ha gustado a muchos, pero se ha impuesto en la
mayoría de las distros. Algunas de las cosas que no gustan son su mayor complejidad
al no respetar la filosofía KISS, que los logs se almacenan en formato binario y eso
puede dejarlos corruptos en caso de algún fallo, por lo que no se podrían leer, se
entromete en la gestión de energía, cifrado, etc.
2. Problemas adicionales de sincronización De todo el libro, es en este capítulo
en el que más se trata directamente con código. Si bien para presentar como
casos de ejemplo se emplearon cinco de los casos clásicos (el jardín
ornamental, el problema productor-consumidor, el problema lectores-
escritores, la cena de los filósofos y los fumadores compulsivos), hay
muchos otros casos ampliamente analizados.
El libro libremente redistribuible The little book of semaphores (Downey 2008)
tiene más de 20 problemas de sincronización, planteados junto con su
implementación empleando semáforos en el lenguaje Python. Profundizar en
alguno de estos problemas adicionales ayudará al aprendizaje de los temas
expuestos.
Un semáforo ilimitado. Opcionalmente, inicialice con un recuento de recursos, luego
acquire y release recursos según sea necesario. Intentar acquire cuando el recuento
es cero suspende el hilo verde de llamada hasta que el recuento vuelva a ser distinto
de cero.
Un semáforo acotado verifica para asegurarse de que su valor actual no exceda su
valor inicial. Si lo hace, se genera ValueError. En la mayoría de las situaciones, los
semáforos se utilizan para proteger recursos con capacidad limitada. Si el semáforo
se libera demasiadas veces, es un signo de error. Si no se proporciona, el valor
predeterminado es