Documentos de Académico
Documentos de Profesional
Documentos de Cultura
php/Concurrencia_de_procesos
Concurrencia de procesos
De Wiki de Sistemas Operativos
La concurrencia de procesos se refiere a las situaciones en las que dos o más procesos puedan coincidir en el
acceso a un recurso compartido o, dicho de otra forma, que requieran coordinarse en su ejecución. Para evitar
dicha coincidencia, el sistema operativo ofrece mecanismos de arbitraje que permiten coordinar la ejecución de
los procesos.
Contenido
▪ 1 El problema del productor y consumidor
▪ 2 Mecanismos de arbitraje
▪ 3 Programación concurrente
▪ 4 Sección crítica
▪ 5 Tipos de mecanismos de sincronización
▪ 5.1 ¿Cómo provocar errores de concurrencia en Java?
proceso A |-- -- --
|
proceso B | -- -- --
|_____________
Recuerde que el planificador de procesos, al desconocer la naturaleza de los procesos y sus objetivos, no
dispone de información suficiente para garantizar la secuencia de ejecución descrita en el ejemplo anterior. De
este modo, suponiendo que ambos procesos se encuentran en estado preparado, podría seleccionar al proceso B
para pasar a estado activo antes de seleccionar al proceso A, situación que no es deseada.
El planificador de procesos, como hemos visto en capítulos anteriores, emplea criterios de planificación que no
tienen en consideración el objetivo de los procesos. Podemos decir que este desconoce cuál es el propósito de
los procesos; únicamente puede observar si presentan un comportamiento más o menos interactivo.
Por tanto, el programador, a la hora de modelar los procesos, debe emplear los mecanismos de arbitraje que
ofrece el sistema operativo y que permitirían resolver el problema de concurrencia que se plantee.
1 of 5 11/21/2022, 11:51 AM
Concurrencia de procesos - Wiki de Sistemas Operativos https://1984.lsi.us.es/wiki-ssoo/index.php/Concurrencia_de_procesos
Mecanismos de arbitraje
Los mecanismos de arbitraje que ofrece el sistema operativo son dos principalmente:
▪ Mecanismos de sincronización: el sistema operativo ofrece mecanismos que permiten a los procesos
coordinar su ejecución para conseguir el objetivo sin que sucedan situaciones no deseadas, como por
ejemplo que dos o más procesos coincidan simultáneamente en el acceso a un cierto recurso que no se
puede compartir.
Programación concurrente
El término programación concurrente se emplea con frecuencia para referirse a un conjunto de programas que
funcionan en cooperación.
▪ Concurrencia: Hay un recurso común, si varios procesos modificaran la misma información a la vez, cada
uno podría destruir parte del trabajo de los demás. Si lo hacen uno tras otro, en serie, se obtendrá el
resultado correcto.
▪ Sincronización: El Sistema Operativo se encarga de enviarle señales a los procesos para coordinar su
evolución y conseguir que progrese armónicamente.
▪ Comunicación: El S.O. transmite mensajes entre los procesos, que se usan para intercambiar, enviar o
recibir información.
Se le llama programación concurrente ya que la concurrencia fue la primera forma de iterar recursos entre
procesos cooperativos.
Sección crítica
Una sección crítica se trata de una sección del código que no debe ser ejecutada por varios procesos o hilos
simultáneamente. 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.
La exclusión mutua se debe realizar de forma coordinada y eficiente, para ello se requiere:
2 of 5 11/21/2022, 11:51 AM
Concurrencia de procesos - Wiki de Sistemas Operativos https://1984.lsi.us.es/wiki-ssoo/index.php/Concurrencia_de_procesos
▪ Si hay varios esperando usar el recurso y éste se libera, uno de los que estaba esperando lo usará durante
un tiempo determinado.
Para llevar esto a cabo se necesita un protocolo que indique cuando el recurso está libre y cuando está siendo
ocupado.
▪ Optimistas: Este mecanismo considera que la frecuencia de acceso a un cierto recurso compartido es baja.
Este tipo tiene más consumo de memoria, ya que tiene que copiar el recurso compartido y, en caso de
interferencia en el hilo, tiene que volver a ejecutarlo y consume más recursos.
▪ Pesimistas: Este mecanismo permite coordinar la ejecución de dos o más procesos que acceden al recurso
compartido con una frecuencia alta.
Dependerá del criterio del programador el tipo de mecanismo que utilice ya que puede que no elija el tipo
correcto. Por ejemplo, puede que la frecuencia de acceso a un cierto recurso sea alta y el programador le asigna
un mecanismo optimista, esto provocaría no obtener el resultado esperado.
/*
* EXPLICACIÓN:
*
* Tenemos creada una lista global, "list" , que será accedida al mismo
* tiempo por varios hilos. En este código se observa como a veces se
* producen errores de concurrencia al realizar modificaciones sobre la
* lista al mismo tiempo. Este es el motivo por el que debemos usar
* mecanismos como los semáforos u otras técnicas para prevenir este
* tipo de errores.
*
* Los errores de concurrencia en java se muestran como:
* ConcurrentModificationError
*
* También es curioso notar que los errores se dan sobretodo al principio, en
* los 30 primeros segundos, luego hay hilos que no se vuelven a
* ejecutar mientras que un par de ellos de forma aleatoria, se ejecutan
* cíclicamente, uno tras el otro.
*
*/
// -----------------------------------------------------------------------------------------------------------------------
3 of 5 11/21/2022, 11:51 AM
Concurrencia de procesos - Wiki de Sistemas Operativos https://1984.lsi.us.es/wiki-ssoo/index.php/Concurrencia_de_procesos
list.add(new Random().nextInt(100));
System.out.println(list);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
// Los hilos con esta tarea añaden también otro número aleatorio de 0 a
// 100 en la lista cada seg.
e.printStackTrace();
}
}
};
// Los hilos con esta tarea eliminan un número de una posición aleatoria
// cada seg.
Runnable tarea3 = () -> {
while (true) {
String nombreHilo = Thread.currentThread().getName();
System.out.println("Hola soy el hilo " + nombreHilo);
Random r = new Random(list.size());
if (list.contains(r))
list.remove(r);
System.out.println(list);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//Creación de Hilos.
Thread hilo = new Thread(tarea);
Thread hilo2 = new Thread(tarea2);
Thread hilo3 = new Thread(tarea3);
Thread hilo4 = new Thread(tarea3);
Thread hilo5 = new Thread(tarea);
Thread hilo6 = new Thread(tarea3);
//Ejecución.
hilo.start();
hilo2.start();
hilo3.start();
hilo4.start();
hilo5.start();
hilo6.start();
4 of 5 11/21/2022, 11:51 AM
Concurrencia de procesos - Wiki de Sistemas Operativos https://1984.lsi.us.es/wiki-ssoo/index.php/Concurrencia_de_procesos
Obtenido de «https://1984.lsi.us.es/wiki-ssoo/index.php?title=Concurrencia_de_procesos&oldid=4759»
▪ Se editó esta página por última vez el 2 abr 2020 a las 17:28.
▪ El contenido está disponible bajo la licencia Attribution-ShareAlike-NonCommercial 3.0 Spain a menos
que se indique lo contrario.
5 of 5 11/21/2022, 11:51 AM