Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Otros Temas » Programación en general » Problema de filósofos con procesos pesados Responder al tema
Nuevo tema


Página 1 de 1  [ 5 mensajes ] 
 
Nota 2010-06-08 18:20 @805

Perlero Nuevo
Registrado: 2010-06-08 18:12 @800
Mensajes: 2
Problema de filósofos con procesos pesados
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.


Nota 2010-06-08 18:46 @823
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10270
Re: Problema de filósofos con procesos pesados
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


Nota 2010-06-08 20:16 @886

Perlero Nuevo
Registrado: 2010-06-08 18:12 @800
Mensajes: 2
Re: Problema de filósofos con procesos pesados
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.


Nota 2010-06-09 03:46 @198
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10270
Re: Problema de filósofos con procesos pesados
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:
Syntax: [ Download ] [ Hide ]
Using bash Syntax Highlighting
  1. #!/bin/bash
  2. for i in {1..5}
  3. do
  4.         comensal $i &
  5. done

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


Nota 2010-06-09 15:48 @700
Avatar de Usuario
Perlero Frecuente
Registrado: 2008-01-03 15:19 @680
Mensajes: 175
Re: Problema de filósofos con procesos pesados
explorer escribió:
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.


Responder al tema  [ 5 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO