• Publicidad

Problema de los filósofos comensales

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problema de los filósofos comensales

Notapor batussay » 2007-09-20 10:03 @460

Hola a todos
Bueno me han dicho que realice un programa para el problema de los filósofos comensales con "threads". Estoy empezando a desarrollarlo en Perl pero la verdad que soy nuevo en este lenguaje y como que no entiendo bien cómo usar hilos y buscando en Internet he encontrado muy pocos ejemplos sobre esto, sobretodo "sincronización de hilos"; agradecería mucho si alguien me pudiera proporcionar un manual relacionado con este tema.

Gracias de antemano :lol:
Avatar de Usuario
batussay
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2007-09-20 04:59 @249

Publicidad

Notapor Kiloko » 2007-09-20 12:04 @544

Buen día y bienvenido al foro Perl En Español.

Antes que nada ¿de qué se trata el problema los filósofos comensales?, ¿cuál es la estructura que vas a manejar?, ¿ya tienes planeado un desarrollo?, ¿por qué "threads"?

Platícanos un poco más... :D
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor explorer » 2007-09-20 12:24 @558

JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Perl user » 2007-09-20 14:43 @655

Mira..

Unos de los objetivos de la implementación de una solución para dicho problema, es demostrar algunos de los riesgos de programación con múltiples threads, para acceso a una serie de recursos de manera concurrente (en este caso los tenedores).

La finalidad es, demostrar como los problemas tales como starvation y race conditions se presentan ante la falta de una apropiada sincronización.

Yo en lo personal te recomiendo que dicho problema lo abordes con un lenguaje cuyo "mainstream" sean los threads, por ejemplo C (por medio de POSIX threads/ntpl), C++ o Java.

El caso de Perl podrá costarte un poco de trabajo si realmente no conoces NADA del lenguaje, y sobre todo por la manera en la que los mecanismos de sincronización y threading están implementados.

Sin mencionar que necesitas una instalación base de Perl con soporte para ithreads, (o por medio del módulo forks).

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor batussay » 2007-09-21 08:03 @377

Bueno, es un trabajo que me han dejado en la Universidad por lo que estoy obligado a desarrollarlo en Perl.

He encontrado en Internet varios ejemplos de la solución de este problema en C, C++ y Java, pero estoy teniendo problemas para pasarlo a Perl.

Enunciado del problema

Cinco filósofos se sientan alrededor de una mesa y pasan su vida cenando y pensando. Cada filósofo tiene un plato de fideos y un tenedor a la izquierda de su plato. Pero para comer los fideos son necesarios dos tenedores y cada filósofo puede tomar el tenedor que esté a su izquierda o derecha, uno por vez (o sea, no puede tomar los dos al mismo tiempo, pero puede tomar uno y después el otro). Si cualquier filósofo coge un tenedor y el otro está ocupado, se quedará esperando, con el tenedor en la mano, hasta que pueda coger el otro tenedor, para luego empezar a comer.

Si dos filósofos adyacentes intentan tomar el mismo tenedor a una vez, se produce una condición de carrera: ambos compiten por tomar el mismo tenedor, y uno de ellos se queda sin comer.

Si todos los filósofos cogen el tenedor que está a su derecha al mismo tiempo, entonces todos se quedarán esperando eternamente, porque alguien debe liberar el tenedor que les falta. Nadie lo hará porque todos se encuentran en la misma situación (esperando que alguno deje sus tenedores). Entonces los filósofos se morirán de hambre. Este bloqueo mutuo se denomina deadlock.

El problema consiste en encontrar un algoritmo que permita que los filósofos nunca se mueran de hambre.
Avatar de Usuario
batussay
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2007-09-20 04:59 @249

Notapor explorer » 2007-09-21 08:49 @409

¡Justo!. El enunciado del problema está copiado de Wikipedia, el enlace que puse.

En la misma página hay unas posibles soluciones.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Reft » 2008-08-26 05:59 @291

Hola...

Yo no sé si hay que usar algún programa para averiguar el problema... ¿Todo eso por averiguarlo?... A lo mejor son ejercicios que mandan a la gente, no sé... En tal caso, yo pensé algo aunque no sé si ayudará, aunque a mí me dijeron que eran con platos de fideos y palillos... bueno en tal caso os lo explico.

