Documentos de Académico
Documentos de Profesional
Documentos de Cultura
M1L2
M1L2
Introducción
Los procesadores y los sistemas operativos actuales permiten la multitarea, esto es, la
realización simultánea de dos o más actividades (al menos en apariencia). En realidad,
un ordenador con una sola CPU no puede utilizar dos actividades a la vez (Muñoz Escoí,
Argente Villaplana, Espinosa Minguet, Galdámez Saiz, García-Fornes, De Juan Marín,
Sendra Roig, 2012). Sin embargo, los sistemas operativos son capaces de ejecutar
varios programas “simultáneamente” aunque solo se disponga de una CPU: reparten el
tiempo entre dos o más actividades o utilizan los tiempos muertos de una actividad, por
ejemplo, operaciones de lectura de datos desde el teclado, visto en nuestro caso
ejemplo de la lectura 1, para trabajar en la otra.
En ordenadores con dos o más procesadores, la multitarea es real, ya que cada uno
puede ejecutar un hilo o thread diferente.
1. Hilos
Los sistemas operativos evolucionaron para permitir que más de un programa se ejecute
a la vez, ejecutando programas individuales en procesos: programas aislados que se
ejecutan de forma independiente a los que el sistema operativo asigna recursos como
memoria, identificadores de archivos y credenciales de seguridad. Si fuera necesario, los
procesos podrían comunicarse entre sí a través de una variedad de mecanismos de
comunicación generales: sockets, manejadores de señales, memoria compartida,
semáforos y archivos.
Utilización de recursos. A veces, los programas tienen que esperar a que se realicen
operaciones externas, como una entrada o una salida, y mientras esperan no pueden
realizar ningún trabajo útil. Es más eficaz utilizar ese tiempo de espera para dejar que se
ejecute otro programa.
Conveniencia. A menudo es más fácil o más deseable escribir varios programas para
que cada uno realice una sola tarea y hacer que se coordinen entre sí, según sea
necesario, que escribir un solo programa que realice todas las tareas.
Los hilos son la unidad de planificación utilizada por el sistema operativo. Es decir, el
planificador toma sus decisiones con base en el conjunto de hilos de ejecución que se
mantengan en estado preparado (ready to run) en cada momento, escogiendo de
entre ellos al que estará en ejecución (running). Cada núcleo (o “core”) del procesador
no podrá tener más de un hilo en ejecución simultáneamente.
Un hilo se suspende cuando debe esperar a que suceda algún evento. Se dice entonces
que permanece en estado suspendido (blocked). Algunos ejemplos de eventos de
este tipo son: entrada desde teclado, lectura de un bloque del disco, llegada de un
paquete de información por la red, finalización de una operación de impresión sobre una
multifunción, etc. (Muñoz Escoí et al., 2012)
Cuando tal evento sucede, el sistema operativo reactiva al hilo que había quedado
suspendido previamente. Con ello, lo pasa al estado preparado. Dicho estado indica
que el hilo está listo para ser ejecutado. Sin embargo, todavía tendrá que esperar a que
el planificador lo escoja para que sea de nuevo ejecutado en algún procesador.
Los siguientes estados conforman el ciclo de vida de los hilos en una aplicación
realizada con el lenguaje de programación Java:
Los hilos abandonan el estado de ejecución cuando hayan conseguido ejecutar todas
sus instrucciones (pasando entonces al estado terminado), cuando sean expulsados por
otros hilos (volviendo entonces al estado preparado), cuando utilicen el método
Thread.yield - es un método de los threads que permite indicarle al hardware que está
ejecutando la tarea, que puede interrumpirla y darle una oportunidad a otro thread - (que
también los deja en estado preparado) o cuando pasen a esperar la ocurrencia de algún
evento (Muñoz Escoí et al., 2012).
En caso de que se espere por algún motivo, el hilo suspenderá su ejecución y realizará
una transición a uno de estos tres estados: blocked, waiting o timed-waiting.
a) las variables compartidas: deben ser declaradas como globales, es decir, que
puedan ser utilizadas por todos los hilos del programa. De esa manera podrán
intercambiar información entre sí modificando alguna de las variables y leyendo el valor
modificado por otros hilos cuando sea conveniente;
Modelo de ejecución
Un hilo transforma su estado mediante la ejecución de sentencias. Una sentencia es una
secuencia de acciones atómicas que realizan transformaciones indivisibles.
Determinismo
Se dice que un programa es determinista cuando ante una misma combinación de datos
de entrada siempre (en cada una de las ejecuciones en las que se utilicen tales datos de
entrada) genera una misma salida.
Aunque se desconozca cómo se intercalarán las acciones atómicas ejecutadas por cada
hilo, ese no es motivo suficiente para asegurar que se perderá el determinismo en la
ejecución de un programa concurrente. La pérdida de determinismo se dará en caso de
que varios de esos hilos accedan a un mismo objeto compartido.
En ese caso, sí que será problemático el hecho de que se desconozca el orden concreto
en el que van a ejecutarse esas instrucciones, pues se podría provocar que alguna
actualización de ese objeto compartido no se aplicara de manera correcta, generando
inconsistencias.
1) seguridad: no puede ocurrir nada incorrecto durante la ejecución. Para que se respete
la seguridad, se suelen exigir las siguientes dos condiciones:
b) ausencia de interbloqueos: los hilos que accedan a los recursos de una aplicación
concurrente (o del sistema en que esta se ejecute) no podrán quedar esperándose
mutuamente evitando así el avance de todos ellos;
Referencias
Muñoz Escoí, F.D.; Argente Villaplana, E.; Espinosa Minguet, A.; Galdámez Saiz, P.;
García-Fornes , A.; De Juan Marín, R.; Sendra Roig, J. (2012). Concurrencia y
sistemas distribuidos. Universitat Politècnica.