matiascelasco

Dinner Philosophers problem: Passing the baton fair solution

Apr 20th, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. # esta es una versión fair de http://pastebin.com/ubHAuZ6h
  2. # el problema que tenía la solución anterior era que se podía dar el caso de que mi vecino izquierdo y mi vecino derecho # se alternaran y dejándome morir de hambre
  3.  
  4. # la solución que se me ocurrio consiste en llevar la cuenta de las veces que comió cada uno y establecer un
  5. # límite de tolerancia L de manera tal que un filosofo nunca haya comido L veces más que sus vecinos.
  6.  
  7. # habría que ver como se elige el valor de L. se me ocurre que cuanto más chico sea menos frecuentes van a ser esas
  8. # injusticias pero por otro lado se va a aprovechar menos el paralelismo.
  9. # de todas maneras, si L es grande y las injusticias esas son muy frecuentes, no quiere decir que no sea fair.
  10. # a fairness le alcanza con que eventualmente se ejecute (?)
  11.  
  12. # lo bueno de passing de baton es que sólo tengo que cambiar las condiciones de los protocolos de entrada y salida
  13.  
  14. # los filosofos pueden estar en tres estados: pensando, hambriento o comiendo
  15. enum state[N];
  16. sem s[N] = ([N] 0);
  17. int veces[N] = ([N] 0);
  18. sem e = 1;
  19.  
  20.  
  21. function left(i){
  22. return (i - 1) mod N;
  23. }
  24.  
  25. function right(i){
  26. return (i + 1) mod N;
  27. }
  28.  
  29. process Philosopher [i := 0 to N - 1] {
  30.  
  31. while (true){
  32.  
  33. state[i] = THINKING;
  34. pensarComoUnFilosofo();
  35.  
  36. P(e);
  37. if (state[left(i)] == EATING state[right(i)] == EATING or
  38. veces[i] - veces[left(i)] >= L or veces[i] - veces[rigth(i)] >= L){
  39. state[i] = HUNGRY;
  40. V(e);
  41. P(s[i]);
  42. }
  43. state[i] = EATING;
  44. veces[i] += 1;
  45. V(e);
  46.  
  47. comerComoUnCampeon();
  48.  
  49. # a partir de acá viene el código de lo que vendría a ser el SIGNAL
  50. P(e);
  51. # me fijo si el tipo que tengo a la izquierda esta esperando mi tenedor
  52. if (state[left(i)] == HUNGRY and
  53. veces[i] - veces[left(left(i))] < L and
  54. state[left(left(i))] != EATING) {
  55. V(s[left(i)]);
  56. }
  57. # me fijo si el tipo que tengo a la derecha esta esperando mi tenedor
  58. elif (state[right(i)] == HUNGRY and
  59. veces[i] - veces[right(right(i))] < L and
  60. state[right(right(i))] != EATING) {
  61. V(s[right(i)]);
  62. }
  63. else {
  64. V(e);
  65. }
  66. }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment