Diferencia entre revisiones de «Solución de los ejercicios de concurrencia»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
(Corregido Observación)
m (Ejercicio 2)
 
(No se muestran 9 ediciones intermedias de 5 usuarios)
Línea 1: Línea 1:
+
== Ejercicio 1==
      | #1| #2| #3|  |  |  | #4| #1| #2|  |  |  | #3| #4|#1-El programa ya termina
 
H1    |---|---|---|  |  |  |---|---|---|  |  |  |---|---|---|  |  |  |  |  |
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |  |  |  | #1| #2| #2|  |  |  | #2| #2| #2|  |  |  | #2| #3| #4| #1| #2| #3| #4| El programa termina.
 
H2    |  |  |  |---|---|---|  |  |  |---|---|---|  |  |  |---|---|---|---|  |
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
 
      0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20
 
  
 +
      | #1| #2| #3|  |  |  | #4| #1| #2|  |  |  | #3| #4| #1|  |  |  |  |  |  |  |  |
 +
H1    |<--|---|---|  |  |  |---|---|---|  |  |  |---|---|-->|  |  |  |  |  |  |  |  |
 +
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 +
      |  |  |  | #1| #2| #2|  |  |  | #2| #2| #2|  |  |  | #2| #3| #4| #1| #2| #3| #4| #1|
 +
H2    |  |  |  |<--|---|---|  |  |  |---|---|---|  |  |  |---|---|---|---|---|---|---|-->|
 +
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 +
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
 +
      0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20 21  22  23
  
En este ejercicio, el hilo 2 se queda esperando continuamente a que el hilo 1 libere el cerrojo para poder acceder a la función.
+
Algunas observaciones:
El programa finaliza en el hilo 1 cuando llega dos veces a la instrucción 4 (bucle for).
+
* Los hilos '''no''' comparten la variable ''i''. Esta variable se trata de una variable local, por tanto, no es una variable que ambos hilos compartan. Únicamente las variables globales son compartidas por dos o más hilos.
 +
* Al ser los cerrojos un control de concurrencia de espera activa, se comprueba continuamente la condición que nos permite acceder a la sección crítica.
  
Modificación:
+
--[[Usuario:Pneira|Pneira]] 07:33 10 may 2011 (UTC)
  
Solución:
+
== Ejercicio 2==
  
 
      | #1| #2| #3|  |  |  | #4| #1| #2|  |  |  | #3| #4| > |  |  |  |  |  |  |  |
 
H1    |---|---|---|  |  |  |---|---|---|  |  |  |---|---|---|  |  |  |  |  |  |  |
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |  |  |  | #1| __| __|  |  |  | __| __| __|  |  |  | #2| #3| #4| #1| #2| #3| #4|
 
H2    |  |  |  |---|---|---|  |  |  |---|---|---|  |  |  |---|---|---|---|---|---|---|
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
 
      0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20 21  22
 
  
Posible solución:
+
      | #1| #2| #3|  |  |  | #4| #5| #1|  |  |  | #2| #2| #2|  |  |
 +
H1    |<--|---|---|  |  |  |---|---|---|  |  |  |---|---|---|  |  |
 +
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 +
      |  |  |  | #1| #2| #2|  |  |  | #2| #3| #4|  |  |  | #5| #1|
 +
H2    |  |  |  |<--|---|---|  |  |  |---|---|---|  |  |  |---|---|
 +
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 +
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
 +
      0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17
  
Los hilos comparten variables por lo que la variable i está siendo compartida por ambos hilos. Además, al ser los cerrojos un control de concurrencia de espera activa, tiene que comprobar continuamente la condición que me permite acceder a la sección crítica. En un bucle for, el incremento se hace una vez realizada la iteración, por lo que tendrá que comprobar en la instrucción 1 si el contador cumple la condición o no. Dicho esto y si no me equivoco la solución sería la siguiente--[[Usuario:Jherrera|Jherrera]]:
+
      |  | #2| #3| #4|  |  |  | #5| #1|  | 
 +
H1    |  |---|---|---|  |  |  |---|-->|  | 
 +
      |  |  |  |  |  |  |  |  |  |  | 
 +
      | #2|  |  |  | #3| #4| #5|  |  | #1| 
 +
H2    |---|  |  |  |---|---|---|  |  |--->
 +
      |  |  |  |  |  |  |  |  |  |  | 
 +
      |___|___|___|___|___|___|___|___|___|___|
 +
      17  18  19  20  21  22  23  24  25  26  27
  
      | #1| #2| #3|  |  |  | #4| #1| #2|  |  |  | #3| #4| #1|  |  |  |  |  |
+
Explicación:
H1    |---|---|---|  |  |  |---|---|---|  |  |  |---|---|---|  |  |  |  |  |
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |  |  |  | #1| #2| #2|  |  |  | #2| #2| #2|  |  |  | #2| #3| #4| #1|  |
 
H2    |  |  |  |---|---|---|  |  |  |---|---|---|  |  |  |---|---|---|---|  |
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
 
      0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20
 
  
 +
En este ejercicio la implementación de cerrojos no resuelve el problema de concurrencia (véase el instante 22, en el que ambos hilos están en la sección crítica).
  
