lunes, 30 de enero de 2012

Semana 1

Esta primer semana estibe trabajando en el equipo de Lenguajes de Programación, a mí en particular me ha tocado realizar código en python para el problema de los filósofos.
Como muchos de nosotros sabemos este problema trata de 5 filósofos que viven en una casa , donde hay una mesa preparada para ellos. Básicamente la vida de cada filosofo consiste en pensar y comer, y después de años de haber estado pensando, todos los filósofos están de acuerdo en que la única comida que contribuye a su fuerza mental son los espaguetis. Como los espaguetis están muy resbalosos, cada filosofo ocupa dos tenedores para comer espaguetis.

Es fácil de imaginarlo: en una mesa redonda hay un gran plato para servir espaguetis, cinco platos, uno para cada filosofo y cinco tenedores. Cuando un filosofo quiere comer se dirige a su sitio asignado en la mesa y utilizando los dos tenedores situados a su lado izquierdo y derecho, come algunos espaguetis.
El problema consiste en u algoritmo que satisfaga la exclusión mutua, evitando el interbloqueo y la inanición.

Si no te es familiar por la clase de Sistemas Operativos probablemente este video te ayude:

En mi caso utilice semáforos para resolver el problema, en donde cada filosofo toma n tenedor primero el de la izquierda y luego el de la derecha. Una vez que el filosofo acaba de comer vuelve a colocar los dos tenedores en la mesa.

Para hacer esto primero fue necesario saber como se hacen los hilos en python, los semáforos, y locks, más bien fue una tarea de recordar el semestre pasado algunas cosas que hicimos en Sistemas adaptativos al simular un cruce de semáforos y la simulación del virus.

Se crea un hilo de la siguiente manera:


#!/usr/bin/python

import threading

class hilo(threading.Thread):
def __init__(self, num):
threading.Thread.__init__(self)
self.num = num

def run(self):
print "Soy el hilo", self.num

print "Soy el hilo principal"

for i in range(0, 10):
t = hilo(i)
t.start()
t.join()


Debes notar que es importante incluir la librería threading.

Bastante sencillo en python, espero tener la oportunidad de mostrar algunos lenguajes más.

Ahora el código que implemente para la cena de los filósofos, cree la clase Filosofo que toma de parámetro el numero de filosofo y los tenedores.
La clase filosofo tiene las funciones de come, piensa, obtiene tenedor izquierdo, obtiene tenedor derecho, libera tenedor izquierdo y libera tenedor derecho.

#!/usr/bin/python                                                                                                                                                     

import random
import threading
import time

class Filosofo(threading.Thread):
def __init__(self, num, tenedor):
threading.Thread.__init__(self)
self.tenedor = tenedor
self.num = num
self.temp = self.num + 1 % 5

def come(self):
print "El filosofo "+str(self.num)+" come"

def piensa(self):
print "El filosofo "+str(self.num)+" piensa"

def obtieneTenIzq(self):
print "El filosofo "+str(self.num)+" obtiene tenedor izquierdo"
print "obtiene el tenedor "+str(self.num)
self.tenedor[self.num].acquire()

def obtieneTenDer(self):
print "El filosofo "+str(self.num)+" obtiene tenedor derecho"
self.tenedor[self.temp].acquire()

def liberaTenDer(self):
print "El filosofo "+str(self.num)+" libera tenedor derecho"
self.tenedor[self.temp].release()

def liberaTenIzq(self):
print "El filosofo "+str(self.num)+" libera tenedor izquierdo"
self.tenedor[self.num].release()


def run(self):
while(True):
self.piensa()
self.obtieneTenIzq()
self.obtieneTenDer()
self.come()
self.liberaTenDer()
self.liberaTenIzq()

Nfilosofos = 5

tenedor = [1,1,1,1,1]

for i in range(0, 4):
tenedor[i] = threading.BoundedSemaphore(1)

for i in range(0, 4):
t = Filosofo(i, tenedor)
t.start()
time.sleep(0.5)



Referencias
Conceptos hilos
Hilos en python

2 comentarios:

  1. Bien. Desde la semana que viene todo esto irá directamente en el Wiki y aquí tendrás ligas para lo que pusiste en el Wiki junto con una breve explicación sobre qué en realidad hiciste para la sección de Wiki mencionada. Para esta primera semana, te pongo cinco en ambos clase y lab por tus avances.

    ResponderEliminar
  2. Hola que buen programa, me puedes explicar la parte de arriba

    ResponderEliminar