Hay una mesa con 5 platos de fideos y 5 palillos para que 5 filósofos coman, da igual el orden...

1. El primer problema es, no se puede comer con un palillo, ni tampoco partirlo en dos, no se podría comer el plato de fideos. Entonces lo único que se puede hacer es que alguno suelte el palillo, pero claro... ¿quién lo va a soltar?
- Yo pensé que no se puede hacer 5 platos de fideos a la vez... entonces tuvo que hacerse normal... 1º un plato, después otro y así hasta 5... oks... si en la mesa se ponen los platos, normalmente se ponen por orden, uno al lado de otro, y como no tenían palillos de sobra... pusieron 5... una vez se sentaran los filósofos, habría un plato que sería el que más quemara.. se podría deducir al ver cuál es el que más humo echa... eso quiere decir lo siguiente:

Al plato que más quema con su respectivo filósofo le llamamos "5" y al que menos "1". Si está colocado por orden el 1 estaría al lado del 5... pero hay un problema... el orden de los platos no se sabe si los pusieron de derecha a izquierda o viceversa... entonces si es de la 1º forma, el 1 estaría a la derecha del 5 y si es de la otra estaría a la izquierda... oks.. mi teoría es... el filósofo esperaría a que se enfriase su plato y de mientras le dejaría su palillo al filósofo nº 1, porque es el que tiene el plato menos caliente. (Pero, ¿y fuera de izquierda a derecha?, pues como la mano izquierda de todos los filósofos está libre, porque cogen el palillo con la derecha, el 5 se lo pasaría al 4, el 4 al 3, el 3 al 2 y el 2 al 1, así todo ya estaría para que el filósofo nº 5 le dejara su palillo con la mano izquierda al 1 para que éste lo recibiera con su mano derecha, que ahora permanece libre). Ahora da igual la forma el 5 esperaría a que se enfriara y el filósofo nº 1 comería con su palillo y el suyo, y después le devolvería el palillo del nº 5 y el nº 1 al terminar su plato se lo dejaría al nº 2 que estaría a su lado... pero hay otro problema.

2. El segundo problema es que si has usado un palillo el otro no lo va a usar porque ya está usado, no vas a comer con algo que otro se ha metido en su boca xDD... bueno el caso es que el filósofo nº 2 le daría la vuelta al palillo que el "1" le ha dejado y así no estaría manchado y comería con el suyo... (seguimos el orden, primero come el 1 que es el que tiene el plato mas enfriado, después el 2 y así...) después el 3 daría la vuelta al del nº 2 y comería con el suyo y así todos podrían comer, porque los 5 palillos se ha usado por ambos lados...

- La pista me la dio nuestro siglo XXI; si os dais cuenta son como 5 palillos dos de ellos entrecruzados y el otro normal... a veces el azar puede ayudar al ser humano xDDD... entonces al formarse el nº 5 si fueran palillos me dio a pensar lo del último plato que es el que más quema.

P.D: No creo que sirva de mucho xDD, pero explico lo que se me ocurrió. GRACIAS.
Reft
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-08-26 05:23 @265

Notapor explorer » 2008-08-26 06:50 @326

Bienvenido a los foros de Perl en Español, Reft.

Reft escribiste:Yo no sé si hay que usar algún programa para averiguar el problema... ¿Todo eso por averiguarlo?... A lo mejor son ejercicios que mandan a la gente, no sé... En tal caso, yo pensé algo aunque no sé si ayudará, aunque a mí me dijeron que eran con platos de fideos y palillos...

El porqué del ejercicio está puesto en el primer párrafo de la página de este problema, en Wikipedia. El enlace ya lo puse antes. Es muy útil para los que estudian informática, pues ayuda pensar en los sistemas que tienen recursos limitados (los tenedores) frente a los clientes (programas y usuarios) para darles servicios a todos (la comida), en un tiempo razonable. Y evitar la peligrosa condición de carrera.

Como también dice ese párrafo, está basado en el escenario planteado por ti, con la de los palillos.

En la página también verás varias soluciones, todas ellas con aplicación para la informática.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Reft » 2008-08-26 06:54 @329

¡¡Aaaahhh...!! Así que para evitar la condición de carrera... Está bien, jejeje... a mí se me ocurrió eso, y lo comenté; bueno, gracias por aclarármelo.
Reft
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-08-26 05:23 @265


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron