• Publicidad

Problema de filósofos con procesos pesados

Todo lo relacionado con lenguajes de programación distintos de Perl: PHP, Java, C++, Ruby, Python, etc.

Problema de filósofos con procesos pesados

Notapor Alin26 » 2010-06-08 18:20 @805

Hola, quisiera saber si alguien podría ayudarme sobre un tema: los filósofos comensales, pero con procesos pesados en Linux, es decir, utilizando fork() y no hilos ya que esos son procesos ligeros. Quisiera que al menos me dieran una idea, una explicación o algo así, con eso me ayudarían mucho.
Gracias.
Alin26
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2010-06-08 18:12 @800

Publicidad

Re: Problema de filósofos con procesos pesados

Notapor explorer » 2010-06-08 18:46 @823

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

Solo una aclaración para quien no conozca el problema:

El problema de los filósofos cenando es un problema clásico de las ciencias de la computación propuesto por Edsger Dijkstra para representar el problema de la sincronización de procesos en un sistema operativo. Cabe aclarar que la interpretación está basada en pensadores chinos, quienes comían con dos palillos, donde es más lógico que se necesite el del comensal que se siente al lado para poder comer.

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

Re: Problema de filósofos con procesos pesados

Notapor Alin26 » 2010-06-08 20:16 @886

Hola, gracias, ¡je! Sí, algo así, son cinco filósofos que tienen que comer espagueti que es muy resbaloso y necesitan dos tenedores o palillos para comerlo. Digamos que tengo el programa de los filósofos para Java pero me lo pidieron así con procesos pesados en Linux C, y francamente, no sé me ocurre nada, tan solo así con una idea me conformo.

Gracias.
Alin26
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2010-06-08 18:12 @800

Re: Problema de filósofos con procesos pesados

Notapor explorer » 2010-06-09 03:46 @198

Supongamos que los procesos hacen la imitación de los comensales. Hay una serie de recursos limitados, que son los tenedores, y son menos que el número de comensales. Cuando un proceso necesita "comer", necesita dos de esos recursos, que estén libres.

Necesitas acordar la forma de paso de información entre los procesos. Puede ser con System V o con ficheros, pero debes decidirlo. Y además, si usas ficheros, debes tener en cuenta las situaciones de carrera si dos procesos intentan escribir a los ficheros a la vez.

Luego, viene la forma en la que se deben comportar los procesos: durante cuánto tiempo seguido máximo pueden comer (cortesía), durante cuánto tiempo máximo (saciar), cuánto tiempo deben esperar si no hay recursos libres (paciencia), cuánto tiempo pueden esperar sin sentir la necesidad de comer (espera), cuánto tiempo pueden esperar sin comer (hambre), qué debe ocurrir si un proceso está a punto de morir de hambre: ¿hay prioridades, hay colas de procesos, qué debe pasar con los que llevan mucho tiempo esperando? La forma de repartir los recursos: ¿los comensales se abalanzan contra los recursos y el más rápido se hace con ellos? ¿qué es lo que pasa cuando uno deja de comer y libera los recursos: los deja simplemente o le avisa al siguiente comensal de que puede entrar a comer?

En la página de Wikipedia y otros sitios tienes comentadas diferentes estrategias. Naturalmente, puedes no adoptar ninguna estrategia de reparto de recursos, y solo confiar en el comportamiento de los propios procesos (las variables comentadas antes).

La forma de hacerlo en Linux, mediante fork(2), puede ser simplemente lanzando los procesos en segundo plano, desde el shell, agregando un '&' al final. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. #!/bin/bash
  2. for i in {1..5}
  3. do
  4.         comensal $i &
  5. done
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Y así tienes arrancados los 5 procesos. Son todos el mismo proceso (en este ejemplo, en otros casos puedes simular comportamientos distintos), y a cada uno le pasas un número para que el propio proceso sepa quién es (puede no ser relevante, pero si quieres imprimir en pantalla lo que está pasando, te interesa saber qué proceso hace qué).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema de filósofos con procesos pesados

Notapor salva » 2010-06-09 15:48 @700

explorer escribiste:Necesitas acordar la forma de paso de información entre los procesos. Puede ser con System V o con ficheros, pero debes decidirlo. Y además, si usas ficheros, debes tener en cuenta las situaciones de carrera si dos procesos intentan escribir a los ficheros a la vez.

Una forma fácil en Perl (¡y obvia!) es usando ficheros en disco y la función flock(). Ni siquiera se necesita escribir en los ficheros, con flockearlos llega.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680


Volver a Programación en general

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

cron