Según lo escrito en EWD310 "Ordenación jerárquica de procesos secuenciales" , parece que el número 5 ha sido elegido con fines educativos, con el fin de facilitar a los estudiantes la comprensión del algoritmo diseñado para demostrar la solución del problema.
Este mismo documento respalda aún más la idea de que 5 no es realmente relevante para un problema general, primero declarando explícitamente que "el problema podría haber sido planteado por 9 o 25 filósofos ..." y luego, representándolo en términos de dos que operan simultáneamente entidades, "clase A y clase B, que comparten el mismo recurso ..."
La solución utilizada por Dijkstra introduce tres "estados de filósofo": pensar, comer, tener hambre. El código presentado para resolver el problema opera estos tres estados, junto con un número no relacionado de filósofos.
Si el autor hubiera elegido el número de filósofos 2, 3 o 4, esto podría causar confusión en los estudiantes que leen el código, ya sea que el número elegido esté relacionado con la cantidad de estados u otra cosa. Esto se puede comprobar fácilmente tratando los números mencionados en la descripción citados de EWD310 a continuación: nota, por ejemplo, cómo esto cambiaría [0:4]
a [0:3]
, [0:2]
, [0:1]
y las declaraciones que implica mod
.
A diferencia de esto, el número 5 parece bastante inocente y no invoca asociaciones innecesarias. Se puede decir que ha sido elegido para ilustrar mejor esa cantidad de filósofos es, bueno, arbitrario .
El algoritmo mencionado se presenta en EWD310 de la siguiente manera:
... asociamos con cada filósofo una variable de estado, "C", por ejemplo, donde
C[i] = 0
significa: filósofo i
está pensando
C[i] = 2
significa: filósofo i
está comiendo.
...
presentamos para la última transición un estado intermedio
C[i] = 1
significa: filósofo i
tiene hambre
Ahora cada filósofo pasará cíclicamente por los estados 0, 1, 2, 0 ...... La siguiente pregunta que debe hacerse es: ¿cuándo tiene lugar la (peligrosa) transición del 1 al 2 para el filósofo K
?
...
En el universo suponemos declarado
1) el semaphore mutex
, inicialmente = 1
2) el integer array C[0:4]
, con inicialmente todo el elemento = 0
3) semaphore array prisem[0:4]
inicialmente con todos los elementos = 0
4) procedure test (integer value K);
if C[(K-1) mod 5] ≠ 2 and C[K]= 1
and C[(K+1) mod 5] ≠ 2 do
begin C[K]:= 2; V(prisem[K]) end;
(Este procedimiento, que resuelve la inestabilidad K
cuando está presente, solo se llamará desde una sección crítica).
En este universo, la vida del filósofo w
ahora puede codificarse
cycle begin think;
P (mutex);
C[w]:= 1; test (w);
V(mutex);
P(prisem[w]); eat
P(mutex);
C[w]:= 0; test [(w+l) mod 5];
test [(w-1) mod 5];
V(mutex)
end
Y esto concluye la solución que buscaba ...