Posible solución2: Lo que explicas esta muy bien, pero creo que la condición que expones en tu apartado es i=<2, cuando el ejercicio pide i<2. Por lo que habria que cortar un trozo, ¿no?
+
El problema se debe, como se comentó en clase, a que la comprobación del valor del cerrojo y el establecimiento de su valor debe ser una '''operación atómica'''. Sin embargo, en el instante de tiempo 17 se comprueba el valor del cerrojo, pero no se establece el nuevo valor. Es decir, habría que emplear una operación que evite que quedemos entre la comprobación del valor del cerrojo y su modificación.
  
      | #1| #2| #3|  |  |  | #4| #1| #1|  |  |  |  |  |  |  |  |  |  |  |
+
--[[Usuario:Pneira|Pneira]] 17:06 23 nov 2011 (UTC)
H1    |---|---|---|  |  |  |---|---|---|  |  |  |---|---|---|  |  |  |  |  |
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |  |  |  | #1| #2| #2|  |  |  | #2| #3| #4|  |  |  |  |  |  |  |  |
 
H2    |  |  |  |---|---|---|  |  |  |---|---|---|  |  |  |---|---|---|---|  |
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
 
      0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17 18  19  20
 
  
Yo creo que esta bien ya que es i<2 y empieza con i = 0  --[[Usuario:Luidela1|Luidela1]] 15:35 9 may 2011 (UTC)
+
== Ejercicio 3==
 +
Al tener un quantum de únicamente dos unidades, el planificador cambia de proceso antes de actualizar el valor del cerrojo, lo que provoca que se produzca una situación de concurrencia.
  
  
Observación:
+
6.5[[Semáforos | Semáforos]]
--> Me parece que al ser dos hilos diferentes,aunque compartan el mismo código, las variables son individuales para cada hilo, con lo que cada hilo hace el bucle for completo,quedando la siguiente solución:
 
 
 
      | #1| #2| #3|  |  |  | #4| #1| #2|  |  |  | #3| #4| #1|  |  |  |  |  |  |  |  |
 
H1    |<--|---|---|  |  |  |---|---|---|  |  |  |---|---|-->|  |  |  |  |  |  |  |  |
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |  |  |  | #1| #2| #2|  |  |  | #2| #2| #2|  |  |  | #2| #3| #4| #1| #2| #3| #4| #1|
 
H2    |  |  |  |<--|---|---|  |  |  |---|---|---|  |  |  |---|---|---|---|---|---|---|-->|
 
      |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
 
      0  1  2  3  4  5   6  7  8  9  10  11  12  13  14  15  16  17  18  19  20 21  22  23
 
[[Usuario:JCGarrido|JCGarrido]]
 

Revisión actual del 16:18 25 nov 2017

Ejercicio 1

      | #1| #2| #3|   |   |   | #4| #1| #2|   |   |   | #3| #4| #1|   |   |   |   |   |   |   |   |
H1    |<--|---|---|   |   |   |---|---|---|   |   |   |---|---|-->|   |   |   |   |   |   |   |   |
      |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
      |   |   |   | #1| #2| #2|   |   |   | #2| #2| #2|   |   |   | #2| #3| #4| #1| #2| #3| #4| #1|
H2    |   |   |   |<--|---|---|   |   |   |---|---|---|   |   |   |---|---|---|---|---|---|---|-->|
      |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
      0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20 21  22  23

Algunas observaciones:

  • Los hilos no comparten la variable i. Esta variable se trata de una variable local, por tanto, no es una variable que ambos hilos compartan. Únicamente las variables globales son compartidas por dos o más hilos.
  • Al ser los cerrojos un control de concurrencia de espera activa, se comprueba continuamente la condición que nos permite acceder a la sección crítica.

--Pneira 07:33 10 may 2011 (UTC)

Ejercicio 2

      | #1| #2| #3|   |   |   | #4| #5| #1|   |   |   | #2| #2| #2|   |   |
H1    |<--|---|---|   |   |   |---|---|---|   |   |   |---|---|---|   |   |
      |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
      |   |   |   | #1| #2| #2|   |   |   | #2| #3| #4|   |   |   | #5| #1|
H2    |   |   |   |<--|---|---|   |   |   |---|---|---|   |   |   |---|---|
      |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
      |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
      0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17
      |   | #2| #3| #4|   |   |   | #5| #1|   |   
H1    |   |---|---|---|   |   |   |---|-->|   |   
      |   |   |   |   |   |   |   |   |   |   |   
      | #2|   |   |   | #3| #4| #5|   |   | #1|   
H2    |---|   |   |   |---|---|---|   |   |--->
      |   |   |   |   |   |   |   |   |   |   |   
      |___|___|___|___|___|___|___|___|___|___|
     17  18  19   20  21  22  23  24  25  26  27

Explicación:

En este ejercicio la implementación de cerrojos no resuelve el problema de concurrencia (véase el instante 22, en el que ambos hilos están en la sección crítica).

El problema se debe, como se comentó en clase, a que la comprobación del valor del cerrojo y el establecimiento de su valor debe ser una operación atómica. Sin embargo, en el instante de tiempo 17 se comprueba el valor del cerrojo, pero no se establece el nuevo valor. Es decir, habría que emplear una operación que evite que quedemos entre la comprobación del valor del cerrojo y su modificación.

--Pneira 17:06 23 nov 2011 (UTC)

Ejercicio 3

Al tener un quantum de únicamente dos unidades, el planificador cambia de proceso antes de actualizar el valor del cerrojo, lo que provoca que se produzca una situación de concurrencia.


6.5 Semáforos