1. Definición de concurrencia
- Dos o más procesos decimos que son concurrentes, paralelos, o que se ejecutan concurrentemente, cuando son procesados almismo tiempo, es decir, que para ejecutar uno de ellos, no hace falta que se haya ejecutado otro.
- En sistemas multiprocesador, esta ejecución simultánea podría conseguirse completamente, puesto que podremos asignarle, porejemplo, un proceso A al procesador A y un proceso B al procesador B y cada procesador realizaran la ejecución de su proceso.
- Cuando tenemos un solo procesador se producirá un intercalado delas instrucciones de ambos procesos, de tal forma que tendremos la sensación de que hay un paralelismo en el sistema (concurrencia, ejecución simultánea de más de un proceso).
- Ahora bien, está claro que en esto tenemos que tener en cuenta que mientras un proceso está escribiendo unvalor en una variable determinada, puede darse el caso que otro proceso que es concurrente al primero vaya aleer o escribir en esa misma variable, entonces habráque estudiar el caso en el que un proceso haga unaoperación sobre una variable (o recurso en general) yotro proceso concurrente a él realice otra operación detal forma que no se realice correctamente. Para estudiaresto, y determinar el tipo de operaciones que se puedenrealizar sobre recursos compartidos utilizaremos lascondiciones de Bernstein.
2. Condiciones de Bernstein.
- Condiciones que nos determinan si dos procesos sepueden ejecutar de forma paralela.
- Condiciones de Bernstein: Dos procesos se puedenejecutar de forma concurrente si se verifican lassiguientes condiciones:
R(S1) es el conjunto de variables cuyo valor es accedidodurante la ejecución de la instrucción.
W(S1) es el conjunto de variables cuyo valor cambiadurante la ejecución de la instrucción.
R(S2) Intersección W(S1) = {conjunto vacío}
R(S1) Intersección W(S2) = {conjunto vacío}
W(S1) Intersección W(S2) = {conjunto vacío}
3. Grafos de precedencia.
Es un grafo acíclico y orientado cuyos nodos corresponden a sentencias individuales. Un arco desde un nodo si a un nodo sj significa que la sentencia sj puede ejecutarse sólo después de que si haya terminado su ejecución.
4. Instrucciones para crear procesos.
- fork / join
- fork etiqueta: La etiqueta nos indica el punto donde está el código de una de esas ejecuciones concurrentes. El código de la otra ejecución lo escribiremos justo debajo de fork etiqueta.
- join variable: La variable especifica el número de instrucciones concurrentes que vamos a unir en una sola.
- parbegin / parend
fork: Genera dos ejecuciones concurrentes en un programa.
join: Hace lo contrario, recombinando dos ejecuciones concurrentes en una sola.
Encerraremos entre Parbegin / Parend las instrucciones que queramos ejecutar concurrentemente.
Ejemplo:
A;
B;
C;
Parend
Conseguiremos ejecutar A, B, C de forma simultánea.